diff --git a/config.yaml b/config.yaml
index 3b910aa..fa0ec4d 100644
--- a/config.yaml
+++ b/config.yaml
@@ -1,6 +1,6 @@
 packages:
 - googleapis:
-    version: 0.3.1
+    version: 0.4.0
     author: Dart Team <misc@dartlang.org>
     homepage: http://www.dartlang.org/googleapis/
     readme: resources/README.md
@@ -35,6 +35,7 @@
     - dfareporting:v1.3  # https://developers.google.com/doubleclick-advertisers/reporting/
     - doubleclickbidmanager:v1  # https://developers.google.com/bid-manager/
     - doubleclicksearch:v2  # https://developers.google.com/doubleclick-search/
+    - fitness:v1  # https://developers.google.com/fitness/
     - freebase:v1  # https://developers.google.com/freebase/
     - fusiontables:v1  # https://developers.google.com/fusiontables/
     - games:v1  # https://developers.google.com/games/services/
@@ -55,6 +56,7 @@
     - reseller:v1  # https://developers.google.com/admin-sdk/reseller/
     - siteVerification:v1  # https://developers.google.com/site-verification/
     - storage:v1  # https://developers.google.com/storage/
+    - tagmanager:v1  # https://developers.google.com/tag-manager/
     - tasks:v1  # https://developers.google.com/google-apps/tasks/
     - translate:v2  # https://developers.google.com/translate/
     - urlshortener:v1  # https://developers.google.com/url-shortener/
@@ -64,7 +66,7 @@
     - youtubeAnalytics:v1  # https://developers.google.com/youtube/analytics/
 
 - googleapis_beta:
-    version: 0.4.0
+    version: 0.5.0
     author: Dart Team <misc@dartlang.org>
     homepage: http://www.dartlang.org/googleapis/
     readme: resources/README.md
@@ -73,12 +75,15 @@
     apis:
     - autoscaler:v1beta2  # https://developers.google.com/compute/docs/autoscaler/ (Limited Preview)
     - cloudmonitoring:v2beta1  # https://developers.google.com/cloud-monitoring/
+    - container:v1beta1  #
     - datastore:v1beta2  # https://developers.google.com/datastore/
     - dns:v1beta1  # https://developers.google.com/cloud-dns/
     - genomics:v1beta  # https://developers.google.com/genomics/
+    - genomics:v1beta2  # https://developers.google.com/genomics/
     - manager:v1beta2  # https://developers.google.com/deployment-manager/
     - pubsub:v1beta1  # https://developers.google.com/pubsub/ (Limited Preview)
-    - replicapool:v1beta1  # https://developers.google.com/compute/docs/replica-pool/ (Limited Preview)
+    - replicapool:v1beta2  # https://cloud.google.com/compute/docs/instance-groups/manager/
+    - replicapoolupdater:v1beta1  # https://cloud.google.com/compute/docs/instance-groups/manager/
     - resourceviews:v1beta1  # https://cloud.google.com/compute/docs/instance-groups/ (Limited Preview)
     - resourceviews:v1beta2  # https://cloud.google.com/compute/docs/instance-groups/
     - sqladmin:v1beta3  # https://developers.google.com/cloud-sql/docs/admin-api/
@@ -111,6 +116,7 @@
 - prediction:v1.4  # v1.6 included
 - prediction:v1.5  # v1.6 included
 - reseller:v1sandbox  # v1 included
+- replicapool:v1beta1  # Deprecated
 - spectrum:v1explorer  # Not included, https://developers.google.com/spectrum/
 - sqladmin:v1beta1  # v1beta3 included
 - storage:v1beta1  # v1 included
diff --git a/discovery/googleapis/adexchangebuyer__v1.3.json b/discovery/googleapis/adexchangebuyer__v1.3.json
index a4d9037..198e767 100644
--- a/discovery/googleapis/adexchangebuyer__v1.3.json
+++ b/discovery/googleapis/adexchangebuyer__v1.3.json
@@ -15,7 +15,7 @@
     "description": "Accesses your bidding-account information, submits creatives for validation, finds available direct deals, and retrieves performance reports.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/ad-exchange/buyer-rest",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/IVGyzh-ksfiNeReN3JTCPs1PtOY\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/bOoBgOb8TcnyMQXYMKjYeQ3PEwA\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/doubleclick-16.gif",
         "x32": "https://www.google.com/images/icons/product/doubleclick-32.gif"
@@ -593,7 +593,7 @@
             }
         }
     },
-    "revision": "20141015",
+    "revision": "20141101",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
@@ -640,10 +640,20 @@
                     "description": "Resource type.",
                     "type": "string"
                 },
+                "maximumActiveCreatives": {
+                    "description": "The maximum number of active creatives that an account can have, where a creative is active if it was inserted or bid with in the last 30 days. Please contact your technical account manager if you need to change this.",
+                    "format": "int32",
+                    "type": "integer"
+                },
                 "maximumTotalQps": {
                     "description": "The sum of all bidderLocation.maximumQps values cannot exceed this. Please contact your technical account manager if you need to change this.",
                     "format": "int32",
                     "type": "integer"
+                },
+                "numberActiveCreatives": {
+                    "description": "The number of creatives that this account inserted or bid with in the last 30 days.",
+                    "format": "int32",
+                    "type": "integer"
                 }
             },
             "type": "object"
diff --git a/discovery/googleapis/adexchangeseller__v1.1.json b/discovery/googleapis/adexchangeseller__v1.1.json
index b588cd9..9694e68 100644
--- a/discovery/googleapis/adexchangeseller__v1.1.json
+++ b/discovery/googleapis/adexchangeseller__v1.1.json
@@ -18,7 +18,7 @@
     "description": "Gives Ad Exchange seller users access to their inventory and the ability to generate reports",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/ad-exchange/seller-rest/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/pG7SyB4d-epWWOL8eWUN-FhkzoQ\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/mmEaGLK6HAOEl5JgWUw9stJQGXA\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/doubleclick-16.gif",
         "x32": "https://www.google.com/images/icons/product/doubleclick-32.gif"
@@ -704,7 +704,7 @@
             }
         }
     },
-    "revision": "20141008",
+    "revision": "20141030",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
diff --git a/discovery/googleapis/adexchangeseller__v2.0.json b/discovery/googleapis/adexchangeseller__v2.0.json
index 9d900c2..a94dbe1 100644
--- a/discovery/googleapis/adexchangeseller__v2.0.json
+++ b/discovery/googleapis/adexchangeseller__v2.0.json
@@ -18,7 +18,7 @@
     "description": "Gives Ad Exchange seller users access to their inventory and the ability to generate reports",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/ad-exchange/seller-rest/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/y3xsyVARAcA3R18GJnQOPEEVDu8\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/5LwLU1nuzhp9EJgikbsfRyrIEGY\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/doubleclick-16.gif",
         "x32": "https://www.google.com/images/icons/product/doubleclick-32.gif"
@@ -654,7 +654,7 @@
             }
         }
     },
-    "revision": "20141008",
+    "revision": "20141030",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
diff --git a/discovery/googleapis/admin__reports_v1.json b/discovery/googleapis/admin__reports_v1.json
index 9e3e25e..e0ee8ac 100644
--- a/discovery/googleapis/admin__reports_v1.json
+++ b/discovery/googleapis/admin__reports_v1.json
@@ -18,7 +18,7 @@
     "description": "Allows the administrators of Google Apps customers to fetch reports about the usage, collaboration, security and risk for their users.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/admin-sdk/reports/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/kIY0aqiDkZ24yMy88cSNtVuMbHk\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/xAcUzwpzdxH1jAgqcRwqHIGqlSk\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -290,7 +290,7 @@
                         "parameters": {
                             "description": "Represents the application name, parameter name pairs to fetch in csv as app_name1:param_name1, app_name2:param_name2.",
                             "location": "query",
-                            "pattern": "(((accounts)|(gmail)|(calendar)|(docs)|(gplus)):.+,)*(((accounts)|(gmail)|(calendar)|(docs)|(gplus)):.+)",
+                            "pattern": "(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)):.+,)*(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)):.+)",
                             "type": "string"
                         }
                     },
@@ -331,7 +331,7 @@
                         "filters": {
                             "description": "Represents the set of filters including parameter operator value.",
                             "location": "query",
-                            "pattern": "(((accounts)|(gmail)|(calendar)|(docs)|(gplus)):.+[<,<=,==,>=,>,!=].+,)*(((accounts)|(gmail)|(calendar)|(docs)|(gplus)):.+[<,<=,==,>=,>,!=].+)",
+                            "pattern": "(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)):.+[<,<=,==,>=,>,!=].+,)*(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)):.+[<,<=,==,>=,>,!=].+)",
                             "type": "string"
                         },
                         "maxResults": {
@@ -349,7 +349,7 @@
                         "parameters": {
                             "description": "Represents the application name, parameter name pairs to fetch in csv as app_name1:param_name1, app_name2:param_name2.",
                             "location": "query",
-                            "pattern": "(((accounts)|(gmail)|(calendar)|(docs)|(gplus)):.+,)*(((accounts)|(gmail)|(calendar)|(docs)|(gplus)):.+)",
+                            "pattern": "(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)):.+,)*(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)):.+)",
                             "type": "string"
                         },
                         "userKey": {
@@ -370,7 +370,7 @@
             }
         }
     },
-    "revision": "20140912",
+    "revision": "20141024",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Activities": {
diff --git a/discovery/googleapis/adsense__v1.4.json b/discovery/googleapis/adsense__v1.4.json
index 98c4eaf..c6202f6 100644
--- a/discovery/googleapis/adsense__v1.4.json
+++ b/discovery/googleapis/adsense__v1.4.json
@@ -18,7 +18,7 @@
     "description": "Gives AdSense publishers access to their inventory and the ability to generate reports",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/adsense/management/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/2P4t9CDV6wkmyWLEzXAW3YJ1RVQ\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/GcHEAAHTHkKoMQMBzrbqtOPCibk\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/adsense-16.png",
         "x32": "https://www.google.com/images/icons/product/adsense-32.png"
@@ -1624,7 +1624,7 @@
             }
         }
     },
-    "revision": "20141008",
+    "revision": "20141021",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
diff --git a/discovery/googleapis/adsensehost__v4.1.json b/discovery/googleapis/adsensehost__v4.1.json
index 42434b1..7465eb8 100644
--- a/discovery/googleapis/adsensehost__v4.1.json
+++ b/discovery/googleapis/adsensehost__v4.1.json
@@ -15,7 +15,7 @@
     "description": "Gives AdSense Hosts access to report generation, ad code generation, and publisher management capabilities.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/adsense/host/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/FAggQAR0qX2kpZA6IFcY3hA9tFs\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/sdlXB-H8IqsjazmLz06MBeApA5k\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/adsense-16.png",
         "x32": "https://www.google.com/images/icons/product/adsense-32.png"
@@ -1072,7 +1072,7 @@
             }
         }
     },
-    "revision": "20141008",
+    "revision": "20141020",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
diff --git a/discovery/googleapis/analytics__v3.json b/discovery/googleapis/analytics__v3.json
index 7deb025..10a2fda 100644
--- a/discovery/googleapis/analytics__v3.json
+++ b/discovery/googleapis/analytics__v3.json
@@ -26,7 +26,7 @@
     "description": "View and manage your Google Analytics data",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/analytics/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/2bkMw2SQFkDhH1qCY3r_qXKtIUI\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/FwAb1zUse29CS-ZohAWilr35TBA\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/analytics-16.png",
         "x32": "https://www.google.com/images/icons/product/analytics-32.png"
@@ -3297,7 +3297,7 @@
             }
         }
     },
-    "revision": "20141013",
+    "revision": "20141015",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
@@ -4558,7 +4558,7 @@
                     "type": "string"
                 },
                 "field": {
-                    "description": "Field to filter. Possible values:  \n- Reserved  \n- UNUSED,   \n- Content and Traffic  \n- PAGE_REQUEST_URI, \n- PAGE_HOSTNAME, \n- PAGE_TITLE, \n- REFERRAL, \n- COST_DATA_URI (Campaign target URL), \n- HIT_TYPE, \n- INTERNAL_SEARCH_TERM, \n- INTERNAL_SEARCH_TYPE, \n- SOURCE_PROPERTY_TRACKING_ID,   \n- Campaign or AdGroup  \n- CAMPAIGN_SOURCE, \n- CAMPAIGN_MEDIUM, \n- CAMPAIGN_NAME, \n- CAMPAIGN_AD_GROUP, \n- CAMPAIGN_TERM, \n- CAMPAIGN_CONTENT, \n- CAMPAIGN_CODE, \n- CAMPAIGN_REFERRAL_PATH,   \n- E-Commerce  \n- TRANSACTION_COUNTRY, \n- TRANSACTION_REGION, \n- TRANSACTION_CITY, \n- TRANSACTION_AFFILIATION (Store or order location), \n- ITEM_NAME, \n- ITEM_CODE, \n- ITEM_VARIATION, \n- TRANSACTION_ID, \n- TRANSACTION_CURRENCY_CODE, \n- PRODUCT_ACTION_TYPE,   \n- Audience/Users  \n- BROWSER, \n- BROWSER_VERSION, \n- BROWSER_SIZE, \n- PLATFORM, \n- PLATFORM_VERSION, \n- LANGUAGE, \n- SCREEN_RESOLUTION, \n- SCREEN_COLORS, \n- JAVA_ENABLED, \n- FLASH_VERSION, \n- GEO_SPEED (Connection speed), \n- VISITOR_TYPE, \n- GEO_ORGANIZATION (ISP organization), \n- GEO_DOMAIN, \n- GEO_IP_ADDRESS, \n- GEO_IP_VERSION,   \n- Location  \n- GEO_COUNTRY, \n- GEO_REGION, \n- GEO_CITY,   \n- Event  \n- EVENT_CATEGORY, \n- EVENT_ACTION, \n- EVENT_LABEL,   \n- Other  \n- CUSTOM_FIELD_1, \n- CUSTOM_FIELD_2, \n- USER_DEFINED_VALUE,   \n- Application  \n- APP_ID, \n- APP_INSTALLER_ID, \n- APP_NAME, \n- APP_VERSION, \n- SCREEN, \n- IS_APP, \n- IS_FATAL_EXCEPTION, \n- EXCEPTION_DESCRIPTION,   \n- Mobile device  \n- IS_MOBILE, \n- IS_TABLET, \n- MOBILE_HAS_QWERTY_KEYBOARD, \n- MOBILE_HAS_NFC_SUPPORT, \n- MOBILE_HAS_CELLULAR_RADIO, \n- MOBILE_HAS_WIFI_SUPPORT, \n- MOBILE_BRAND_NAME, \n- MOBILE_MODEL_NAME, \n- MOBILE_MARKETING_NAME, \n- MOBILE_POINTING_METHOD,   \n- Social  \n- SOCIAL_NETWORK, \n- SOCIAL_ACTION, \n- SOCIAL_ACTION_TARGET,",
+                    "description": "Field to filter. Possible values:  \n- Reserved  \n- UNUSED,   \n- Content and Traffic  \n- PAGE_REQUEST_URI, \n- PAGE_HOSTNAME, \n- PAGE_TITLE, \n- REFERRAL, \n- COST_DATA_URI (Campaign target URL), \n- HIT_TYPE, \n- INTERNAL_SEARCH_TERM, \n- INTERNAL_SEARCH_TYPE, \n- SOURCE_PROPERTY_TRACKING_ID,   \n- Campaign or AdGroup  \n- CAMPAIGN_SOURCE, \n- CAMPAIGN_MEDIUM, \n- CAMPAIGN_NAME, \n- CAMPAIGN_AD_GROUP, \n- CAMPAIGN_TERM, \n- CAMPAIGN_CONTENT, \n- CAMPAIGN_CODE, \n- CAMPAIGN_REFERRAL_PATH,   \n- E-Commerce  \n- TRANSACTION_COUNTRY, \n- TRANSACTION_REGION, \n- TRANSACTION_CITY, \n- TRANSACTION_AFFILIATION (Store or order location), \n- ITEM_NAME, \n- ITEM_CODE, \n- ITEM_VARIATION, \n- TRANSACTION_ID, \n- TRANSACTION_CURRENCY_CODE, \n- PRODUCT_ACTION_TYPE,   \n- Audience/Users  \n- BROWSER, \n- BROWSER_VERSION, \n- BROWSER_SIZE, \n- PLATFORM, \n- PLATFORM_VERSION, \n- LANGUAGE, \n- SCREEN_RESOLUTION, \n- SCREEN_COLORS, \n- JAVA_ENABLED, \n- FLASH_VERSION, \n- GEO_SPEED (Connection speed), \n- VISITOR_TYPE, \n- GEO_ORGANIZATION (ISP organization), \n- GEO_DOMAIN, \n- GEO_IP_ADDRESS, \n- GEO_IP_VERSION,   \n- Location  \n- GEO_COUNTRY, \n- GEO_REGION, \n- GEO_CITY,   \n- Event  \n- EVENT_CATEGORY, \n- EVENT_ACTION, \n- EVENT_LABEL,   \n- Other  \n- CUSTOM_FIELD_1, \n- CUSTOM_FIELD_2, \n- USER_DEFINED_VALUE,   \n- Application  \n- APP_ID, \n- APP_INSTALLER_ID, \n- APP_NAME, \n- APP_VERSION, \n- SCREEN, \n- IS_APP, \n- IS_FATAL_EXCEPTION, \n- EXCEPTION_DESCRIPTION,   \n- Mobile device  \n- IS_MOBILE, \n- IS_TABLET, \n- DEVICE_CATEGORY, \n- MOBILE_HAS_QWERTY_KEYBOARD, \n- MOBILE_HAS_NFC_SUPPORT, \n- MOBILE_HAS_CELLULAR_RADIO, \n- MOBILE_HAS_WIFI_SUPPORT, \n- MOBILE_BRAND_NAME, \n- MOBILE_MODEL_NAME, \n- MOBILE_MARKETING_NAME, \n- MOBILE_POINTING_METHOD,   \n- Social  \n- SOCIAL_NETWORK, \n- SOCIAL_ACTION, \n- SOCIAL_ACTION_TARGET,",
                     "type": "string"
                 },
                 "kind": {
@@ -5357,7 +5357,7 @@
                     "type": "boolean"
                 },
                 "enhancedECommerceTracking": {
-                    "description": "Indicates whether enhanced ecommerce tracking is enabled for this view (profile).",
+                    "description": "Indicates whether enhanced ecommerce tracking is enabled for this view (profile). This property can only be enabled if ecommerce tracking is enabled.",
                     "type": "boolean"
                 },
                 "excludeQueryParameters": {
diff --git a/discovery/googleapis/androidpublisher__v2.json b/discovery/googleapis/androidpublisher__v2.json
index e430d9e..d486b74 100644
--- a/discovery/googleapis/androidpublisher__v2.json
+++ b/discovery/googleapis/androidpublisher__v2.json
@@ -15,7 +15,7 @@
     "description": "Lets Android application developers access their Google Play accounts.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/android-publisher",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/rvEzY_KAgBOlUM1lQqukKQLrl6Y\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/DrMyiBR493_IBfZvqlikbYuZEB0\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/android-16.png",
         "x32": "https://www.google.com/images/icons/product/android-32.png"
@@ -2154,7 +2154,7 @@
             }
         }
     },
-    "revision": "20140813",
+    "revision": "20141022",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Apk": {
@@ -2395,7 +2395,7 @@
                     "type": "string"
                 },
                 "trialPeriod": {
-                    "description": "Trial duration (if any) of the subscription, defined as ISO 8601. i.e. \"P10D\" means an initial period of 10 days during which ownership is granted prior to any payment. Acceptable values are between \"P7D\" and \"P999D\". Seasonal subscriptions cannot have a trial period.",
+                    "description": "Trial period, specified in ISO 8601 format. Acceptable values are anything between \"P7D\" (seven days) and \"P999D\" (999 days). Seasonal subscriptions cannot have a trial period.",
                     "type": "string"
                 }
             },
diff --git a/discovery/googleapis/appstate__v1.json b/discovery/googleapis/appstate__v1.json
index 37c22ce..3cb9f37 100644
--- a/discovery/googleapis/appstate__v1.json
+++ b/discovery/googleapis/appstate__v1.json
@@ -15,7 +15,7 @@
     "description": "The Google App State API.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/games/services/web/api/states",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/H7n11Hwm4onxnROpOMZpkrylJj8\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/EUqLM_4JQb7uMBIy3bBvtnIlrUo\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -211,7 +211,7 @@
             }
         }
     },
-    "revision": "20141005",
+    "revision": "20141028",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "GetResponse": {
diff --git a/discovery/googleapis/bigquery__v2.json b/discovery/googleapis/bigquery__v2.json
index e1983d5..0d9367b 100644
--- a/discovery/googleapis/bigquery__v2.json
+++ b/discovery/googleapis/bigquery__v2.json
@@ -29,7 +29,7 @@
     "description": "A data platform for customers to create, manage, share and query data.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/bigquery/docs/overview",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/m8edoc2ZO3cKKMgqC6cKOK0fVjI\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/NNNGrlMYqSi04hOh0Khd5qX9Gcs\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/search-16.gif",
         "x32": "https://www.google.com/images/icons/product/search-32.gif"
@@ -889,7 +889,7 @@
             }
         }
     },
-    "revision": "20141016",
+    "revision": "20141030",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Dataset": {
@@ -1301,7 +1301,7 @@
                     "type": "string"
                 },
                 "sourceUris": {
-                    "description": "[Required] The fully-qualified URIs that point to your data on Google Cloud Storage.",
+                    "description": "[Required] The fully-qualified URIs that point to your data in Google Cloud Storage. Wildcard names are only supported when they appear at the end of the URI.",
                     "items": {
                         "type": "string"
                     },
@@ -1468,7 +1468,7 @@
                             "bigquery.jobs.getQueryResults"
                         ]
                     },
-                    "description": "[Required] ID of the job.",
+                    "description": "[Required] The ID of the job. The ID must contain only letters (a-z, A-Z), numbers (0-9), underscores (_), or dashes (-). The maximum length is 1,024 characters.",
                     "type": "string"
                 },
                 "projectId": {
@@ -1790,12 +1790,12 @@
                     "type": "string"
                 },
                 "numBytes": {
-                    "description": "[Output-only] The size of the table in bytes.",
+                    "description": "[Output-only] The size of the table in bytes. This property is unavailable for tables that are actively receiving streaming inserts.",
                     "format": "int64",
                     "type": "string"
                 },
                 "numRows": {
-                    "description": "[Output-only] The number of rows of data in this table.",
+                    "description": "[Output-only] The number of rows of data in this table. This property is unavailable for tables that are actively receiving streaming inserts.",
                     "format": "uint64",
                     "type": "string"
                 },
@@ -1927,7 +1927,7 @@
             "id": "TableFieldSchema",
             "properties": {
                 "description": {
-                    "description": "[Optional] The field description.",
+                    "description": "[Optional] The field description. The maximum length is 16K characters.",
                     "type": "string"
                 },
                 "fields": {
@@ -1942,7 +1942,7 @@
                     "type": "string"
                 },
                 "name": {
-                    "description": "[Required] The field name.",
+                    "description": "[Required] The field name. The name must contain only letters (a-z, A-Z), numbers (0-9), or underscores (_), and must start with a letter or underscore. The maximum length is 128 characters.",
                     "type": "string"
                 },
                 "type": {
diff --git a/discovery/googleapis/calendar__v3.json b/discovery/googleapis/calendar__v3.json
index 401acfd..3ae7d2b 100644
--- a/discovery/googleapis/calendar__v3.json
+++ b/discovery/googleapis/calendar__v3.json
@@ -17,7 +17,7 @@
     "description": "Lets you manipulate events and other calendar data.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/google-apps/calendar/firstapp",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/kfT5pFWI9VnCK4GzEz7hf4hMjew\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/ChhI5_AHHLTSiJjr6RSC6c9iFo0\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/calendar-16.png",
         "x32": "http://www.google.com/images/icons/product/calendar-32.png"
@@ -1535,7 +1535,7 @@
             }
         }
     },
-    "revision": "20140930",
+    "revision": "20141020",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Acl": {
@@ -2236,6 +2236,16 @@
             },
             "type": "object"
         },
+        "EventAttachment": {
+            "id": "EventAttachment",
+            "properties": {
+                "title": {
+                    "description": "File name.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
         "EventAttendee": {
             "id": "EventAttendee",
             "properties": {
diff --git a/discovery/googleapis/civicinfo__us_v1.json b/discovery/googleapis/civicinfo__us_v1.json
index 8e47f5d..747e02a 100644
--- a/discovery/googleapis/civicinfo__us_v1.json
+++ b/discovery/googleapis/civicinfo__us_v1.json
@@ -6,7 +6,7 @@
     "description": "An API for accessing civic information.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/civic-information",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/3_1avFY-y0DJdFQjOVCYJj_vesI\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/ixlTlCZ6lprJQCHG1SmuBjDXiaM\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -162,7 +162,7 @@
             }
         }
     },
-    "revision": "20141013",
+    "revision": "20141023",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AdministrationRegion": {
@@ -644,15 +644,15 @@
             "type": "object"
         },
         "PollingLocation": {
-            "description": "A location where a voter can vote. This may be an early vote site or an election day voting location.",
+            "description": "A location where a voter can vote. This may be an early vote site, an election day voting location, or a drop off location for a completed ballot.",
             "id": "PollingLocation",
             "properties": {
                 "address": {
                     "$ref": "SimpleAddressType",
-                    "description": "The address of the location"
+                    "description": "The address of the location."
                 },
                 "endDate": {
-                    "description": "The last date that this early vote site may be used. This field is not populated for polling locations.",
+                    "description": "The last date that this early vote site or drop off location may be used. This field is not populated for polling locations.",
                     "type": "string"
                 },
                 "id": {
@@ -660,11 +660,11 @@
                     "type": "string"
                 },
                 "name": {
-                    "description": "The name of the early vote site. This field is not populated for polling locations.",
+                    "description": "The name of the early vote site or drop off location. This field is not populated for polling locations.",
                     "type": "string"
                 },
                 "notes": {
-                    "description": "Notes about this location (e.g. accessibility ramp or entrance to use)",
+                    "description": "Notes about this location (e.g. accessibility ramp or entrance to use).",
                     "type": "string"
                 },
                 "pollingHours": {
@@ -679,11 +679,11 @@
                     "type": "array"
                 },
                 "startDate": {
-                    "description": "The first date that this early vote site may be used. This field is not populated for polling locations.",
+                    "description": "The first date that this early vote site or drop off location may be used. This field is not populated for polling locations.",
                     "type": "string"
                 },
                 "voterServices": {
-                    "description": "The services provided by this early vote site. This field is not populated for polling locations.",
+                    "description": "The services provided by this early vote site or drop off location. This field is not populated for polling locations.",
                     "type": "string"
                 }
             },
@@ -810,14 +810,21 @@
             "id": "VoterInfoResponse",
             "properties": {
                 "contests": {
-                    "description": "Contests that will appear on the voter's ballot",
+                    "description": "Contests that will appear on the voter's ballot.",
                     "items": {
                         "$ref": "Contest"
                     },
                     "type": "array"
                 },
+                "dropOffLocations": {
+                    "description": "Locations where a voter is eligible to drop off a completed ballot. The voter must have received and completed a ballot prior to arriving at the location. The location may not have ballots available on the premises. These locations could be open on or before election day as indicated in the pollingHours field.",
+                    "items": {
+                        "$ref": "PollingLocation"
+                    },
+                    "type": "array"
+                },
                 "earlyVoteSites": {
-                    "description": "Locations where the voter is eligible to vote early, prior to election day",
+                    "description": "Locations where the voter is eligible to vote early, prior to election day.",
                     "items": {
                         "$ref": "PollingLocation"
                     },
@@ -837,7 +844,7 @@
                     "description": "The normalized version of the requested address"
                 },
                 "pollingLocations": {
-                    "description": "Locations where the voter is eligible to vote on election day. For states with mail-in voting only, these locations will be nearby drop box locations. Drop box locations are free to the voter and may be used instead of placing the ballot in the mail.",
+                    "description": "Locations where the voter is eligible to vote on election day.",
                     "items": {
                         "$ref": "PollingLocation"
                     },
diff --git a/discovery/googleapis/civicinfo__v1.json b/discovery/googleapis/civicinfo__v1.json
index bc07c38..a96fafb 100644
--- a/discovery/googleapis/civicinfo__v1.json
+++ b/discovery/googleapis/civicinfo__v1.json
@@ -6,7 +6,7 @@
     "description": "An API for accessing civic information.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/civic-information",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/nDJOs8qjoTOd8SXCjEAMl2yYVcQ\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/m-jfWpr9P6EusWc0QHxRJ5ZUj0Y\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -162,7 +162,7 @@
             }
         }
     },
-    "revision": "20141013",
+    "revision": "20141023",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AdministrationRegion": {
@@ -644,15 +644,15 @@
             "type": "object"
         },
         "PollingLocation": {
-            "description": "A location where a voter can vote. This may be an early vote site or an election day voting location.",
+            "description": "A location where a voter can vote. This may be an early vote site, an election day voting location, or a drop off location for a completed ballot.",
             "id": "PollingLocation",
             "properties": {
                 "address": {
                     "$ref": "SimpleAddressType",
-                    "description": "The address of the location"
+                    "description": "The address of the location."
                 },
                 "endDate": {
-                    "description": "The last date that this early vote site may be used. This field is not populated for polling locations.",
+                    "description": "The last date that this early vote site or drop off location may be used. This field is not populated for polling locations.",
                     "type": "string"
                 },
                 "id": {
@@ -660,11 +660,11 @@
                     "type": "string"
                 },
                 "name": {
-                    "description": "The name of the early vote site. This field is not populated for polling locations.",
+                    "description": "The name of the early vote site or drop off location. This field is not populated for polling locations.",
                     "type": "string"
                 },
                 "notes": {
-                    "description": "Notes about this location (e.g. accessibility ramp or entrance to use)",
+                    "description": "Notes about this location (e.g. accessibility ramp or entrance to use).",
                     "type": "string"
                 },
                 "pollingHours": {
@@ -679,11 +679,11 @@
                     "type": "array"
                 },
                 "startDate": {
-                    "description": "The first date that this early vote site may be used. This field is not populated for polling locations.",
+                    "description": "The first date that this early vote site or drop off location may be used. This field is not populated for polling locations.",
                     "type": "string"
                 },
                 "voterServices": {
-                    "description": "The services provided by this early vote site. This field is not populated for polling locations.",
+                    "description": "The services provided by this early vote site or drop off location. This field is not populated for polling locations.",
                     "type": "string"
                 }
             },
@@ -810,14 +810,21 @@
             "id": "VoterInfoResponse",
             "properties": {
                 "contests": {
-                    "description": "Contests that will appear on the voter's ballot",
+                    "description": "Contests that will appear on the voter's ballot.",
                     "items": {
                         "$ref": "Contest"
                     },
                     "type": "array"
                 },
+                "dropOffLocations": {
+                    "description": "Locations where a voter is eligible to drop off a completed ballot. The voter must have received and completed a ballot prior to arriving at the location. The location may not have ballots available on the premises. These locations could be open on or before election day as indicated in the pollingHours field.",
+                    "items": {
+                        "$ref": "PollingLocation"
+                    },
+                    "type": "array"
+                },
                 "earlyVoteSites": {
-                    "description": "Locations where the voter is eligible to vote early, prior to election day",
+                    "description": "Locations where the voter is eligible to vote early, prior to election day.",
                     "items": {
                         "$ref": "PollingLocation"
                     },
@@ -837,7 +844,7 @@
                     "description": "The normalized version of the requested address"
                 },
                 "pollingLocations": {
-                    "description": "Locations where the voter is eligible to vote on election day. For states with mail-in voting only, these locations will be nearby drop box locations. Drop box locations are free to the voter and may be used instead of placing the ballot in the mail.",
+                    "description": "Locations where the voter is eligible to vote on election day.",
                     "items": {
                         "$ref": "PollingLocation"
                     },
diff --git a/discovery/googleapis/civicinfo__v2.json b/discovery/googleapis/civicinfo__v2.json
index 776c5a9..96da214 100644
--- a/discovery/googleapis/civicinfo__v2.json
+++ b/discovery/googleapis/civicinfo__v2.json
@@ -6,7 +6,7 @@
     "description": "An API for accessing civic information.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/civic-information",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/5v6NdAJI6D9bRU7oDGpNoBkCKy8\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/EeZdKz92LCL9J1uCQTeAts36EP0\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -301,7 +301,7 @@
             }
         }
     },
-    "revision": "20141013",
+    "revision": "20141023",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AdministrationRegion": {
@@ -797,15 +797,15 @@
             "type": "object"
         },
         "PollingLocation": {
-            "description": "A location where a voter can vote. This may be an early vote site or an election day voting location.",
+            "description": "A location where a voter can vote. This may be an early vote site, an election day voting location, or a drop off location for a completed ballot.",
             "id": "PollingLocation",
             "properties": {
                 "address": {
                     "$ref": "SimpleAddressType",
-                    "description": "The address of the location"
+                    "description": "The address of the location."
                 },
                 "endDate": {
-                    "description": "The last date that this early vote site may be used. This field is not populated for polling locations.",
+                    "description": "The last date that this early vote site or drop off location may be used. This field is not populated for polling locations.",
                     "type": "string"
                 },
                 "id": {
@@ -813,11 +813,11 @@
                     "type": "string"
                 },
                 "name": {
-                    "description": "The name of the early vote site. This field is not populated for polling locations.",
+                    "description": "The name of the early vote site or drop off location. This field is not populated for polling locations.",
                     "type": "string"
                 },
                 "notes": {
-                    "description": "Notes about this location (e.g. accessibility ramp or entrance to use)",
+                    "description": "Notes about this location (e.g. accessibility ramp or entrance to use).",
                     "type": "string"
                 },
                 "pollingHours": {
@@ -832,11 +832,11 @@
                     "type": "array"
                 },
                 "startDate": {
-                    "description": "The first date that this early vote site may be used. This field is not populated for polling locations.",
+                    "description": "The first date that this early vote site or drop off location may be used. This field is not populated for polling locations.",
                     "type": "string"
                 },
                 "voterServices": {
-                    "description": "The services provided by this early vote site. This field is not populated for polling locations.",
+                    "description": "The services provided by this early vote site or drop off location. This field is not populated for polling locations.",
                     "type": "string"
                 }
             },
@@ -963,14 +963,21 @@
             "id": "VoterInfoResponse",
             "properties": {
                 "contests": {
-                    "description": "Contests that will appear on the voter's ballot",
+                    "description": "Contests that will appear on the voter's ballot.",
                     "items": {
                         "$ref": "Contest"
                     },
                     "type": "array"
                 },
+                "dropOffLocations": {
+                    "description": "Locations where a voter is eligible to drop off a completed ballot. The voter must have received and completed a ballot prior to arriving at the location. The location may not have ballots available on the premises. These locations could be open on or before election day as indicated in the pollingHours field.",
+                    "items": {
+                        "$ref": "PollingLocation"
+                    },
+                    "type": "array"
+                },
                 "earlyVoteSites": {
-                    "description": "Locations where the voter is eligible to vote early, prior to election day",
+                    "description": "Locations where the voter is eligible to vote early, prior to election day.",
                     "items": {
                         "$ref": "PollingLocation"
                     },
@@ -997,7 +1004,7 @@
                     "type": "array"
                 },
                 "pollingLocations": {
-                    "description": "Locations where the voter is eligible to vote on election day. For states with mail-in voting only, these locations will be nearby drop box locations. Drop box locations are free to the voter and may be used instead of placing the ballot in the mail.",
+                    "description": "Locations where the voter is eligible to vote on election day.",
                     "items": {
                         "$ref": "PollingLocation"
                     },
diff --git a/discovery/googleapis/compute__v1.json b/discovery/googleapis/compute__v1.json
index 4dd1a7d..fb3dd03 100644
--- a/discovery/googleapis/compute__v1.json
+++ b/discovery/googleapis/compute__v1.json
@@ -26,7 +26,7 @@
     "description": "API for the Google Compute Engine service.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/compute/docs/reference/latest/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/GzT3QuznikNBeUl_jZ6mEw13u7c\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/qp3DHGvWPpREzEdWk7WwxnpgC9w\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/compute_engine-16.png",
         "x32": "https://www.google.com/images/icons/product/compute_engine-32.png"
@@ -5289,7 +5289,7 @@
             }
         }
     },
-    "revision": "20141008",
+    "revision": "20141014",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AccessConfig": {
@@ -5548,6 +5548,17 @@
                     "$ref": "AttachedDiskInitializeParams",
                     "description": "Initialization parameters."
                 },
+                "interface": {
+                    "enum": [
+                        "NVME",
+                        "SCSI"
+                    ],
+                    "enumDescriptions": [
+                        "",
+                        ""
+                    ],
+                    "type": "string"
+                },
                 "kind": {
                     "default": "compute#attachedDisk",
                     "description": "Type of the resource.",
@@ -6296,12 +6307,6 @@
                     "type": "string"
                 },
                 "network": {
-                    "annotations": {
-                        "required": [
-                            "compute.firewalls.insert",
-                            "compute.firewalls.patch"
-                        ]
-                    },
                     "description": "URL of the network to which this firewall is applied; provided by the client when the firewall is created.",
                     "type": "string"
                 },
@@ -8116,6 +8121,7 @@
                         "IN_USE_ADDRESSES",
                         "KERNELS",
                         "KERNELS_TOTAL_GB",
+                        "LOCAL_SSD_TOTAL_GB",
                         "NETWORKS",
                         "OPERATIONS",
                         "ROUTES",
@@ -8151,6 +8157,7 @@
                         "",
                         "",
                         "",
+                        "",
                         ""
                     ],
                     "type": "string"
diff --git a/discovery/googleapis/content__v2.json b/discovery/googleapis/content__v2.json
index 9537aba..dd3c5f3 100644
--- a/discovery/googleapis/content__v2.json
+++ b/discovery/googleapis/content__v2.json
@@ -15,7 +15,7 @@
     "description": "Manage product items, inventory, and Merchant Center accounts for Google Shopping.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/shopping-content/v2/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/7JtHRkerzIVCOlD80Ybyn4STFoY\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/EfYKK5AfY2_HGyMN7vFlDQDdSbY\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -476,11 +476,23 @@
                         "merchantId"
                     ],
                     "parameters": {
+                        "maxResults": {
+                            "description": "The maximum number of products to return in the response, used for paging.",
+                            "format": "uint32",
+                            "location": "query",
+                            "type": "integer"
+                        },
                         "merchantId": {
+                            "description": "The ID of the managing account.",
                             "format": "uint64",
                             "location": "path",
                             "required": true,
                             "type": "string"
+                        },
+                        "pageToken": {
+                            "description": "The token returned by the previous request.",
+                            "location": "query",
+                            "type": "string"
                         }
                     },
                     "path": "{merchantId}/datafeeds",
@@ -613,11 +625,23 @@
                         "merchantId"
                     ],
                     "parameters": {
+                        "maxResults": {
+                            "description": "The maximum number of products to return in the response, used for paging.",
+                            "format": "uint32",
+                            "location": "query",
+                            "type": "integer"
+                        },
                         "merchantId": {
+                            "description": "The ID of the managing account.",
                             "format": "uint64",
                             "location": "path",
                             "required": true,
                             "type": "string"
+                        },
+                        "pageToken": {
+                            "description": "The token returned by the previous request.",
+                            "location": "query",
+                            "type": "string"
                         }
                     },
                     "path": "{merchantId}/datafeedstatuses",
@@ -933,10 +957,11 @@
             }
         }
     },
-    "revision": "20141010",
+    "revision": "20141028",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
+            "description": "Account data.",
             "id": "Account",
             "properties": {
                 "adultContent": {
@@ -1122,6 +1147,7 @@
             "id": "AccountsCustomBatchRequest",
             "properties": {
                 "entries": {
+                    "description": "The request entries to be processed in the batch.",
                     "items": {
                         "$ref": "AccountsCustomBatchRequestEntry"
                     },
@@ -1154,7 +1180,6 @@
                     "type": "string"
                 },
                 "method": {
-                    "description": "The method (get, insert, update, or delete).",
                     "type": "string"
                 }
             },
@@ -1164,6 +1189,7 @@
             "id": "AccountsCustomBatchResponse",
             "properties": {
                 "entries": {
+                    "description": "The result of the execution of the batch requests.",
                     "items": {
                         "$ref": "AccountsCustomBatchResponseEntry"
                     },
@@ -1211,6 +1237,7 @@
                     "type": "string"
                 },
                 "nextPageToken": {
+                    "description": "The token for the retrieval of the next page of accounts.",
                     "type": "string"
                 },
                 "resources": {
@@ -1226,6 +1253,7 @@
             "id": "AccountstatusesCustomBatchRequest",
             "properties": {
                 "entries": {
+                    "description": "The request entries to be processed in the batch.",
                     "items": {
                         "$ref": "AccountstatusesCustomBatchRequestEntry"
                     },
@@ -1264,6 +1292,7 @@
             "id": "AccountstatusesCustomBatchResponse",
             "properties": {
                 "entries": {
+                    "description": "The result of the execution of the batch requests.",
                     "items": {
                         "$ref": "AccountstatusesCustomBatchResponseEntry"
                     },
@@ -1306,6 +1335,7 @@
                     "type": "string"
                 },
                 "nextPageToken": {
+                    "description": "The token for the retrieval of the next page of account statuses.",
                     "type": "string"
                 },
                 "resources": {
@@ -1318,6 +1348,7 @@
             "type": "object"
         },
         "Datafeed": {
+            "description": "Datafeed data.",
             "id": "Datafeed",
             "properties": {
                 "attributeLanguage": {
@@ -1461,6 +1492,7 @@
             "type": "object"
         },
         "DatafeedStatus": {
+            "description": "The status of a datafeed, i.e., the result of the last retrieval of the datafeed computed asynchronously when the feed processing is finished.",
             "id": "DatafeedStatus",
             "properties": {
                 "datafeedId": {
@@ -1555,6 +1587,7 @@
             "id": "DatafeedsCustomBatchRequest",
             "properties": {
                 "entries": {
+                    "description": "The request entries to be processed in the batch.",
                     "items": {
                         "$ref": "DatafeedsCustomBatchRequestEntry"
                     },
@@ -1587,7 +1620,6 @@
                     "type": "string"
                 },
                 "method": {
-                    "description": "The method (get, insert, update, or delete).",
                     "type": "string"
                 }
             },
@@ -1597,6 +1629,7 @@
             "id": "DatafeedsCustomBatchResponse",
             "properties": {
                 "entries": {
+                    "description": "The result of the execution of the batch requests.",
                     "items": {
                         "$ref": "DatafeedsCustomBatchResponseEntry"
                     },
@@ -1638,6 +1671,10 @@
                     "description": "Identifies what kind of resource this is. Value: the fixed string \"content#datafeedsListResponse\".",
                     "type": "string"
                 },
+                "nextPageToken": {
+                    "description": "The token for the retrieval of the next page of datafeeds.",
+                    "type": "string"
+                },
                 "resources": {
                     "items": {
                         "$ref": "Datafeed"
@@ -1651,6 +1688,7 @@
             "id": "DatafeedstatusesCustomBatchRequest",
             "properties": {
                 "entries": {
+                    "description": "The request entries to be processed in the batch.",
                     "items": {
                         "$ref": "DatafeedstatusesCustomBatchRequestEntry"
                     },
@@ -1679,7 +1717,6 @@
                     "type": "string"
                 },
                 "method": {
-                    "description": "The method (get).",
                     "type": "string"
                 }
             },
@@ -1689,6 +1726,7 @@
             "id": "DatafeedstatusesCustomBatchResponse",
             "properties": {
                 "entries": {
+                    "description": "The result of the execution of the batch requests.",
                     "items": {
                         "$ref": "DatafeedstatusesCustomBatchResponseEntry"
                     },
@@ -1730,6 +1768,10 @@
                     "description": "Identifies what kind of resource this is. Value: the fixed string \"content#datafeedstatusesListResponse\".",
                     "type": "string"
                 },
+                "nextPageToken": {
+                    "description": "The token for the retrieval of the next page of datafeed statuses.",
+                    "type": "string"
+                },
                 "resources": {
                     "items": {
                         "$ref": "DatafeedStatus"
@@ -1817,6 +1859,7 @@
             "id": "InventoryCustomBatchRequest",
             "properties": {
                 "entries": {
+                    "description": "The request entries to be processed in the batch.",
                     "items": {
                         "$ref": "InventoryCustomBatchRequestEntry"
                     },
@@ -1858,6 +1901,7 @@
             "id": "InventoryCustomBatchResponse",
             "properties": {
                 "entries": {
+                    "description": "The result of the execution of the batch requests.",
                     "items": {
                         "$ref": "InventoryCustomBatchResponseEntry"
                     },
@@ -2542,6 +2586,7 @@
             "id": "ProductsCustomBatchRequest",
             "properties": {
                 "entries": {
+                    "description": "The request entries to be processed in the batch.",
                     "items": {
                         "$ref": "ProductsCustomBatchRequestEntry"
                     },
@@ -2565,7 +2610,6 @@
                     "type": "string"
                 },
                 "method": {
-                    "description": "The method (get, insert or delete).",
                     "type": "string"
                 },
                 "product": {
@@ -2583,6 +2627,7 @@
             "id": "ProductsCustomBatchResponse",
             "properties": {
                 "entries": {
+                    "description": "The result of the execution of the batch requests.",
                     "items": {
                         "$ref": "ProductsCustomBatchResponseEntry"
                     },
@@ -2630,6 +2675,7 @@
                     "type": "string"
                 },
                 "nextPageToken": {
+                    "description": "The token for the retrieval of the next page of products.",
                     "type": "string"
                 },
                 "resources": {
@@ -2645,6 +2691,7 @@
             "id": "ProductstatusesCustomBatchRequest",
             "properties": {
                 "entries": {
+                    "description": "The request entries to be processed in the batch.",
                     "items": {
                         "$ref": "ProductstatusesCustomBatchRequestEntry"
                     },
@@ -2668,7 +2715,6 @@
                     "type": "string"
                 },
                 "method": {
-                    "description": "The method (get).",
                     "type": "string"
                 },
                 "productId": {
@@ -2682,6 +2728,7 @@
             "id": "ProductstatusesCustomBatchResponse",
             "properties": {
                 "entries": {
+                    "description": "The result of the execution of the batch requests.",
                     "items": {
                         "$ref": "ProductstatusesCustomBatchResponseEntry"
                     },
@@ -2729,6 +2776,7 @@
                     "type": "string"
                 },
                 "nextPageToken": {
+                    "description": "The token for the retrieval of the next page of products statuses.",
                     "type": "string"
                 },
                 "resources": {
diff --git a/discovery/googleapis/doubleclicksearch__v2.json b/discovery/googleapis/doubleclicksearch__v2.json
index 12c24bf..18dc283 100644
--- a/discovery/googleapis/doubleclicksearch__v2.json
+++ b/discovery/googleapis/doubleclicksearch__v2.json
@@ -14,7 +14,7 @@
     "description": "Report and modify your advertising data in DoubleClick Search (for example, campaigns, ad groups, keywords, and conversions).",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/doubleclick-search/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/g6aF7RN46wc-YTVBZvZs-zRkgLA\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/olnNoM2FZr43Cdq75yAMe9UNVWM\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -430,7 +430,7 @@
             }
         }
     },
-    "revision": "20140923",
+    "revision": "20141021",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Availability": {
@@ -611,7 +611,7 @@
                     "type": "string"
                 },
                 "state": {
-                    "description": "The state of the conversion, that is, either ACTIVE or DELETED.",
+                    "description": "The state of the conversion, that is, either ACTIVE or REMOVED. Note: state DELETED is deprecated.",
                     "type": "string"
                 },
                 "type": {
@@ -746,7 +746,7 @@
                     "type": "string"
                 },
                 "customMetricName": {
-                    "description": "Reports on the provided custom metric. The report must be scoped to an advertiser or lower, and the custom metric must already be set up in DoubleClick Search. The custom metric name, which appears in DoubleClick Search, is case sensitive.",
+                    "description": "Name of a custom metric to include in the report. The report must be scoped to an advertiser or lower, and the custom metric must already be set up in DoubleClick Search. The custom metric name, which appears in DoubleClick Search, is case sensitive.",
                     "type": "string"
                 },
                 "endDate": {
diff --git a/discovery/googleapis/drive__v2.json b/discovery/googleapis/drive__v2.json
index acb3b32..310e79d 100644
--- a/discovery/googleapis/drive__v2.json
+++ b/discovery/googleapis/drive__v2.json
@@ -32,7 +32,7 @@
     "description": "The API to interact with Drive.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/drive/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/8O8WdcLF8cXKLqmsbUzfLValrE8\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/8QMIKXQb4gLNnKU_aYZeGRdMS08\"",
     "icons": {
         "x16": "https://ssl.gstatic.com/docs/doclist/images/drive_icon_16.png",
         "x32": "https://ssl.gstatic.com/docs/doclist/images/drive_icon_32.png"
@@ -585,8 +585,7 @@
                     },
                     "scopes": [
                         "https://www.googleapis.com/auth/drive",
-                        "https://www.googleapis.com/auth/drive.file",
-                        "https://www.googleapis.com/auth/drive.readonly"
+                        "https://www.googleapis.com/auth/drive.file"
                     ]
                 },
                 "list": {
@@ -826,6 +825,12 @@
                         "fileId"
                     ],
                     "parameters": {
+                        "acknowledgeAbuse": {
+                            "default": "false",
+                            "description": "Whether the user is acknowledging the risk of downloading known malware or other abusive files.",
+                            "location": "query",
+                            "type": "boolean"
+                        },
                         "fileId": {
                             "description": "The ID for the file in question.",
                             "location": "path",
@@ -864,6 +869,7 @@
                         "https://www.googleapis.com/auth/drive.metadata.readonly",
                         "https://www.googleapis.com/auth/drive.readonly"
                     ],
+                    "supportsMediaDownload": true,
                     "supportsSubscription": true
                 },
                 "insert": {
@@ -1315,6 +1321,12 @@
                         "fileId"
                     ],
                     "parameters": {
+                        "acknowledgeAbuse": {
+                            "default": "false",
+                            "description": "Whether the user is acknowledging the risk of downloading known malware or other abusive files.",
+                            "location": "query",
+                            "type": "boolean"
+                        },
                         "fileId": {
                             "description": "The ID for the file in question.",
                             "location": "path",
@@ -1357,6 +1369,7 @@
                         "https://www.googleapis.com/auth/drive.metadata.readonly",
                         "https://www.googleapis.com/auth/drive.readonly"
                     ],
+                    "supportsMediaDownload": true,
                     "supportsSubscription": true
                 }
             }
@@ -2429,7 +2442,7 @@
             }
         }
     },
-    "revision": "20141009",
+    "revision": "20141024",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "About": {
diff --git a/discovery/googleapis/fitness__v1.json b/discovery/googleapis/fitness__v1.json
new file mode 100644
index 0000000..cf1f771
--- /dev/null
+++ b/discovery/googleapis/fitness__v1.json
@@ -0,0 +1,1031 @@
+{
+    "auth": {
+        "oauth2": {
+            "scopes": {
+                "https://www.googleapis.com/auth/fitness.activity.read": {
+                    "description": "View your activity information in Google Fit"
+                },
+                "https://www.googleapis.com/auth/fitness.activity.write": {
+                    "description": "View and store your activity information in Google Fit"
+                },
+                "https://www.googleapis.com/auth/fitness.body.read": {
+                    "description": "View body sensor information in Google Fit"
+                },
+                "https://www.googleapis.com/auth/fitness.body.write": {
+                    "description": "View and store body sensor data in Google Fit"
+                },
+                "https://www.googleapis.com/auth/fitness.location.read": {
+                    "description": "View your stored location data in Google Fit"
+                },
+                "https://www.googleapis.com/auth/fitness.location.write": {
+                    "description": "View and store your location data in Google Fit"
+                }
+            }
+        }
+    },
+    "basePath": "/fitness/v1/users/",
+    "baseUrl": "https://www.googleapis.com/fitness/v1/users/",
+    "batchPath": "batch",
+    "description": "Google Fit API",
+    "discoveryVersion": "v1",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/TfpgqPaBHwKM6ZXQvQNWyFJhjHY\"",
+    "icons": {
+        "x16": "http://www.google.com/images/icons/product/search-16.gif",
+        "x32": "http://www.google.com/images/icons/product/search-32.gif"
+    },
+    "id": "fitness:v1",
+    "kind": "discovery#restDescription",
+    "name": "fitness",
+    "ownerDomain": "google.com",
+    "ownerName": "Google",
+    "parameters": {
+        "alt": {
+            "default": "json",
+            "description": "Data format for the response.",
+            "enum": [
+                "json"
+            ],
+            "enumDescriptions": [
+                "Responses with Content-Type of application/json"
+            ],
+            "location": "query",
+            "type": "string"
+        },
+        "fields": {
+            "description": "Selector specifying which fields to include in a partial response.",
+            "location": "query",
+            "type": "string"
+        },
+        "key": {
+            "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+            "location": "query",
+            "type": "string"
+        },
+        "oauth_token": {
+            "description": "OAuth 2.0 token for the current user.",
+            "location": "query",
+            "type": "string"
+        },
+        "prettyPrint": {
+            "default": "true",
+            "description": "Returns response with indentations and line breaks.",
+            "location": "query",
+            "type": "boolean"
+        },
+        "quotaUser": {
+            "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.",
+            "location": "query",
+            "type": "string"
+        },
+        "userIp": {
+            "description": "IP address of the site where the request originates. Use this if you want to enforce per-user limits.",
+            "location": "query",
+            "type": "string"
+        }
+    },
+    "protocol": "rest",
+    "resources": {
+        "users": {
+            "resources": {
+                "dataSources": {
+                    "methods": {
+                        "create": {
+                            "description": "Creates a new data source that is unique across all data sources belonging to this user. The data stream ID field can be omitted and will be generated by the server with the correct format. The data stream ID is an ordered combination of some fields from the data source. In addition to the data source fields reflected into the data source ID, the developer project number that is authenticated when creating the data source is included. This developer project number is obfuscated when read by any other developer reading public data types.",
+                            "httpMethod": "POST",
+                            "id": "fitness.users.dataSources.create",
+                            "parameterOrder": [
+                                "userId"
+                            ],
+                            "parameters": {
+                                "userId": {
+                                    "description": "Create the data source for the person identified. Use me to indicate the authenticated user. Only me is supported at this time.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "{userId}/dataSources",
+                            "request": {
+                                "$ref": "DataSource"
+                            },
+                            "response": {
+                                "$ref": "DataSource"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/fitness.activity.write",
+                                "https://www.googleapis.com/auth/fitness.body.write",
+                                "https://www.googleapis.com/auth/fitness.location.write"
+                            ]
+                        },
+                        "get": {
+                            "description": "Returns a data source identified by a data stream ID.",
+                            "httpMethod": "GET",
+                            "id": "fitness.users.dataSources.get",
+                            "parameterOrder": [
+                                "userId",
+                                "dataSourceId"
+                            ],
+                            "parameters": {
+                                "dataSourceId": {
+                                    "description": "The data stream ID of the data source to retrieve.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                },
+                                "userId": {
+                                    "description": "Retrieve a data source for the person identified. Use me to indicate the authenticated user. Only me is supported at this time.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "{userId}/dataSources/{dataSourceId}",
+                            "response": {
+                                "$ref": "DataSource"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/fitness.activity.read",
+                                "https://www.googleapis.com/auth/fitness.activity.write",
+                                "https://www.googleapis.com/auth/fitness.body.read",
+                                "https://www.googleapis.com/auth/fitness.body.write",
+                                "https://www.googleapis.com/auth/fitness.location.read",
+                                "https://www.googleapis.com/auth/fitness.location.write"
+                            ]
+                        },
+                        "list": {
+                            "description": "Lists all data sources that are visible to the developer, using the OAuth scopes provided. The list is not exhaustive: the user may have private data sources that are only visible to other developers or calls using other scopes.",
+                            "httpMethod": "GET",
+                            "id": "fitness.users.dataSources.list",
+                            "parameterOrder": [
+                                "userId"
+                            ],
+                            "parameters": {
+                                "dataTypeName": {
+                                    "description": "The names of data types to include in the list. If not specified, all data sources will be returned.",
+                                    "location": "query",
+                                    "repeated": true,
+                                    "type": "string"
+                                },
+                                "userId": {
+                                    "description": "List data sources for the person identified. Use me to indicate the authenticated user. Only me is supported at this time.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "{userId}/dataSources",
+                            "response": {
+                                "$ref": "ListDataSourcesResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/fitness.activity.read",
+                                "https://www.googleapis.com/auth/fitness.activity.write",
+                                "https://www.googleapis.com/auth/fitness.body.read",
+                                "https://www.googleapis.com/auth/fitness.body.write",
+                                "https://www.googleapis.com/auth/fitness.location.read",
+                                "https://www.googleapis.com/auth/fitness.location.write"
+                            ]
+                        },
+                        "patch": {
+                            "description": "Updates a given data source. It is an error to modify the data source's data stream ID, data type, type, stream name or device information apart from the device version. Changing these fields would require a new unique data stream ID and separate data source.\n\nData sources are identified by their data stream ID. This method supports patch semantics.",
+                            "httpMethod": "PATCH",
+                            "id": "fitness.users.dataSources.patch",
+                            "parameterOrder": [
+                                "userId",
+                                "dataSourceId"
+                            ],
+                            "parameters": {
+                                "dataSourceId": {
+                                    "description": "The data stream ID of the data source to update.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                },
+                                "userId": {
+                                    "description": "Update the data source for the person identified. Use me to indicate the authenticated user. Only me is supported at this time.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "{userId}/dataSources/{dataSourceId}",
+                            "request": {
+                                "$ref": "DataSource"
+                            },
+                            "response": {
+                                "$ref": "DataSource"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/fitness.activity.write",
+                                "https://www.googleapis.com/auth/fitness.body.write",
+                                "https://www.googleapis.com/auth/fitness.location.write"
+                            ]
+                        },
+                        "update": {
+                            "description": "Updates a given data source. It is an error to modify the data source's data stream ID, data type, type, stream name or device information apart from the device version. Changing these fields would require a new unique data stream ID and separate data source.\n\nData sources are identified by their data stream ID.",
+                            "httpMethod": "PUT",
+                            "id": "fitness.users.dataSources.update",
+                            "parameterOrder": [
+                                "userId",
+                                "dataSourceId"
+                            ],
+                            "parameters": {
+                                "dataSourceId": {
+                                    "description": "The data stream ID of the data source to update.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                },
+                                "userId": {
+                                    "description": "Update the data source for the person identified. Use me to indicate the authenticated user. Only me is supported at this time.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "{userId}/dataSources/{dataSourceId}",
+                            "request": {
+                                "$ref": "DataSource"
+                            },
+                            "response": {
+                                "$ref": "DataSource"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/fitness.activity.write",
+                                "https://www.googleapis.com/auth/fitness.body.write",
+                                "https://www.googleapis.com/auth/fitness.location.write"
+                            ]
+                        }
+                    },
+                    "resources": {
+                        "datasets": {
+                            "methods": {
+                                "delete": {
+                                    "description": "Performs an inclusive delete of all data points whose start and end times have any overlap with the time range specified by the dataset ID. For most data types, the entire data point will be deleted. For data types where the time span represents a consistent value (such as com.google.activity.segment), and a data point straddles either end point of the dataset, only the overlapping portion of the data point will be deleted.",
+                                    "httpMethod": "DELETE",
+                                    "id": "fitness.users.dataSources.datasets.delete",
+                                    "parameterOrder": [
+                                        "userId",
+                                        "dataSourceId",
+                                        "datasetId"
+                                    ],
+                                    "parameters": {
+                                        "currentTimeMillis": {
+                                            "description": "The client's current time in milliseconds since epoch.",
+                                            "format": "int64",
+                                            "location": "query",
+                                            "type": "string"
+                                        },
+                                        "dataSourceId": {
+                                            "description": "The data stream ID of the data source that created the dataset.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "datasetId": {
+                                            "description": "Dataset identifier that is a composite of the minimum data point start time and maximum data point end time represented as nanoseconds from the epoch. The ID is formatted like: \"startTime-endTime\" where startTime and endTime are 64 bit integers.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "modifiedTimeMillis": {
+                                            "description": "When the operation was performed on the client.",
+                                            "format": "int64",
+                                            "location": "query",
+                                            "type": "string"
+                                        },
+                                        "userId": {
+                                            "description": "Delete a dataset for the person identified. Use me to indicate the authenticated user. Only me is supported at this time.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "{userId}/dataSources/{dataSourceId}/datasets/{datasetId}",
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/fitness.activity.write",
+                                        "https://www.googleapis.com/auth/fitness.body.write",
+                                        "https://www.googleapis.com/auth/fitness.location.write"
+                                    ]
+                                },
+                                "get": {
+                                    "description": "Returns a dataset containing all data points whose start and end times overlap with the specified range of the dataset minimum start time and maximum end time. Specifically, any data point whose start time is less than or equal to the dataset end time and whose end time is greater than or equal to the dataset start time.",
+                                    "httpMethod": "GET",
+                                    "id": "fitness.users.dataSources.datasets.get",
+                                    "parameterOrder": [
+                                        "userId",
+                                        "dataSourceId",
+                                        "datasetId"
+                                    ],
+                                    "parameters": {
+                                        "dataSourceId": {
+                                            "description": "The data stream ID of the data source that created the dataset.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "datasetId": {
+                                            "description": "Dataset identifier that is a composite of the minimum data point start time and maximum data point end time represented as nanoseconds from the epoch. The ID is formatted like: \"startTime-endTime\" where startTime and endTime are 64 bit integers.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "userId": {
+                                            "description": "Retrieve a dataset for the person identified. Use me to indicate the authenticated user. Only me is supported at this time.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "{userId}/dataSources/{dataSourceId}/datasets/{datasetId}",
+                                    "response": {
+                                        "$ref": "Dataset"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/fitness.activity.read",
+                                        "https://www.googleapis.com/auth/fitness.activity.write",
+                                        "https://www.googleapis.com/auth/fitness.body.read",
+                                        "https://www.googleapis.com/auth/fitness.body.write",
+                                        "https://www.googleapis.com/auth/fitness.location.read",
+                                        "https://www.googleapis.com/auth/fitness.location.write"
+                                    ]
+                                },
+                                "patch": {
+                                    "description": "Adds data points to a dataset. The dataset need not be previously created. All points within the given dataset will be returned with subsquent calls to retrieve this dataset. Data points can belong to more than one dataset. This method does not use patch semantics.",
+                                    "httpMethod": "PATCH",
+                                    "id": "fitness.users.dataSources.datasets.patch",
+                                    "parameterOrder": [
+                                        "userId",
+                                        "dataSourceId",
+                                        "datasetId"
+                                    ],
+                                    "parameters": {
+                                        "currentTimeMillis": {
+                                            "description": "The client's current time in milliseconds since epoch. Note that the minStartTimeNs and maxEndTimeNs properties in the request body are in nanoseconds instead of milliseconds.",
+                                            "format": "int64",
+                                            "location": "query",
+                                            "type": "string"
+                                        },
+                                        "dataSourceId": {
+                                            "description": "The data stream ID of the data source that created the dataset.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "datasetId": {
+                                            "description": "Dataset identifier that is a composite of the minimum data point start time and maximum data point end time represented as nanoseconds from the epoch. The ID is formatted like: \"startTime-endTime\" where startTime and endTime are 64 bit integers.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "userId": {
+                                            "description": "Patch a dataset for the person identified. Use me to indicate the authenticated user. Only me is supported at this time.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "{userId}/dataSources/{dataSourceId}/datasets/{datasetId}",
+                                    "request": {
+                                        "$ref": "Dataset"
+                                    },
+                                    "response": {
+                                        "$ref": "Dataset"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/fitness.activity.write",
+                                        "https://www.googleapis.com/auth/fitness.body.write",
+                                        "https://www.googleapis.com/auth/fitness.location.write"
+                                    ]
+                                }
+                            }
+                        }
+                    }
+                },
+                "sessions": {
+                    "methods": {
+                        "delete": {
+                            "description": "Deletes a session specified by the given session ID.",
+                            "httpMethod": "DELETE",
+                            "id": "fitness.users.sessions.delete",
+                            "parameterOrder": [
+                                "userId",
+                                "sessionId"
+                            ],
+                            "parameters": {
+                                "currentTimeMillis": {
+                                    "description": "The client's current time in milliseconds since epoch.",
+                                    "format": "int64",
+                                    "location": "query",
+                                    "type": "string"
+                                },
+                                "sessionId": {
+                                    "description": "The ID of the session to be deleted.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                },
+                                "userId": {
+                                    "description": "Delete a session for the person identified. Use me to indicate the authenticated user. Only me is supported at this time.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "{userId}/sessions/{sessionId}",
+                            "scopes": [
+                                "https://www.googleapis.com/auth/fitness.activity.write"
+                            ]
+                        },
+                        "list": {
+                            "description": "Lists sessions previously created.",
+                            "httpMethod": "GET",
+                            "id": "fitness.users.sessions.list",
+                            "parameterOrder": [
+                                "userId"
+                            ],
+                            "parameters": {
+                                "endTime": {
+                                    "description": "An RFC3339 timestamp. Only sessions ending between the start and end times will be included in the response.",
+                                    "location": "query",
+                                    "type": "string"
+                                },
+                                "includeDeleted": {
+                                    "description": "If true, deleted sessions will be returned. When set to true, sessions returned in this response will only have an ID and will not have any other fields.",
+                                    "location": "query",
+                                    "type": "boolean"
+                                },
+                                "pageToken": {
+                                    "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response.",
+                                    "location": "query",
+                                    "type": "string"
+                                },
+                                "startTime": {
+                                    "description": "An RFC3339 timestamp. Only sessions ending between the start and end times will be included in the response.",
+                                    "location": "query",
+                                    "type": "string"
+                                },
+                                "userId": {
+                                    "description": "List sessions for the person identified. Use me to indicate the authenticated user. Only me is supported at this time.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "{userId}/sessions",
+                            "response": {
+                                "$ref": "ListSessionsResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/fitness.activity.read",
+                                "https://www.googleapis.com/auth/fitness.activity.write",
+                                "https://www.googleapis.com/auth/fitness.body.read",
+                                "https://www.googleapis.com/auth/fitness.body.write",
+                                "https://www.googleapis.com/auth/fitness.location.read",
+                                "https://www.googleapis.com/auth/fitness.location.write"
+                            ]
+                        },
+                        "update": {
+                            "description": "Updates or insert a given session.",
+                            "httpMethod": "PUT",
+                            "id": "fitness.users.sessions.update",
+                            "parameterOrder": [
+                                "userId",
+                                "sessionId"
+                            ],
+                            "parameters": {
+                                "currentTimeMillis": {
+                                    "description": "The client's current time in milliseconds since epoch.",
+                                    "format": "int64",
+                                    "location": "query",
+                                    "type": "string"
+                                },
+                                "sessionId": {
+                                    "description": "The ID of the session to be created.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                },
+                                "userId": {
+                                    "description": "Create sessions for the person identified. Use me to indicate the authenticated user. Only me is supported at this time.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "{userId}/sessions/{sessionId}",
+                            "request": {
+                                "$ref": "Session"
+                            },
+                            "response": {
+                                "$ref": "Session"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/fitness.activity.write"
+                            ]
+                        }
+                    }
+                }
+            }
+        }
+    },
+    "revision": "20141030",
+    "rootUrl": "https://www.googleapis.com/",
+    "schemas": {
+        "Application": {
+            "description": "See: google3/java/com/google/android/apps/heart/platform/api/Application.java",
+            "id": "Application",
+            "properties": {
+                "detailsUrl": {
+                    "description": "An optional URI that can be used to link back to the application.",
+                    "type": "string"
+                },
+                "name": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.create",
+                            "fitness.users.dataSources.update",
+                            "fitness.users.sessions.update"
+                        ]
+                    },
+                    "description": "The name of this application. This is required for REST clients, but we do not enforce uniqueness of this name. It is provided as a matter of convenience for other developers who would like to identify which REST created an Application or Data Source.",
+                    "type": "string"
+                },
+                "packageName": {
+                    "description": "Package name for this application. This is used as a unique identifier when creaed by Android applications, but cannot be specified by REST clients. REST clients will have their developer project number reflected into the Data Source data stream IDs, instead of the packageName.",
+                    "type": "string"
+                },
+                "version": {
+                    "description": "Version of the application. You should update this field whenever the application changes in a way that affects the computation of the data.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "DataPoint": {
+            "description": "Represents a single data point, generated by a particular data source. A data point holds a value for each field, an end timestamp and an optional start time. The exact semantics of each of these attributes are specified in the documentation for the particular data type.\n\nA data point can represent an instantaneous measurement, reading or input observation, as well as averages or aggregates over a time interval. Check the data type documentation to determine which is the case for a particular data type.\n\nData points always contain one value for each field of the data type.",
+            "id": "DataPoint",
+            "properties": {
+                "computationTimeMillis": {
+                    "description": "Used for version checking during transformation; that is, a datapoint can only replace another datapoint that has an older computation time stamp.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "dataTypeName": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.datasets.patch"
+                        ]
+                    },
+                    "description": "The data type defining the format of the values in this data point.",
+                    "type": "string"
+                },
+                "endTimeNanos": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.datasets.patch"
+                        ]
+                    },
+                    "description": "The end time of the interval represented by this data point, in nanoseconds since epoch.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "modifiedTimeMillis": {
+                    "description": "Indicates the last time this data point was modified. Useful only in contexts where we are listing the data changes, rather than representing the current state of the data.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "originDataSourceId": {
+                    "description": "If the data point is contained in a dataset for a derived data source, this field will be populated with the data source stream ID that created the data point originally.",
+                    "type": "string"
+                },
+                "rawTimestampNanos": {
+                    "description": "The raw timestamp from the original SensorEvent.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "startTimeNanos": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.datasets.patch"
+                        ]
+                    },
+                    "description": "The start time of the interval represented by this data point, in nanoseconds since epoch.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "value": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.datasets.patch"
+                        ]
+                    },
+                    "description": "Values of each data type field for the data point. It is expected that each value corresponding to a data type field will occur in the same order that the field is listed with in the data type specified in a data source.\n\nOnly one of integer and floating point fields will be populated, depending on the format enum value within data source's type field.",
+                    "items": {
+                        "$ref": "Value"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "DataSource": {
+            "description": "Definition of a unique source of sensor data. Data sources can expose raw data coming from hardware sensors on local or companion devices. They can also expose derived data, created by transforming or merging other data sources. Multiple data sources can exist for the same data type. Every data point inserted into or read from this service has an associated data source.\n\nThe data source contains enough information to uniquely identify its data, including the hardware device and the application that collected and/or transformed the data. It also holds useful metadata, such as the hardware and application versions, and the device type.\n\nEach data source produces a unique stream of data, with a unique identifier. Not all changes to data source affect the stream identifier, so that data collected by updated versions of the same application/device can still be considered to belong to the same data stream.",
+            "id": "DataSource",
+            "properties": {
+                "application": {
+                    "$ref": "Application",
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.create",
+                            "fitness.users.dataSources.update"
+                        ]
+                    },
+                    "description": "Information about an application which feeds sensor data into the platform."
+                },
+                "dataStreamId": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.update"
+                        ]
+                    },
+                    "description": "A unique identifier for the data stream produced by this data source. The identifier includes:\n\n \n- The physical device's manufacturer, model, and serial number (UID). \n- The application's package name or name. Package name is used when the data source was created by an Android application. The developer project number is used when the data source was created by a REST client. \n- The data source's type. \n- The data source's stream name.  Note that not all attributes of the data source are used as part of the stream identifier. In particular, the version of the hardware/the application isn't used. This allows us to preserve the same stream through version updates. This also means that two DataSource objects may represent the same data stream even if they're not equal.\n\nThe exact format of the data stream ID created by an Android application is: type:dataType.name:application.packageName:device.manufacturer:device.model:device.uid:dataStreamName \n\nThe exact format of the data stream ID created by a REST client is: type:dataType.name:developer project number:device.manufacturer:device.model:device.uid:dataStreamName \n\nWhen any of the optional fields that comprise of the data stream ID are blank, they will be omitted from the data stream ID. The minnimum viable data stream ID would be: type:dataType.name:developer project number\n\nFinally, the developer project number is obfuscated when read by any REST or Android client that did not create the data source. Only the data source creator will see the developer project number in clear and normal form.",
+                    "type": "string"
+                },
+                "dataStreamName": {
+                    "description": "The stream name uniquely identifies this particular data source among other data sources of the same type from the same underlying producer. Setting the stream name is optional, but should be done whenever an application exposes two streams for the same data type, or when a device has two equivalent sensors.",
+                    "type": "string"
+                },
+                "dataType": {
+                    "$ref": "DataType",
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.create",
+                            "fitness.users.dataSources.update"
+                        ]
+                    },
+                    "description": "The data type defines the schema for a stream of data being collected by, inserted into, or queried from the Fitness API."
+                },
+                "device": {
+                    "$ref": "Device",
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.create",
+                            "fitness.users.dataSources.update"
+                        ]
+                    },
+                    "description": "Representation of an integrated device (such as a phone or a wearable) that can hold sensors."
+                },
+                "name": {
+                    "description": "An end-user visible name for this data source.",
+                    "type": "string"
+                },
+                "type": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.create",
+                            "fitness.users.dataSources.update"
+                        ]
+                    },
+                    "description": "A constant describing the type of this data source. Indicates whether this data source produces raw or derived data.",
+                    "enum": [
+                        "derived",
+                        "raw"
+                    ],
+                    "enumDescriptions": [
+                        "",
+                        ""
+                    ],
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "DataType": {
+            "description": "See: google3/java/com/google/android/apps/heart/platform/api/DataType.java",
+            "id": "DataType",
+            "properties": {
+                "field": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.create",
+                            "fitness.users.dataSources.update"
+                        ]
+                    },
+                    "description": "A field represents one dimension of a data type.",
+                    "items": {
+                        "$ref": "DataTypeField"
+                    },
+                    "type": "array"
+                },
+                "name": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.create",
+                            "fitness.users.dataSources.update"
+                        ]
+                    },
+                    "description": "Each data type has a unique, namespaced, name. All data types in the com.google namespace are shared as part of the platform.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "DataTypeField": {
+            "description": "In case of multi-dimensional data (such as an accelerometer with x, y, and z axes) each field represents one dimension. Each data type field has a unique name which identifies it. The field also defines the format of the data (int, float, etc.).\n\nThis message is only instantiated in code and not used for wire comms or stored in any way.",
+            "id": "DataTypeField",
+            "properties": {
+                "format": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.create",
+                            "fitness.users.dataSources.update"
+                        ]
+                    },
+                    "description": "The different supported formats for each field in a data type.",
+                    "enum": [
+                        "floatPoint",
+                        "integer"
+                    ],
+                    "enumDescriptions": [
+                        "",
+                        ""
+                    ],
+                    "type": "string"
+                },
+                "name": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.create",
+                            "fitness.users.dataSources.update"
+                        ]
+                    },
+                    "description": "Defines the name and format of data. Unlike data type names, field names are not namespaced, and only need to be unique within the data type.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "Dataset": {
+            "description": "A dataset represents a projection container for data points. They do not carry any info of their own. Datasets represent a set of data points from a particular data source. A data point can be found in more than one dataset.",
+            "id": "Dataset",
+            "properties": {
+                "dataSourceId": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.datasets.patch"
+                        ]
+                    },
+                    "description": "The data stream ID of the data source that created the points in this dataset.",
+                    "type": "string"
+                },
+                "maxEndTimeNs": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.datasets.patch"
+                        ]
+                    },
+                    "description": "The largest end time of all data points in this possibly partial representation of the dataset. Time is in nanoseconds from epoch. This should also match the first part of the dataset identifier.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "minStartTimeNs": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.datasets.patch"
+                        ]
+                    },
+                    "description": "The smallest start time of all data points in this possibly partial representation of the dataset. Time is in nanoseconds from epoch. This should also match the first part of the dataset identifier.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "point": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.datasets.patch"
+                        ]
+                    },
+                    "description": "A partial list of data points contained in the dataset. This list is considered complete when retrieving a dataset and partial when patching a dataset.",
+                    "items": {
+                        "$ref": "DataPoint"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "Device": {
+            "description": "Representation of an integrated device (such as a phone or a wearable) that can hold sensors. Each sensor is exposed as a data source.\n\nThe main purpose of the device information contained in this class is to identify the hardware of a particular data source. This can be useful in different ways, including:  \n- Distinguishing two similar sensors on different devices (the step counter on two nexus 5 phones, for instance)\n- Display the source of data to the user (by using the device make / model)\n- Treat data differently depending on sensor type (accelerometers on a watch may give different patterns than those on a phone)\n- Build different analysis models for each device/version.",
+            "id": "Device",
+            "properties": {
+                "manufacturer": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.create",
+                            "fitness.users.dataSources.update"
+                        ]
+                    },
+                    "description": "Manufacturer of the product/hardware.",
+                    "type": "string"
+                },
+                "model": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.create",
+                            "fitness.users.dataSources.update"
+                        ]
+                    },
+                    "description": "End-user visible model name for the device.",
+                    "type": "string"
+                },
+                "type": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.create",
+                            "fitness.users.dataSources.update"
+                        ]
+                    },
+                    "description": "A constant representing the type of the device.",
+                    "enum": [
+                        "chestStrap",
+                        "phone",
+                        "scale",
+                        "tablet",
+                        "unknown",
+                        "watch"
+                    ],
+                    "enumDescriptions": [
+                        "",
+                        "",
+                        "",
+                        "",
+                        "",
+                        ""
+                    ],
+                    "type": "string"
+                },
+                "uid": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.create",
+                            "fitness.users.dataSources.update"
+                        ]
+                    },
+                    "description": "The serial number or other unique ID for the hardware. This field is obfuscated when read by any REST or Android client that did not create the data source. Only the data source creator will see the uid field in clear and normal form.",
+                    "type": "string"
+                },
+                "version": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.create",
+                            "fitness.users.dataSources.update"
+                        ]
+                    },
+                    "description": "Version string for the device hardware/software.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "ListDataSourcesResponse": {
+            "id": "ListDataSourcesResponse",
+            "properties": {
+                "dataSource": {
+                    "description": "A previously created data source.",
+                    "items": {
+                        "$ref": "DataSource"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "ListSessionsResponse": {
+            "id": "ListSessionsResponse",
+            "properties": {
+                "deletedSession": {
+                    "description": "If includeDeleted is set to true in the request, this list will contain sessions deleted with original end times that are within the startTime and endTime frame.",
+                    "items": {
+                        "$ref": "Session"
+                    },
+                    "type": "array"
+                },
+                "nextPageToken": {
+                    "description": "The continuation token, which is used to page through large result sets. Provide this value in a subsequent request to return the next page of results.",
+                    "type": "string"
+                },
+                "session": {
+                    "description": "Sessions with an end time that is between startTime and endTime of the request.",
+                    "items": {
+                        "$ref": "Session"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "Session": {
+            "description": "Sessions contain metadata, such as a user-friendly name and time interval information.",
+            "id": "Session",
+            "properties": {
+                "activityType": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.sessions.update"
+                        ]
+                    },
+                    "description": "The type of activity this session represents.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "application": {
+                    "$ref": "Application",
+                    "annotations": {
+                        "required": [
+                            "fitness.users.sessions.update"
+                        ]
+                    },
+                    "description": "The application that created the session."
+                },
+                "description": {
+                    "description": "A description for this session.",
+                    "type": "string"
+                },
+                "endTimeMillis": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.sessions.update"
+                        ]
+                    },
+                    "description": "An end time, in milliseconds since epoch, inclusive.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "id": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.sessions.update"
+                        ]
+                    },
+                    "description": "A client-generated identifier that is unique across all sessions owned by this particular user.",
+                    "type": "string"
+                },
+                "modifiedTimeMillis": {
+                    "description": "A timestamp that indicates when the session was last modified.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "name": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.sessions.update"
+                        ]
+                    },
+                    "description": "A human readable name of the session.",
+                    "type": "string"
+                },
+                "startTimeMillis": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.sessions.update"
+                        ]
+                    },
+                    "description": "A start time, in milliseconds since epoch, inclusive.",
+                    "format": "int64",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "Value": {
+            "description": "Holder object for the value of a single field in a data point.\n\nA field value has a particular format and is only ever set to one of an integer or a floating point value.",
+            "id": "Value",
+            "properties": {
+                "fpVal": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.datasets.patch"
+                        ]
+                    },
+                    "description": "Floating point value.",
+                    "format": "double",
+                    "type": "number"
+                },
+                "intVal": {
+                    "annotations": {
+                        "required": [
+                            "fitness.users.dataSources.datasets.patch"
+                        ]
+                    },
+                    "description": "Integer value.",
+                    "format": "int32",
+                    "type": "integer"
+                }
+            },
+            "type": "object"
+        }
+    },
+    "servicePath": "fitness/v1/users/",
+    "title": "Fitness",
+    "version": "v1"
+}
\ No newline at end of file
diff --git a/discovery/googleapis/fusiontables__v1.json b/discovery/googleapis/fusiontables__v1.json
index 54d4261..d165606 100644
--- a/discovery/googleapis/fusiontables__v1.json
+++ b/discovery/googleapis/fusiontables__v1.json
@@ -17,7 +17,7 @@
     "description": "API for working with Fusion Tables data.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/fusiontables",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/e6E288d7nM4w6x2Tq0-U44_kHhk\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/TZ3s_brTRvCVQr4tORNWoh5ImIo\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -1127,7 +1127,7 @@
             }
         }
     },
-    "revision": "20141016",
+    "revision": "20141028",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Bucket": {
diff --git a/discovery/googleapis/gamesManagement__v1management.json b/discovery/googleapis/gamesManagement__v1management.json
index 5816f7e..83db54f 100644
--- a/discovery/googleapis/gamesManagement__v1management.json
+++ b/discovery/googleapis/gamesManagement__v1management.json
@@ -18,7 +18,7 @@
     "description": "The Management API for Google Play Game Services.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/games/services",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/x8CnK19Ndg5iWRWLYO9YWdv4nv8\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/ALEOgTRjwoG6Pt_odEoBpzX-DtI\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -146,7 +146,7 @@
                     ]
                 },
                 "resetMultipleForAllPlayers": {
-                    "description": "Resets the achievement with the given IDs for all players. This method is only available to user accounts for your developer console. Only draft achievements may be reset.",
+                    "description": "Resets achievements with the given IDs for all players. This method is only available to user accounts for your developer console. Only draft achievements may be reset.",
                     "httpMethod": "POST",
                     "id": "gamesManagement.achievements.resetMultipleForAllPlayers",
                     "path": "achievements/resetMultipleForAllPlayers",
@@ -171,7 +171,7 @@
                     ],
                     "parameters": {
                         "applicationId": {
-                            "description": "The application being requested.",
+                            "description": "The application ID from the Google Play developer console.",
                             "location": "path",
                             "required": true,
                             "type": "string"
@@ -204,7 +204,7 @@
         "events": {
             "methods": {
                 "reset": {
-                    "description": "Reset all player progress on the event for the currently authenticated player. This method is only accessible to whitelisted tester accounts for your application. All resources that use the event will also be reset.",
+                    "description": "Resets all player progress on the event with the given ID for the currently authenticated player. This method is only accessible to whitelisted tester accounts for your application. All quests for this player that use the event will also be reset.",
                     "httpMethod": "POST",
                     "id": "gamesManagement.events.reset",
                     "parameterOrder": [
@@ -225,7 +225,7 @@
                     ]
                 },
                 "resetAll": {
-                    "description": "Reset all player progress on all unpublished events for the currently authenticated player. This method is only accessible to whitelisted tester accounts for your application. All resources that use the events will also be reset.",
+                    "description": "Resets all player progress on all events for the currently authenticated player. This method is only accessible to whitelisted tester accounts for your application. All quests for this player will also be reset.",
                     "httpMethod": "POST",
                     "id": "gamesManagement.events.resetAll",
                     "path": "events/reset",
@@ -234,8 +234,18 @@
                         "https://www.googleapis.com/auth/plus.login"
                     ]
                 },
+                "resetAllForAllPlayers": {
+                    "description": "Resets all draft events for all players. This method is only available to user accounts for your developer console. All quests that use any of these events will also be reset.",
+                    "httpMethod": "POST",
+                    "id": "gamesManagement.events.resetAllForAllPlayers",
+                    "path": "events/resetAllForAllPlayers",
+                    "scopes": [
+                        "https://www.googleapis.com/auth/games",
+                        "https://www.googleapis.com/auth/plus.login"
+                    ]
+                },
                 "resetForAllPlayers": {
-                    "description": "Reset all player progress on the event for all players. This method is only available to user accounts for your developer console. Only draft events can be reset. All resources that use the event will also be reset.",
+                    "description": "Resets the event with the given ID for all players. This method is only available to user accounts for your developer console. Only draft events can be reset. All quests that use the event will also be reset.",
                     "httpMethod": "POST",
                     "id": "gamesManagement.events.resetForAllPlayers",
                     "parameterOrder": [
@@ -254,6 +264,19 @@
                         "https://www.googleapis.com/auth/games",
                         "https://www.googleapis.com/auth/plus.login"
                     ]
+                },
+                "resetMultipleForAllPlayers": {
+                    "description": "Resets events with the given IDs for all players. This method is only available to user accounts for your developer console. Only draft events may be reset. All quests that use any of the events will also be reset.",
+                    "httpMethod": "POST",
+                    "id": "gamesManagement.events.resetMultipleForAllPlayers",
+                    "path": "events/resetMultipleForAllPlayers",
+                    "request": {
+                        "$ref": "EventsResetMultipleForAllRequest"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/games",
+                        "https://www.googleapis.com/auth/plus.login"
+                    ]
                 }
             }
         },
@@ -269,7 +292,7 @@
                     ],
                     "parameters": {
                         "applicationId": {
-                            "description": "The application being requested.",
+                            "description": "The application ID from the Google Play developer console.",
                             "location": "path",
                             "required": true,
                             "type": "string"
@@ -297,7 +320,7 @@
                     ],
                     "parameters": {
                         "applicationId": {
-                            "description": "The application being requested.",
+                            "description": "The application ID from the Google Play developer console.",
                             "location": "path",
                             "required": true,
                             "type": "string"
@@ -320,7 +343,7 @@
         "quests": {
             "methods": {
                 "reset": {
-                    "description": "Reset all player progress on the quest for the currently authenticated player. This method is only accessible to whitelisted tester accounts for your application.",
+                    "description": "Resets all player progress on the quest with the given ID for the currently authenticated player. This method is only accessible to whitelisted tester accounts for your application.",
                     "httpMethod": "POST",
                     "id": "gamesManagement.quests.reset",
                     "parameterOrder": [
@@ -339,6 +362,60 @@
                         "https://www.googleapis.com/auth/games",
                         "https://www.googleapis.com/auth/plus.login"
                     ]
+                },
+                "resetAll": {
+                    "description": "Resets all player progress on all quests for the currently authenticated player. This method is only accessible to whitelisted tester accounts for your application.",
+                    "httpMethod": "POST",
+                    "id": "gamesManagement.quests.resetAll",
+                    "path": "quests/reset",
+                    "scopes": [
+                        "https://www.googleapis.com/auth/games",
+                        "https://www.googleapis.com/auth/plus.login"
+                    ]
+                },
+                "resetAllForAllPlayers": {
+                    "description": "Resets all draft quests for all players. This method is only available to user accounts for your developer console.",
+                    "httpMethod": "POST",
+                    "id": "gamesManagement.quests.resetAllForAllPlayers",
+                    "path": "quests/resetAllForAllPlayers",
+                    "scopes": [
+                        "https://www.googleapis.com/auth/games",
+                        "https://www.googleapis.com/auth/plus.login"
+                    ]
+                },
+                "resetForAllPlayers": {
+                    "description": "Resets all player progress on the quest with the given ID for all players. This method is only available to user accounts for your developer console. Only draft quests can be reset.",
+                    "httpMethod": "POST",
+                    "id": "gamesManagement.quests.resetForAllPlayers",
+                    "parameterOrder": [
+                        "questId"
+                    ],
+                    "parameters": {
+                        "questId": {
+                            "description": "The ID of the quest.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "quests/{questId}/resetForAllPlayers",
+                    "scopes": [
+                        "https://www.googleapis.com/auth/games",
+                        "https://www.googleapis.com/auth/plus.login"
+                    ]
+                },
+                "resetMultipleForAllPlayers": {
+                    "description": "Resets quests with the given IDs for all players. This method is only available to user accounts for your developer console. Only draft quests may be reset.",
+                    "httpMethod": "POST",
+                    "id": "gamesManagement.quests.resetMultipleForAllPlayers",
+                    "path": "quests/resetMultipleForAllPlayers",
+                    "request": {
+                        "$ref": "QuestsResetMultipleForAllRequest"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/games",
+                        "https://www.googleapis.com/auth/plus.login"
+                    ]
                 }
             }
         },
@@ -353,13 +430,23 @@
                         "https://www.googleapis.com/auth/games",
                         "https://www.googleapis.com/auth/plus.login"
                     ]
+                },
+                "resetForAllPlayers": {
+                    "description": "Deletes rooms where the only room participants are from whitelisted tester accounts for your application. This method is only available to user accounts for your developer console.",
+                    "httpMethod": "POST",
+                    "id": "gamesManagement.rooms.resetForAllPlayers",
+                    "path": "rooms/resetForAllPlayers",
+                    "scopes": [
+                        "https://www.googleapis.com/auth/games",
+                        "https://www.googleapis.com/auth/plus.login"
+                    ]
                 }
             }
         },
         "scores": {
             "methods": {
                 "reset": {
-                    "description": "Reset scores for the specified leaderboard for the currently authenticated player. This method is only accessible to whitelisted tester accounts for your application.",
+                    "description": "Resets scores for the leaderboard with the given ID for the currently authenticated player. This method is only accessible to whitelisted tester accounts for your application.",
                     "httpMethod": "POST",
                     "id": "gamesManagement.scores.reset",
                     "parameterOrder": [
@@ -382,8 +469,31 @@
                         "https://www.googleapis.com/auth/plus.login"
                     ]
                 },
+                "resetAll": {
+                    "description": "Resets all scores for all leaderboards for the currently authenticated players. This method is only accessible to whitelisted tester accounts for your application.",
+                    "httpMethod": "POST",
+                    "id": "gamesManagement.scores.resetAll",
+                    "path": "scores/reset",
+                    "response": {
+                        "$ref": "PlayerScoreResetAllResponse"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/games",
+                        "https://www.googleapis.com/auth/plus.login"
+                    ]
+                },
+                "resetAllForAllPlayers": {
+                    "description": "Resets scores for all draft leaderboards for all players. This method is only available to user accounts for your developer console.",
+                    "httpMethod": "POST",
+                    "id": "gamesManagement.scores.resetAllForAllPlayers",
+                    "path": "scores/resetAllForAllPlayers",
+                    "scopes": [
+                        "https://www.googleapis.com/auth/games",
+                        "https://www.googleapis.com/auth/plus.login"
+                    ]
+                },
                 "resetForAllPlayers": {
-                    "description": "Reset scores for the specified leaderboard for all players. This method is only available to user accounts for your developer console. Only draft leaderboards can be reset.",
+                    "description": "Resets scores for the leaderboard with the given ID for all players. This method is only available to user accounts for your developer console. Only draft leaderboards can be reset.",
                     "httpMethod": "POST",
                     "id": "gamesManagement.scores.resetForAllPlayers",
                     "parameterOrder": [
@@ -402,6 +512,19 @@
                         "https://www.googleapis.com/auth/games",
                         "https://www.googleapis.com/auth/plus.login"
                     ]
+                },
+                "resetMultipleForAllPlayers": {
+                    "description": "Resets scores for the leaderboards with the given IDs for all players. This method is only available to user accounts for your developer console. Only draft leaderboards may be reset.",
+                    "httpMethod": "POST",
+                    "id": "gamesManagement.scores.resetMultipleForAllPlayers",
+                    "path": "scores/resetMultipleForAllPlayers",
+                    "request": {
+                        "$ref": "ScoresResetMultipleForAllRequest"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/games",
+                        "https://www.googleapis.com/auth/plus.login"
+                    ]
                 }
             }
         },
@@ -416,11 +539,21 @@
                         "https://www.googleapis.com/auth/games",
                         "https://www.googleapis.com/auth/plus.login"
                     ]
+                },
+                "resetForAllPlayers": {
+                    "description": "Deletes turn-based matches where the only match participants are from whitelisted tester accounts for your application. This method is only available to user accounts for your developer console.",
+                    "httpMethod": "POST",
+                    "id": "gamesManagement.turnBasedMatches.resetForAllPlayers",
+                    "path": "turnbasedmatches/resetForAllPlayers",
+                    "scopes": [
+                        "https://www.googleapis.com/auth/games",
+                        "https://www.googleapis.com/auth/plus.login"
+                    ]
                 }
             }
         }
     },
-    "revision": "20141005",
+    "revision": "20141027",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AchievementResetAllResponse": {
@@ -485,6 +618,25 @@
             },
             "type": "object"
         },
+        "EventsResetMultipleForAllRequest": {
+            "description": "This is a JSON template for multiple events reset all request.",
+            "id": "EventsResetMultipleForAllRequest",
+            "properties": {
+                "event_ids": {
+                    "description": "The IDs of events to reset.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "kind": {
+                    "default": "gamesManagement#eventsResetMultipleForAllRequest",
+                    "description": "Uniquely identifies the type of this resource. Value is always the fixed string gamesManagement#eventsResetMultipleForAllRequest.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
         "GamesPlayedResource": {
             "description": "This is a JSON template for metadata about a player playing a game with the currently authenticated user.",
             "id": "GamesPlayedResource",
@@ -642,10 +794,33 @@
             },
             "type": "object"
         },
+        "PlayerScoreResetAllResponse": {
+            "description": "This is a JSON template for a list of leaderboard reset resources.",
+            "id": "PlayerScoreResetAllResponse",
+            "properties": {
+                "kind": {
+                    "default": "gamesManagement#playerScoreResetAllResponse",
+                    "description": "Uniquely identifies the type of this resource. Value is always the fixed string gamesManagement#playerScoreResetResponse.",
+                    "type": "string"
+                },
+                "results": {
+                    "description": "The leaderboard reset results.",
+                    "items": {
+                        "$ref": "PlayerScoreResetResponse"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
         "PlayerScoreResetResponse": {
             "description": "This is a JSON template for a list of reset leaderboard entry resources.",
             "id": "PlayerScoreResetResponse",
             "properties": {
+                "definitionId": {
+                    "description": "The ID of an leaderboard for which player state has been updated.",
+                    "type": "string"
+                },
                 "kind": {
                     "default": "gamesManagement#playerScoreResetResponse",
                     "description": "Uniquely identifies the type of this resource. Value is always the fixed string gamesManagement#playerScoreResetResponse.",
@@ -660,6 +835,44 @@
                 }
             },
             "type": "object"
+        },
+        "QuestsResetMultipleForAllRequest": {
+            "description": "This is a JSON template for multiple quests reset all request.",
+            "id": "QuestsResetMultipleForAllRequest",
+            "properties": {
+                "kind": {
+                    "default": "gamesManagement#questsResetMultipleForAllRequest",
+                    "description": "Uniquely identifies the type of this resource. Value is always the fixed string gamesManagement#questsResetMultipleForAllRequest.",
+                    "type": "string"
+                },
+                "quest_ids": {
+                    "description": "The IDs of quests to reset.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "ScoresResetMultipleForAllRequest": {
+            "description": "This is a JSON template for multiple scores reset all request.",
+            "id": "ScoresResetMultipleForAllRequest",
+            "properties": {
+                "kind": {
+                    "default": "gamesManagement#scoresResetMultipleForAllRequest",
+                    "description": "Uniquely identifies the type of this resource. Value is always the fixed string gamesManagement#scoresResetMultipleForAllRequest.",
+                    "type": "string"
+                },
+                "leaderboard_ids": {
+                    "description": "The IDs of leaderboards to reset.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
         }
     },
     "servicePath": "games/v1management/",
diff --git a/discovery/googleapis/games__v1.json b/discovery/googleapis/games__v1.json
index d66ea5a..0b9bddd 100644
--- a/discovery/googleapis/games__v1.json
+++ b/discovery/googleapis/games__v1.json
@@ -21,7 +21,7 @@
     "description": "The API for Google Play Game Services.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/games/services/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/BZizlPQP52YM5WPuW178a0ClK98\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/uuQc6kwFPfNAC-7Dz3U2UNVRUdM\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -325,7 +325,7 @@
                     ],
                     "parameters": {
                         "applicationId": {
-                            "description": "The application being requested.",
+                            "description": "The application ID from the Google Play developer console.",
                             "location": "path",
                             "required": true,
                             "type": "string"
@@ -1907,7 +1907,7 @@
             }
         }
     },
-    "revision": "20141005",
+    "revision": "20141027",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AchievementDefinition": {
@@ -4346,6 +4346,11 @@
                     "format": "int64",
                     "type": "string"
                 },
+                "progressValue": {
+                    "description": "The progress value (64-bit integer set by developer) associated with this snapshot.",
+                    "format": "int64",
+                    "type": "string"
+                },
                 "title": {
                     "description": "The title of this snapshot.",
                     "type": "string"
diff --git a/discovery/googleapis/gmail__v1.json b/discovery/googleapis/gmail__v1.json
index 15efe01..16d66d5 100644
--- a/discovery/googleapis/gmail__v1.json
+++ b/discovery/googleapis/gmail__v1.json
@@ -23,7 +23,7 @@
     "description": "The Gmail REST API.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/gmail/api/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/VTv_VctBdqXjsksB5IcLu4ps6Nw\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/oTc1ZFBBKYPWVfuhl_PGLzRZK7E\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/googlemail-16.png",
         "x32": "https://www.google.com/images/icons/product/googlemail-32.png"
@@ -1116,12 +1116,34 @@
                                 "id"
                             ],
                             "parameters": {
+                                "format": {
+                                    "default": "full",
+                                    "description": "The format to return the messages in.",
+                                    "enum": [
+                                        "full",
+                                        "metadata",
+                                        "minimal"
+                                    ],
+                                    "enumDescriptions": [
+                                        "",
+                                        "",
+                                        ""
+                                    ],
+                                    "location": "query",
+                                    "type": "string"
+                                },
                                 "id": {
                                     "description": "The ID of the thread to retrieve.",
                                     "location": "path",
                                     "required": true,
                                     "type": "string"
                                 },
+                                "metadataHeaders": {
+                                    "description": "When given and format is METADATA, only include headers specified.",
+                                    "location": "query",
+                                    "repeated": true,
+                                    "type": "string"
+                                },
                                 "userId": {
                                     "default": "me",
                                     "description": "The user's email address. The special value me can be used to indicate the authenticated user.",
@@ -1299,7 +1321,7 @@
             }
         }
     },
-    "revision": "20141009",
+    "revision": "20141017",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Draft": {
diff --git a/discovery/googleapis/mapsengine__v1.json b/discovery/googleapis/mapsengine__v1.json
index 7b4c68f..e3411da 100644
--- a/discovery/googleapis/mapsengine__v1.json
+++ b/discovery/googleapis/mapsengine__v1.json
@@ -18,7 +18,7 @@
     "description": "The Google Maps Engine API allows developers to store and query geospatial vector and raster data.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/maps-engine/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/qPyTs6YgupnkPPausvgVVCo1k4I\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/S3CrUoJ8uvc_hw3CQly01B5yfX4\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/maps_engine-16.png",
         "x32": "https://www.google.com/images/icons/product/maps_engine-32.png"
@@ -2796,7 +2796,7 @@
             }
         }
     },
-    "revision": "20141015",
+    "revision": "20141030",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AcquisitionTime": {
@@ -4369,6 +4369,10 @@
                     "$ref": "Color",
                     "description": "Fill color of the polygon. If not provided, the polygon will be transparent and not visible if there is no border."
                 },
+                "label": {
+                    "$ref": "LabelStyle",
+                    "description": "Label style for the polygon."
+                },
                 "stroke": {
                     "$ref": "Border",
                     "description": "Border of the polygon. 0 < border.width <= 10."
diff --git a/discovery/googleapis/mirror__v1.json b/discovery/googleapis/mirror__v1.json
index 9c7ab37..2df6423 100644
--- a/discovery/googleapis/mirror__v1.json
+++ b/discovery/googleapis/mirror__v1.json
@@ -17,7 +17,7 @@
     "description": "API for interacting with Glass users via the timeline.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/glass",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/qoehHrll3uiPpqLR5D6r-Z7hk4k\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/4u180rbq7vJSO43GLhTeaTLsY2M\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -735,7 +735,7 @@
             }
         }
     },
-    "revision": "20141008",
+    "revision": "20141103",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
diff --git a/discovery/googleapis/oauth2__v2.json b/discovery/googleapis/oauth2__v2.json
index d0cd5d7..eb9d7c8 100644
--- a/discovery/googleapis/oauth2__v2.json
+++ b/discovery/googleapis/oauth2__v2.json
@@ -23,7 +23,7 @@
     "description": "Lets you access OAuth2 protocol related APIs.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/accounts/docs/OAuth2",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/GL-dbqdl5oZGNiFahadB80nONis\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/lOq-EfXYTtqcVyexIQuHUyJSWYs\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -143,7 +143,7 @@
             }
         }
     },
-    "revision": "20140820",
+    "revision": "20141029",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Tokeninfo": {
diff --git a/discovery/googleapis/pagespeedonline__v1.json b/discovery/googleapis/pagespeedonline__v1.json
index b1a693b..27aec64 100644
--- a/discovery/googleapis/pagespeedonline__v1.json
+++ b/discovery/googleapis/pagespeedonline__v1.json
@@ -5,7 +5,7 @@
     "description": "Lets you analyze the performance of a web page and get tailored suggestions to make that page faster.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/speed/docs/insights/v1/getting_started",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/zQ_VmUlOwc6n15qq-vrFuIYN9cQ\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/k7__axf7Cxo27tXc6R4odLjm2cg\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/pagespeed-16.png",
         "x32": "https://www.google.com/images/icons/product/pagespeed-32.png"
@@ -126,7 +126,7 @@
             }
         }
     },
-    "revision": "20141015",
+    "revision": "20141027",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Result": {
diff --git a/discovery/googleapis/plusDomains__v1.json b/discovery/googleapis/plusDomains__v1.json
index 0950e37..627c58e 100644
--- a/discovery/googleapis/plusDomains__v1.json
+++ b/discovery/googleapis/plusDomains__v1.json
@@ -41,7 +41,7 @@
     "description": "The Google+ API enables developers to build on top of the Google+ platform.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/+/domains/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/3BJHTEiiNGLBoomkEEIW2R46Cq4\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/vyiqzddQstFfB_HNgsVc1paw2Yo\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/gplus-16.png",
         "x32": "http://www.google.com/images/icons/product/gplus-32.png"
@@ -852,7 +852,7 @@
             }
         }
     },
-    "revision": "20141015",
+    "revision": "20141103",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Acl": {
diff --git a/discovery/googleapis/plus__v1.json b/discovery/googleapis/plus__v1.json
index 3efc045..ba5e6a5 100644
--- a/discovery/googleapis/plus__v1.json
+++ b/discovery/googleapis/plus__v1.json
@@ -23,7 +23,7 @@
     "description": "The Google+ API enables developers to build on top of the Google+ platform.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/+/api/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/1_HxCi7Wd0T4XNqpdQc_lWD76F4\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/PAVYwI_tMBWGW_yoeuz3r_P7ww0\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/gplus-16.png",
         "x32": "http://www.google.com/images/icons/product/gplus-32.png"
@@ -621,7 +621,7 @@
             }
         }
     },
-    "revision": "20141015",
+    "revision": "20141103",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Acl": {
diff --git a/discovery/googleapis/prediction__v1.6.json b/discovery/googleapis/prediction__v1.6.json
index 0a2a98e..49d0c54 100644
--- a/discovery/googleapis/prediction__v1.6.json
+++ b/discovery/googleapis/prediction__v1.6.json
@@ -23,7 +23,7 @@
     "description": "Lets you access a cloud hosted machine learning service that makes it easy to build smart apps",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/prediction/docs/developer-guide",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/MKubU0FmYvcCiak8-htY8xGlT7I\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/XH5kx6DVwHOxcDh-sCub5wYn1Ss\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/feature/predictionapi-16.png",
         "x32": "http://www.google.com/images/icons/feature/predictionapi-32.png"
@@ -746,7 +746,8 @@
                 },
                 "outputValue": {
                     "description": "The estimated regression value (Regression models only).",
-                    "type": "string"
+                    "format": "double",
+                    "type": "number"
                 },
                 "selfLink": {
                     "description": "A URL to re-request this resource.",
diff --git a/discovery/googleapis/storage__v1.json b/discovery/googleapis/storage__v1.json
index 1dd2258..f8d2e4e 100644
--- a/discovery/googleapis/storage__v1.json
+++ b/discovery/googleapis/storage__v1.json
@@ -23,7 +23,7 @@
     "description": "Lets you store and retrieve potentially-large, immutable data objects.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/storage/docs/json_api/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/Q51lUpUSFLOUeZvWamXhAxA0IDI\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/VaANii_xZfXrY-yG-wavppujV5w\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/cloud_storage-16.png",
         "x32": "https://www.google.com/images/icons/product/cloud_storage-32.png"
@@ -1863,7 +1863,7 @@
             }
         }
     },
-    "revision": "20141010",
+    "revision": "20141026",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Bucket": {
diff --git a/discovery/googleapis/tagmanager__v1.json b/discovery/googleapis/tagmanager__v1.json
new file mode 100644
index 0000000..9bd064e
--- /dev/null
+++ b/discovery/googleapis/tagmanager__v1.json
@@ -0,0 +1,2756 @@
+{
+    "auth": {
+        "oauth2": {
+            "scopes": {
+                "https://www.googleapis.com/auth/tagmanager.delete.containers": {
+                    "description": "Delete your Google Tag Manager containers"
+                },
+                "https://www.googleapis.com/auth/tagmanager.edit.containers": {
+                    "description": "Manage your Google Tag Manager containers"
+                },
+                "https://www.googleapis.com/auth/tagmanager.edit.containerversions": {
+                    "description": "Manage your Google Tag Manager container versions"
+                },
+                "https://www.googleapis.com/auth/tagmanager.manage.accounts": {
+                    "description": "Manage your Google Tag Manager accounts"
+                },
+                "https://www.googleapis.com/auth/tagmanager.manage.users": {
+                    "description": "Manage user permissions of your Google Tag Manager data"
+                },
+                "https://www.googleapis.com/auth/tagmanager.publish": {
+                    "description": "Publish your Google Tag Manager containers"
+                },
+                "https://www.googleapis.com/auth/tagmanager.readonly": {
+                    "description": "View your Google Tag Manager containers"
+                }
+            }
+        }
+    },
+    "basePath": "/tagmanager/v1/",
+    "baseUrl": "https://www.googleapis.com/tagmanager/v1/",
+    "batchPath": "batch",
+    "canonicalName": "Tag Manager",
+    "description": "API for accessing Tag Manager accounts and containers.",
+    "discoveryVersion": "v1",
+    "documentationLink": "https://developers.google.com/tag-manager/api/v1/",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/pVfb1ajMeYIw5IrU4jq20F5dMAg\"",
+    "icons": {
+        "x16": "http://www.google.com/images/icons/product/search-16.gif",
+        "x32": "http://www.google.com/images/icons/product/search-32.gif"
+    },
+    "id": "tagmanager:v1",
+    "kind": "discovery#restDescription",
+    "name": "tagmanager",
+    "ownerDomain": "google.com",
+    "ownerName": "Google",
+    "parameters": {
+        "alt": {
+            "default": "json",
+            "description": "Data format for the response.",
+            "enum": [
+                "json"
+            ],
+            "enumDescriptions": [
+                "Responses with Content-Type of application/json"
+            ],
+            "location": "query",
+            "type": "string"
+        },
+        "fields": {
+            "description": "Selector specifying which fields to include in a partial response.",
+            "location": "query",
+            "type": "string"
+        },
+        "key": {
+            "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+            "location": "query",
+            "type": "string"
+        },
+        "oauth_token": {
+            "description": "OAuth 2.0 token for the current user.",
+            "location": "query",
+            "type": "string"
+        },
+        "prettyPrint": {
+            "default": "true",
+            "description": "Returns response with indentations and line breaks.",
+            "location": "query",
+            "type": "boolean"
+        },
+        "quotaUser": {
+            "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.",
+            "location": "query",
+            "type": "string"
+        },
+        "userIp": {
+            "description": "IP address of the site where the request originates. Use this if you want to enforce per-user limits.",
+            "location": "query",
+            "type": "string"
+        }
+    },
+    "protocol": "rest",
+    "resources": {
+        "accounts": {
+            "methods": {
+                "get": {
+                    "description": "Gets a GTM Account.",
+                    "httpMethod": "GET",
+                    "id": "tagmanager.accounts.get",
+                    "parameterOrder": [
+                        "accountId"
+                    ],
+                    "parameters": {
+                        "accountId": {
+                            "description": "The GTM Account ID.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "accounts/{accountId}",
+                    "response": {
+                        "$ref": "Account"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/tagmanager.edit.containers",
+                        "https://www.googleapis.com/auth/tagmanager.manage.accounts",
+                        "https://www.googleapis.com/auth/tagmanager.readonly"
+                    ]
+                },
+                "list": {
+                    "description": "Lists all GTM Accounts that a user has access to.",
+                    "httpMethod": "GET",
+                    "id": "tagmanager.accounts.list",
+                    "path": "accounts",
+                    "response": {
+                        "$ref": "ListAccountsResponse"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/tagmanager.edit.containers",
+                        "https://www.googleapis.com/auth/tagmanager.manage.accounts",
+                        "https://www.googleapis.com/auth/tagmanager.readonly"
+                    ]
+                },
+                "update": {
+                    "description": "Updates a GTM Account.",
+                    "httpMethod": "PUT",
+                    "id": "tagmanager.accounts.update",
+                    "parameterOrder": [
+                        "accountId"
+                    ],
+                    "parameters": {
+                        "accountId": {
+                            "description": "The GTM Account ID.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "fingerprint": {
+                            "description": "When provided, this fingerprint must match the fingerprint of the account in storage.",
+                            "location": "query",
+                            "type": "string"
+                        }
+                    },
+                    "path": "accounts/{accountId}",
+                    "request": {
+                        "$ref": "Account"
+                    },
+                    "response": {
+                        "$ref": "Account"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/tagmanager.manage.accounts"
+                    ]
+                }
+            },
+            "resources": {
+                "containers": {
+                    "methods": {
+                        "create": {
+                            "description": "Creates a Container.",
+                            "httpMethod": "POST",
+                            "id": "tagmanager.accounts.containers.create",
+                            "parameterOrder": [
+                                "accountId"
+                            ],
+                            "parameters": {
+                                "accountId": {
+                                    "description": "The GTM Account ID.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "accounts/{accountId}/containers",
+                            "request": {
+                                "$ref": "Container"
+                            },
+                            "response": {
+                                "$ref": "Container"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/tagmanager.edit.containers"
+                            ]
+                        },
+                        "delete": {
+                            "description": "Deletes a Container.",
+                            "httpMethod": "DELETE",
+                            "id": "tagmanager.accounts.containers.delete",
+                            "parameterOrder": [
+                                "accountId",
+                                "containerId"
+                            ],
+                            "parameters": {
+                                "accountId": {
+                                    "description": "The GTM Account ID.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                },
+                                "containerId": {
+                                    "description": "The GTM Container ID.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "accounts/{accountId}/containers/{containerId}",
+                            "scopes": [
+                                "https://www.googleapis.com/auth/tagmanager.delete.containers"
+                            ]
+                        },
+                        "get": {
+                            "description": "Gets a Container.",
+                            "httpMethod": "GET",
+                            "id": "tagmanager.accounts.containers.get",
+                            "parameterOrder": [
+                                "accountId",
+                                "containerId"
+                            ],
+                            "parameters": {
+                                "accountId": {
+                                    "description": "The GTM Account ID.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                },
+                                "containerId": {
+                                    "description": "The GTM Container ID.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "accounts/{accountId}/containers/{containerId}",
+                            "response": {
+                                "$ref": "Container"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/tagmanager.edit.containers",
+                                "https://www.googleapis.com/auth/tagmanager.readonly"
+                            ]
+                        },
+                        "list": {
+                            "description": "Lists all Containers that belongs to a GTM Account.",
+                            "httpMethod": "GET",
+                            "id": "tagmanager.accounts.containers.list",
+                            "parameterOrder": [
+                                "accountId"
+                            ],
+                            "parameters": {
+                                "accountId": {
+                                    "description": "The GTM Account ID.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "accounts/{accountId}/containers",
+                            "response": {
+                                "$ref": "ListContainersResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/tagmanager.edit.containers",
+                                "https://www.googleapis.com/auth/tagmanager.readonly"
+                            ]
+                        },
+                        "update": {
+                            "description": "Updates a Container.",
+                            "httpMethod": "PUT",
+                            "id": "tagmanager.accounts.containers.update",
+                            "parameterOrder": [
+                                "accountId",
+                                "containerId"
+                            ],
+                            "parameters": {
+                                "accountId": {
+                                    "description": "The GTM Account ID.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                },
+                                "containerId": {
+                                    "description": "The GTM Container ID.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                },
+                                "fingerprint": {
+                                    "description": "When provided, this fingerprint must match the fingerprint of the container in storage.",
+                                    "location": "query",
+                                    "type": "string"
+                                }
+                            },
+                            "path": "accounts/{accountId}/containers/{containerId}",
+                            "request": {
+                                "$ref": "Container"
+                            },
+                            "response": {
+                                "$ref": "Container"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/tagmanager.edit.containers"
+                            ]
+                        }
+                    },
+                    "resources": {
+                        "macros": {
+                            "methods": {
+                                "create": {
+                                    "description": "Creates a GTM Macro.",
+                                    "httpMethod": "POST",
+                                    "id": "tagmanager.accounts.containers.macros.create",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/macros",
+                                    "request": {
+                                        "$ref": "Macro"
+                                    },
+                                    "response": {
+                                        "$ref": "Macro"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers"
+                                    ]
+                                },
+                                "delete": {
+                                    "description": "Deletes a GTM Macro.",
+                                    "httpMethod": "DELETE",
+                                    "id": "tagmanager.accounts.containers.macros.delete",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId",
+                                        "macroId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "macroId": {
+                                            "description": "The GTM Macro ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/macros/{macroId}",
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers"
+                                    ]
+                                },
+                                "get": {
+                                    "description": "Gets a GTM Macro.",
+                                    "httpMethod": "GET",
+                                    "id": "tagmanager.accounts.containers.macros.get",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId",
+                                        "macroId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "macroId": {
+                                            "description": "The GTM Macro ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/macros/{macroId}",
+                                    "response": {
+                                        "$ref": "Macro"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers",
+                                        "https://www.googleapis.com/auth/tagmanager.readonly"
+                                    ]
+                                },
+                                "list": {
+                                    "description": "Lists all GTM Macros of a Container.",
+                                    "httpMethod": "GET",
+                                    "id": "tagmanager.accounts.containers.macros.list",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/macros",
+                                    "response": {
+                                        "$ref": "ListMacrosResponse"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers",
+                                        "https://www.googleapis.com/auth/tagmanager.readonly"
+                                    ]
+                                },
+                                "update": {
+                                    "description": "Updates a GTM Macro.",
+                                    "httpMethod": "PUT",
+                                    "id": "tagmanager.accounts.containers.macros.update",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId",
+                                        "macroId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "fingerprint": {
+                                            "description": "When provided, this fingerprint must match the fingerprint of the macro in storage.",
+                                            "location": "query",
+                                            "type": "string"
+                                        },
+                                        "macroId": {
+                                            "description": "The GTM Macro ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/macros/{macroId}",
+                                    "request": {
+                                        "$ref": "Macro"
+                                    },
+                                    "response": {
+                                        "$ref": "Macro"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers"
+                                    ]
+                                }
+                            }
+                        },
+                        "rules": {
+                            "methods": {
+                                "create": {
+                                    "description": "Creates a GTM Rule.",
+                                    "httpMethod": "POST",
+                                    "id": "tagmanager.accounts.containers.rules.create",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/rules",
+                                    "request": {
+                                        "$ref": "Rule"
+                                    },
+                                    "response": {
+                                        "$ref": "Rule"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers"
+                                    ]
+                                },
+                                "delete": {
+                                    "description": "Deletes a GTM Rule.",
+                                    "httpMethod": "DELETE",
+                                    "id": "tagmanager.accounts.containers.rules.delete",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId",
+                                        "ruleId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "ruleId": {
+                                            "description": "The GTM Rule ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/rules/{ruleId}",
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers"
+                                    ]
+                                },
+                                "get": {
+                                    "description": "Gets a GTM Rule.",
+                                    "httpMethod": "GET",
+                                    "id": "tagmanager.accounts.containers.rules.get",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId",
+                                        "ruleId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "ruleId": {
+                                            "description": "The GTM Rule ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/rules/{ruleId}",
+                                    "response": {
+                                        "$ref": "Rule"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers",
+                                        "https://www.googleapis.com/auth/tagmanager.readonly"
+                                    ]
+                                },
+                                "list": {
+                                    "description": "Lists all GTM Rules of a Container.",
+                                    "httpMethod": "GET",
+                                    "id": "tagmanager.accounts.containers.rules.list",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/rules",
+                                    "response": {
+                                        "$ref": "ListRulesResponse"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers",
+                                        "https://www.googleapis.com/auth/tagmanager.readonly"
+                                    ]
+                                },
+                                "update": {
+                                    "description": "Updates a GTM Rule.",
+                                    "httpMethod": "PUT",
+                                    "id": "tagmanager.accounts.containers.rules.update",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId",
+                                        "ruleId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "fingerprint": {
+                                            "description": "When provided, this fingerprint must match the fingerprint of the rule in storage.",
+                                            "location": "query",
+                                            "type": "string"
+                                        },
+                                        "ruleId": {
+                                            "description": "The GTM Rule ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/rules/{ruleId}",
+                                    "request": {
+                                        "$ref": "Rule"
+                                    },
+                                    "response": {
+                                        "$ref": "Rule"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers"
+                                    ]
+                                }
+                            }
+                        },
+                        "tags": {
+                            "methods": {
+                                "create": {
+                                    "description": "Creates a GTM Tag.",
+                                    "httpMethod": "POST",
+                                    "id": "tagmanager.accounts.containers.tags.create",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/tags",
+                                    "request": {
+                                        "$ref": "Tag"
+                                    },
+                                    "response": {
+                                        "$ref": "Tag"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers"
+                                    ]
+                                },
+                                "delete": {
+                                    "description": "Deletes a GTM Tag.",
+                                    "httpMethod": "DELETE",
+                                    "id": "tagmanager.accounts.containers.tags.delete",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId",
+                                        "tagId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "tagId": {
+                                            "description": "The GTM Tag ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/tags/{tagId}",
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers"
+                                    ]
+                                },
+                                "get": {
+                                    "description": "Gets a GTM Tag.",
+                                    "httpMethod": "GET",
+                                    "id": "tagmanager.accounts.containers.tags.get",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId",
+                                        "tagId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "tagId": {
+                                            "description": "The GTM Tag ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/tags/{tagId}",
+                                    "response": {
+                                        "$ref": "Tag"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers",
+                                        "https://www.googleapis.com/auth/tagmanager.readonly"
+                                    ]
+                                },
+                                "list": {
+                                    "description": "Lists all GTM Tags of a Container.",
+                                    "httpMethod": "GET",
+                                    "id": "tagmanager.accounts.containers.tags.list",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/tags",
+                                    "response": {
+                                        "$ref": "ListTagsResponse"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers",
+                                        "https://www.googleapis.com/auth/tagmanager.readonly"
+                                    ]
+                                },
+                                "update": {
+                                    "description": "Updates a GTM Tag.",
+                                    "httpMethod": "PUT",
+                                    "id": "tagmanager.accounts.containers.tags.update",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId",
+                                        "tagId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "fingerprint": {
+                                            "description": "When provided, this fingerprint must match the fingerprint of the tag in storage.",
+                                            "location": "query",
+                                            "type": "string"
+                                        },
+                                        "tagId": {
+                                            "description": "The GTM Tag ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/tags/{tagId}",
+                                    "request": {
+                                        "$ref": "Tag"
+                                    },
+                                    "response": {
+                                        "$ref": "Tag"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers"
+                                    ]
+                                }
+                            }
+                        },
+                        "triggers": {
+                            "methods": {
+                                "create": {
+                                    "description": "Creates a GTM Trigger.",
+                                    "httpMethod": "POST",
+                                    "id": "tagmanager.accounts.containers.triggers.create",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/triggers",
+                                    "request": {
+                                        "$ref": "Trigger"
+                                    },
+                                    "response": {
+                                        "$ref": "Trigger"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers"
+                                    ]
+                                },
+                                "delete": {
+                                    "description": "Deletes a GTM Trigger.",
+                                    "httpMethod": "DELETE",
+                                    "id": "tagmanager.accounts.containers.triggers.delete",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId",
+                                        "triggerId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "triggerId": {
+                                            "description": "The GTM Trigger ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/triggers/{triggerId}",
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers"
+                                    ]
+                                },
+                                "get": {
+                                    "description": "Gets a GTM Trigger.",
+                                    "httpMethod": "GET",
+                                    "id": "tagmanager.accounts.containers.triggers.get",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId",
+                                        "triggerId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "triggerId": {
+                                            "description": "The GTM Trigger ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/triggers/{triggerId}",
+                                    "response": {
+                                        "$ref": "Trigger"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers",
+                                        "https://www.googleapis.com/auth/tagmanager.readonly"
+                                    ]
+                                },
+                                "list": {
+                                    "description": "Lists all GTM Triggers of a Container.",
+                                    "httpMethod": "GET",
+                                    "id": "tagmanager.accounts.containers.triggers.list",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/triggers",
+                                    "response": {
+                                        "$ref": "ListTriggersResponse"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers",
+                                        "https://www.googleapis.com/auth/tagmanager.readonly"
+                                    ]
+                                },
+                                "update": {
+                                    "description": "Updates a GTM Trigger.",
+                                    "httpMethod": "PUT",
+                                    "id": "tagmanager.accounts.containers.triggers.update",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId",
+                                        "triggerId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "fingerprint": {
+                                            "description": "When provided, this fingerprint must match the fingerprint of the trigger in storage.",
+                                            "location": "query",
+                                            "type": "string"
+                                        },
+                                        "triggerId": {
+                                            "description": "The GTM Trigger ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/triggers/{triggerId}",
+                                    "request": {
+                                        "$ref": "Trigger"
+                                    },
+                                    "response": {
+                                        "$ref": "Trigger"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers"
+                                    ]
+                                }
+                            }
+                        },
+                        "variables": {
+                            "methods": {
+                                "create": {
+                                    "description": "Creates a GTM Variable.",
+                                    "httpMethod": "POST",
+                                    "id": "tagmanager.accounts.containers.variables.create",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/variables",
+                                    "request": {
+                                        "$ref": "Variable"
+                                    },
+                                    "response": {
+                                        "$ref": "Variable"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers"
+                                    ]
+                                },
+                                "delete": {
+                                    "description": "Deletes a GTM Variable.",
+                                    "httpMethod": "DELETE",
+                                    "id": "tagmanager.accounts.containers.variables.delete",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId",
+                                        "variableId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "variableId": {
+                                            "description": "The GTM Variable ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/variables/{variableId}",
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers"
+                                    ]
+                                },
+                                "get": {
+                                    "description": "Gets a GTM Variable.",
+                                    "httpMethod": "GET",
+                                    "id": "tagmanager.accounts.containers.variables.get",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId",
+                                        "variableId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "variableId": {
+                                            "description": "The GTM Variable ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/variables/{variableId}",
+                                    "response": {
+                                        "$ref": "Variable"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers",
+                                        "https://www.googleapis.com/auth/tagmanager.readonly"
+                                    ]
+                                },
+                                "list": {
+                                    "description": "Lists all GTM Variables of a Container.",
+                                    "httpMethod": "GET",
+                                    "id": "tagmanager.accounts.containers.variables.list",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/variables",
+                                    "response": {
+                                        "$ref": "ListVariablesResponse"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers",
+                                        "https://www.googleapis.com/auth/tagmanager.readonly"
+                                    ]
+                                },
+                                "update": {
+                                    "description": "Updates a GTM Variable.",
+                                    "httpMethod": "PUT",
+                                    "id": "tagmanager.accounts.containers.variables.update",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId",
+                                        "variableId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "fingerprint": {
+                                            "description": "When provided, this fingerprint must match the fingerprint of the variable in storage.",
+                                            "location": "query",
+                                            "type": "string"
+                                        },
+                                        "variableId": {
+                                            "description": "The GTM Variable ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/variables/{variableId}",
+                                    "request": {
+                                        "$ref": "Variable"
+                                    },
+                                    "response": {
+                                        "$ref": "Variable"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers"
+                                    ]
+                                }
+                            }
+                        },
+                        "versions": {
+                            "methods": {
+                                "create": {
+                                    "description": "Creates a Container Version.",
+                                    "httpMethod": "POST",
+                                    "id": "tagmanager.accounts.containers.versions.create",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/versions",
+                                    "request": {
+                                        "$ref": "CreateContainerVersionRequestVersionOptions"
+                                    },
+                                    "response": {
+                                        "$ref": "CreateContainerVersionResponse"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containerversions"
+                                    ]
+                                },
+                                "delete": {
+                                    "description": "Deletes a Container Version.",
+                                    "httpMethod": "DELETE",
+                                    "id": "tagmanager.accounts.containers.versions.delete",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId",
+                                        "containerVersionId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerVersionId": {
+                                            "description": "The GTM Container Version ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/versions/{containerVersionId}",
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containerversions"
+                                    ]
+                                },
+                                "get": {
+                                    "description": "Gets a Container Version.",
+                                    "httpMethod": "GET",
+                                    "id": "tagmanager.accounts.containers.versions.get",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId",
+                                        "containerVersionId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerVersionId": {
+                                            "description": "The GTM Container Version ID. Specify published to retrieve the currently published version.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/versions/{containerVersionId}",
+                                    "response": {
+                                        "$ref": "ContainerVersion"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers",
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containerversions",
+                                        "https://www.googleapis.com/auth/tagmanager.readonly"
+                                    ]
+                                },
+                                "list": {
+                                    "description": "Lists all Container Versions of a GTM Container.",
+                                    "httpMethod": "GET",
+                                    "id": "tagmanager.accounts.containers.versions.list",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "headers": {
+                                            "default": "false",
+                                            "description": "Retrieve headers only when true.",
+                                            "location": "query",
+                                            "type": "boolean"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/versions",
+                                    "response": {
+                                        "$ref": "ListContainerVersionsResponse"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers",
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containerversions",
+                                        "https://www.googleapis.com/auth/tagmanager.readonly"
+                                    ]
+                                },
+                                "publish": {
+                                    "description": "Publishes a Container Version.",
+                                    "httpMethod": "POST",
+                                    "id": "tagmanager.accounts.containers.versions.publish",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId",
+                                        "containerVersionId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerVersionId": {
+                                            "description": "The GTM Container Version ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "fingerprint": {
+                                            "description": "When provided, this fingerprint must match the fingerprint of the container version in storage.",
+                                            "location": "query",
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/versions/{containerVersionId}/publish",
+                                    "response": {
+                                        "$ref": "PublishContainerVersionResponse"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.publish"
+                                    ]
+                                },
+                                "restore": {
+                                    "description": "Restores a Container Version. This will overwrite the container's current configuration (including its macros, rules and tags). The operation will not have any effect on the version that is being served (i.e. the published version).",
+                                    "httpMethod": "POST",
+                                    "id": "tagmanager.accounts.containers.versions.restore",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId",
+                                        "containerVersionId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerVersionId": {
+                                            "description": "The GTM Container Version ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/versions/{containerVersionId}/restore",
+                                    "response": {
+                                        "$ref": "ContainerVersion"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containers"
+                                    ]
+                                },
+                                "undelete": {
+                                    "description": "Undeletes a Container Version.",
+                                    "httpMethod": "POST",
+                                    "id": "tagmanager.accounts.containers.versions.undelete",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId",
+                                        "containerVersionId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerVersionId": {
+                                            "description": "The GTM Container Version ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/versions/{containerVersionId}/undelete",
+                                    "response": {
+                                        "$ref": "ContainerVersion"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containerversions"
+                                    ]
+                                },
+                                "update": {
+                                    "description": "Updates a Container Version.",
+                                    "httpMethod": "PUT",
+                                    "id": "tagmanager.accounts.containers.versions.update",
+                                    "parameterOrder": [
+                                        "accountId",
+                                        "containerId",
+                                        "containerVersionId"
+                                    ],
+                                    "parameters": {
+                                        "accountId": {
+                                            "description": "The GTM Account ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerId": {
+                                            "description": "The GTM Container ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "containerVersionId": {
+                                            "description": "The GTM Container Version ID.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "fingerprint": {
+                                            "description": "When provided, this fingerprint must match the fingerprint of the container version in storage.",
+                                            "location": "query",
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "accounts/{accountId}/containers/{containerId}/versions/{containerVersionId}",
+                                    "request": {
+                                        "$ref": "ContainerVersion"
+                                    },
+                                    "response": {
+                                        "$ref": "ContainerVersion"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/tagmanager.edit.containerversions"
+                                    ]
+                                }
+                            }
+                        }
+                    }
+                },
+                "permissions": {
+                    "methods": {
+                        "create": {
+                            "description": "Creates a user's Account & Container Permissions.",
+                            "httpMethod": "POST",
+                            "id": "tagmanager.accounts.permissions.create",
+                            "parameterOrder": [
+                                "accountId"
+                            ],
+                            "parameters": {
+                                "accountId": {
+                                    "description": "The GTM Account ID.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "accounts/{accountId}/permissions",
+                            "request": {
+                                "$ref": "UserAccess"
+                            },
+                            "response": {
+                                "$ref": "UserAccess"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/tagmanager.manage.users"
+                            ]
+                        },
+                        "delete": {
+                            "description": "Removes a user from the account, revoking access to it and all of its containers.",
+                            "httpMethod": "DELETE",
+                            "id": "tagmanager.accounts.permissions.delete",
+                            "parameterOrder": [
+                                "accountId",
+                                "permissionId"
+                            ],
+                            "parameters": {
+                                "accountId": {
+                                    "description": "The GTM Account ID.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                },
+                                "permissionId": {
+                                    "description": "The GTM User ID.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "accounts/{accountId}/permissions/{permissionId}",
+                            "scopes": [
+                                "https://www.googleapis.com/auth/tagmanager.manage.users"
+                            ]
+                        },
+                        "get": {
+                            "description": "Gets a user's Account & Container Permissions.",
+                            "httpMethod": "GET",
+                            "id": "tagmanager.accounts.permissions.get",
+                            "parameterOrder": [
+                                "accountId",
+                                "permissionId"
+                            ],
+                            "parameters": {
+                                "accountId": {
+                                    "description": "The GTM Account ID.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                },
+                                "permissionId": {
+                                    "description": "The GTM User ID.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "accounts/{accountId}/permissions/{permissionId}",
+                            "response": {
+                                "$ref": "UserAccess"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/tagmanager.manage.users"
+                            ]
+                        },
+                        "list": {
+                            "description": "List all users that have access to the account along with Account and Container Permissions granted to each of them.",
+                            "httpMethod": "GET",
+                            "id": "tagmanager.accounts.permissions.list",
+                            "parameterOrder": [
+                                "accountId"
+                            ],
+                            "parameters": {
+                                "accountId": {
+                                    "description": "The GTM Account ID. @required tagmanager.accounts.permissions.list",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "accounts/{accountId}/permissions",
+                            "response": {
+                                "$ref": "ListAccountUsersResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/tagmanager.manage.users"
+                            ]
+                        },
+                        "update": {
+                            "description": "Updates a user's Account & Container Permissions.",
+                            "httpMethod": "PUT",
+                            "id": "tagmanager.accounts.permissions.update",
+                            "parameterOrder": [
+                                "accountId",
+                                "permissionId"
+                            ],
+                            "parameters": {
+                                "accountId": {
+                                    "description": "The GTM Account ID.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                },
+                                "permissionId": {
+                                    "description": "The GTM User ID.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "accounts/{accountId}/permissions/{permissionId}",
+                            "request": {
+                                "$ref": "UserAccess"
+                            },
+                            "response": {
+                                "$ref": "UserAccess"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/tagmanager.manage.users"
+                            ]
+                        }
+                    }
+                }
+            }
+        }
+    },
+    "revision": "20141024",
+    "rootUrl": "https://www.googleapis.com/",
+    "schemas": {
+        "Account": {
+            "description": "Represents a Google Tag Manager Account.",
+            "id": "Account",
+            "properties": {
+                "accountId": {
+                    "description": "The Account ID uniquely identifies the GTM Account.",
+                    "type": "string"
+                },
+                "fingerprint": {
+                    "description": "The fingerprint of the GTM Account as computed at storage time. This value is recomputed whenever the account is modified.",
+                    "type": "string"
+                },
+                "name": {
+                    "description": "Account display name.",
+                    "type": "string"
+                },
+                "shareData": {
+                    "description": "Whether the account shares data anonymously with Google and others.",
+                    "type": "boolean"
+                }
+            },
+            "type": "object"
+        },
+        "AccountAccess": {
+            "description": "Defines the Google Tag Manager Account access permissions.",
+            "id": "AccountAccess",
+            "properties": {
+                "permission": {
+                    "annotations": {
+                        "required": [
+                            "tagmanager.accounts.permissions.create"
+                        ]
+                    },
+                    "description": "List of Account permissions. Valid account permissions are read and manage.",
+                    "items": {
+                        "enum": [
+                            "delete",
+                            "edit",
+                            "manage",
+                            "publish",
+                            "read"
+                        ],
+                        "enumDescriptions": [
+                            "",
+                            "",
+                            "",
+                            "",
+                            ""
+                        ],
+                        "type": "string"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "Condition": {
+            "description": "Represents a predicate.",
+            "id": "Condition",
+            "properties": {
+                "parameter": {
+                    "annotations": {
+                        "required": [
+                            "tagmanager.accounts.containers.rules.create",
+                            "tagmanager.accounts.containers.rules.update"
+                        ]
+                    },
+                    "description": "A list of named parameters (key/value), depending on the condition's type. Notes: \n- For binary operators, include parameters named arg0 and arg1 for specifying the left and right operands, respectively. \n- At this time, the left operand (arg0) must be a reference to a macro. \n- For case-insensitive Regex matching, include a boolean parameter named ignore_case that is set to true. If not specified or set to any other value, the matching will be case sensitive. \n- To negate an operator, include a boolean parameter named negate boolean parameter that is set to true.",
+                    "items": {
+                        "$ref": "Parameter"
+                    },
+                    "type": "array"
+                },
+                "type": {
+                    "annotations": {
+                        "required": [
+                            "tagmanager.accounts.containers.rules.create",
+                            "tagmanager.accounts.containers.rules.update"
+                        ]
+                    },
+                    "description": "The type of operator for this condition.",
+                    "enum": [
+                        "contains",
+                        "endsWith",
+                        "equals",
+                        "greater",
+                        "greaterOrEquals",
+                        "less",
+                        "lessOrEquals",
+                        "matchRegex",
+                        "startsWith"
+                    ],
+                    "enumDescriptions": [
+                        "",
+                        "",
+                        "",
+                        "",
+                        "",
+                        "",
+                        "",
+                        "",
+                        ""
+                    ],
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "Container": {
+            "description": "Represents a Google Tag Manager Container.",
+            "id": "Container",
+            "properties": {
+                "accountId": {
+                    "description": "GTM Account ID.",
+                    "type": "string"
+                },
+                "containerId": {
+                    "description": "The Container ID uniquely identifies the GTM Container.",
+                    "type": "string"
+                },
+                "domainName": {
+                    "description": "Optional list of domain names associated with the Container.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "fingerprint": {
+                    "description": "The fingerprint of the GTM Container as computed at storage time. This value is recomputed whenever the account is modified.",
+                    "type": "string"
+                },
+                "name": {
+                    "annotations": {
+                        "required": [
+                            "tagmanager.accounts.containers.create"
+                        ]
+                    },
+                    "description": "Container display name.",
+                    "type": "string"
+                },
+                "notes": {
+                    "description": "Container Notes.",
+                    "type": "string"
+                },
+                "publicId": {
+                    "description": "Container Public ID.",
+                    "type": "string"
+                },
+                "timeZoneCountryId": {
+                    "annotations": {
+                        "required": [
+                            "tagmanager.accounts.containers.create"
+                        ]
+                    },
+                    "description": "Container Country ID.",
+                    "type": "string"
+                },
+                "timeZoneId": {
+                    "annotations": {
+                        "required": [
+                            "tagmanager.accounts.containers.create"
+                        ]
+                    },
+                    "description": "Container Time Zone ID.",
+                    "type": "string"
+                },
+                "usageContext": {
+                    "annotations": {
+                        "required": [
+                            "tagmanager.accounts.containers.create"
+                        ]
+                    },
+                    "description": "List of Usage Contexts for the Container. Valid values include: web, android, ios.",
+                    "items": {
+                        "enum": [
+                            "android",
+                            "ios",
+                            "web"
+                        ],
+                        "enumDescriptions": [
+                            "",
+                            "",
+                            ""
+                        ],
+                        "type": "string"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "ContainerAccess": {
+            "description": "Defines the Google Tag Manager Container access permissions.",
+            "id": "ContainerAccess",
+            "properties": {
+                "containerId": {
+                    "description": "GTM Container ID.",
+                    "type": "string"
+                },
+                "permission": {
+                    "description": "List of Container permissions. Valid container permissions are: read, edit, delete, publish.",
+                    "items": {
+                        "enum": [
+                            "delete",
+                            "edit",
+                            "manage",
+                            "publish",
+                            "read"
+                        ],
+                        "enumDescriptions": [
+                            "",
+                            "",
+                            "",
+                            "",
+                            ""
+                        ],
+                        "type": "string"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "ContainerVersion": {
+            "description": "Represents a Google Tag Manager Container Version.",
+            "id": "ContainerVersion",
+            "properties": {
+                "accountId": {
+                    "description": "GTM Account ID.",
+                    "type": "string"
+                },
+                "container": {
+                    "$ref": "Container",
+                    "description": "The container that this version was taken from."
+                },
+                "containerId": {
+                    "description": "GTM Container ID.",
+                    "type": "string"
+                },
+                "containerVersionId": {
+                    "description": "The Container Version ID uniquely identifies the GTM Container Version.",
+                    "type": "string"
+                },
+                "deleted": {
+                    "description": "A value of true indicates this container version has been deleted.",
+                    "type": "boolean"
+                },
+                "fingerprint": {
+                    "description": "The fingerprint of the GTM Container Version as computed at storage time. This value is recomputed whenever the container version is modified.",
+                    "type": "string"
+                },
+                "macro": {
+                    "description": "The macros in the container that this version was taken from.",
+                    "items": {
+                        "$ref": "Macro"
+                    },
+                    "type": "array"
+                },
+                "name": {
+                    "description": "Container version display name.",
+                    "type": "string"
+                },
+                "notes": {
+                    "description": "User notes on how to apply this container version in the container.",
+                    "type": "string"
+                },
+                "rule": {
+                    "description": "The rules in the container that this version was taken from.",
+                    "items": {
+                        "$ref": "Rule"
+                    },
+                    "type": "array"
+                },
+                "tag": {
+                    "description": "The tags in the container that this version was taken from.",
+                    "items": {
+                        "$ref": "Tag"
+                    },
+                    "type": "array"
+                },
+                "trigger": {
+                    "description": "The triggers in the container that this version was taken from.",
+                    "items": {
+                        "$ref": "Trigger"
+                    },
+                    "type": "array"
+                },
+                "variable": {
+                    "description": "The variables in the container that this version was taken from.",
+                    "items": {
+                        "$ref": "Variable"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "ContainerVersionHeader": {
+            "description": "Represents a Google Tag Manager Container Version Header.",
+            "id": "ContainerVersionHeader",
+            "properties": {
+                "accountId": {
+                    "description": "GTM Account ID.",
+                    "type": "string"
+                },
+                "containerId": {
+                    "description": "GTM Container ID.",
+                    "type": "string"
+                },
+                "containerVersionId": {
+                    "description": "The Container Version ID uniquely identifies the GTM Container Version.",
+                    "type": "string"
+                },
+                "deleted": {
+                    "description": "A value of true indicates this container version has been deleted.",
+                    "type": "boolean"
+                },
+                "name": {
+                    "description": "Container version display name.",
+                    "type": "string"
+                },
+                "numMacros": {
+                    "description": "Number of macros in the container version.",
+                    "type": "string"
+                },
+                "numRules": {
+                    "description": "Number of rules in the container version.",
+                    "type": "string"
+                },
+                "numTags": {
+                    "description": "Number of tags in the container version.",
+                    "type": "string"
+                },
+                "numTriggers": {
+                    "description": "Number of triggers in the container version.",
+                    "type": "string"
+                },
+                "numVariables": {
+                    "description": "Number of variables in the container version.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "CreateContainerVersionRequestVersionOptions": {
+            "description": "Options for new container versions.",
+            "id": "CreateContainerVersionRequestVersionOptions",
+            "properties": {
+                "name": {
+                    "description": "The name of the container version to be created.",
+                    "type": "string"
+                },
+                "notes": {
+                    "description": "The notes of the container version to be created.",
+                    "type": "string"
+                },
+                "quickPreview": {
+                    "description": "The creation of this version may be for quick preview and shouldn't be saved.",
+                    "type": "boolean"
+                }
+            },
+            "type": "object"
+        },
+        "CreateContainerVersionResponse": {
+            "description": "Create container versions response.",
+            "id": "CreateContainerVersionResponse",
+            "properties": {
+                "compilerError": {
+                    "description": "Compiler errors or not.",
+                    "type": "boolean"
+                },
+                "containerVersion": {
+                    "$ref": "ContainerVersion",
+                    "description": "The container version created."
+                }
+            },
+            "type": "object"
+        },
+        "ListAccountUsersResponse": {
+            "description": "List AccountUsers Response.",
+            "id": "ListAccountUsersResponse",
+            "properties": {
+                "userAccess": {
+                    "description": "All GTM AccountUsers of a GTM Account.",
+                    "items": {
+                        "$ref": "UserAccess"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "ListAccountsResponse": {
+            "description": "List Accounts Response.",
+            "id": "ListAccountsResponse",
+            "properties": {
+                "accounts": {
+                    "description": "List of GTM Accounts that a user has access to.",
+                    "items": {
+                        "$ref": "Account"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "ListContainerVersionsResponse": {
+            "description": "List container versions response.",
+            "id": "ListContainerVersionsResponse",
+            "properties": {
+                "containerVersion": {
+                    "description": "All versions of a GTM Container.",
+                    "items": {
+                        "$ref": "ContainerVersion"
+                    },
+                    "type": "array"
+                },
+                "containerVersionHeader": {
+                    "description": "All container version headers of a GTM Container.",
+                    "items": {
+                        "$ref": "ContainerVersionHeader"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "ListContainersResponse": {
+            "description": "List Containers Response.",
+            "id": "ListContainersResponse",
+            "properties": {
+                "containers": {
+                    "description": "All Containers of a GTM Account.",
+                    "items": {
+                        "$ref": "Container"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "ListMacrosResponse": {
+            "description": "List Macros Response.",
+            "id": "ListMacrosResponse",
+            "properties": {
+                "macros": {
+                    "description": "All GTM Macros of a GTM Container.",
+                    "items": {
+                        "$ref": "Macro"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "ListRulesResponse": {
+            "description": "List Rules Response.",
+            "id": "ListRulesResponse",
+            "properties": {
+                "rules": {
+                    "description": "All GTM Rules of a GTM Container.",
+                    "items": {
+                        "$ref": "Rule"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "ListTagsResponse": {
+            "description": "List Tags Response.",
+            "id": "ListTagsResponse",
+            "properties": {
+                "tags": {
+                    "description": "All GTM Tags of a GTM Container.",
+                    "items": {
+                        "$ref": "Tag"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "ListTriggersResponse": {
+            "description": "List triggers response.",
+            "id": "ListTriggersResponse",
+            "properties": {
+                "triggers": {
+                    "description": "All GTM Triggers of a GTM Container.",
+                    "items": {
+                        "$ref": "Trigger"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "ListVariablesResponse": {
+            "description": "List Variables Response.",
+            "id": "ListVariablesResponse",
+            "properties": {
+                "variables": {
+                    "description": "All GTM Variables of a GTM Container.",
+                    "items": {
+                        "$ref": "Variable"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "Macro": {
+            "description": "Represents a Google Tag Manager Macro.",
+            "id": "Macro",
+            "properties": {
+                "accountId": {
+                    "description": "GTM Account ID.",
+                    "type": "string"
+                },
+                "containerId": {
+                    "description": "GTM Container ID.",
+                    "type": "string"
+                },
+                "disablingRuleId": {
+                    "description": "For mobile containers only: A list of rule IDs for disabling conditional macros; the macro is enabled if one of the enabling rules is true while all the disabling rules are false. Treated as an unordered set.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "enablingRuleId": {
+                    "description": "For mobile containers only: A list of rule IDs for enabling conditional macros; the macro is enabled if one of the enabling rules is true while all the disabling rules are false. Treated as an unordered set.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "fingerprint": {
+                    "description": "The fingerprint of the GTM Macro as computed at storage time. This value is recomputed whenever the macro is modified.",
+                    "type": "string"
+                },
+                "macroId": {
+                    "description": "The Macro ID uniquely identifies the GTM Macro.",
+                    "type": "string"
+                },
+                "name": {
+                    "annotations": {
+                        "required": [
+                            "tagmanager.accounts.containers.macros.create"
+                        ]
+                    },
+                    "description": "Macro display name.",
+                    "type": "string"
+                },
+                "notes": {
+                    "description": "User notes on how to apply this macro in the container.",
+                    "type": "string"
+                },
+                "parameter": {
+                    "description": "The macro's parameters.",
+                    "items": {
+                        "$ref": "Parameter"
+                    },
+                    "type": "array"
+                },
+                "scheduleEndMs": {
+                    "description": "The end timestamp in milliseconds to schedule a macro.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "scheduleStartMs": {
+                    "description": "The start timestamp in milliseconds to schedule a macro.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "type": {
+                    "annotations": {
+                        "required": [
+                            "tagmanager.accounts.containers.macros.create",
+                            "tagmanager.accounts.containers.macros.update"
+                        ]
+                    },
+                    "description": "GTM Macro Type.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "Parameter": {
+            "description": "Represents a Google Tag Manager Parameter.",
+            "id": "Parameter",
+            "properties": {
+                "key": {
+                    "description": "The named key that uniquely identifies a parameter. Required for top-level parameters, as well as map values. Ignored for list values.",
+                    "type": "string"
+                },
+                "list": {
+                    "description": "This list parameter's parameters (keys will be ignored).",
+                    "items": {
+                        "$ref": "Parameter"
+                    },
+                    "type": "array"
+                },
+                "map": {
+                    "description": "This map parameter's parameters (must have keys; keys must be unique).",
+                    "items": {
+                        "$ref": "Parameter"
+                    },
+                    "type": "array"
+                },
+                "type": {
+                    "annotations": {
+                        "required": [
+                            "tagmanager.accounts.containers.macros.create",
+                            "tagmanager.accounts.containers.macros.update",
+                            "tagmanager.accounts.containers.rules.create",
+                            "tagmanager.accounts.containers.rules.update",
+                            "tagmanager.accounts.containers.tags.create",
+                            "tagmanager.accounts.containers.tags.update"
+                        ]
+                    },
+                    "description": "The parameter type. Valid values are: \n- boolean: The value represents a boolean, represented as 'true' or 'false' \n- integer: The value represents a 64-bit signed integer value, in base 10 \n- list: A list of parameters should be specified \n- map: A map of parameters should be specified \n- template: The value represents any text; this can include macro references (even macro references that might return non-string types)",
+                    "enum": [
+                        "boolean",
+                        "integer",
+                        "list",
+                        "map",
+                        "template"
+                    ],
+                    "enumDescriptions": [
+                        "",
+                        "",
+                        "",
+                        "",
+                        ""
+                    ],
+                    "type": "string"
+                },
+                "value": {
+                    "description": "A parameter's value (may contain macro references such as \"{{myMacro}}\") as appropriate to the specified type.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "PublishContainerVersionResponse": {
+            "description": "Publish container version response.",
+            "id": "PublishContainerVersionResponse",
+            "properties": {
+                "compilerError": {
+                    "description": "Compiler errors or not.",
+                    "type": "boolean"
+                },
+                "containerVersion": {
+                    "$ref": "ContainerVersion",
+                    "description": "The container version created."
+                }
+            },
+            "type": "object"
+        },
+        "Rule": {
+            "description": "Represents a Google Tag Manager Rule.",
+            "id": "Rule",
+            "properties": {
+                "accountId": {
+                    "description": "GTM Account ID.",
+                    "type": "string"
+                },
+                "condition": {
+                    "description": "The list of conditions that make up this rule (implicit AND between them).",
+                    "items": {
+                        "$ref": "Condition"
+                    },
+                    "type": "array"
+                },
+                "containerId": {
+                    "description": "GTM Container ID.",
+                    "type": "string"
+                },
+                "fingerprint": {
+                    "description": "The fingerprint of the GTM Rule as computed at storage time. This value is recomputed whenever the rule is modified.",
+                    "type": "string"
+                },
+                "name": {
+                    "annotations": {
+                        "required": [
+                            "tagmanager.accounts.containers.rules.create"
+                        ]
+                    },
+                    "description": "Rule display name.",
+                    "type": "string"
+                },
+                "notes": {
+                    "description": "User notes on how to apply this rule in the container.",
+                    "type": "string"
+                },
+                "ruleId": {
+                    "description": "The Rule ID uniquely identifies the GTM Rule.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "Tag": {
+            "description": "Represents a Google Tag Manager Tag.",
+            "id": "Tag",
+            "properties": {
+                "accountId": {
+                    "description": "GTM Account ID.",
+                    "type": "string"
+                },
+                "blockingRuleId": {
+                    "description": "Blocking rule IDs. If any of the listed rules evaluate to true, the tag will not fire.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "blockingTriggerId": {
+                    "description": "Blocking trigger IDs. If any of the listed triggers evaluate to true, the tag will not fire.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "containerId": {
+                    "description": "GTM Container ID.",
+                    "type": "string"
+                },
+                "dependencies": {
+                    "$ref": "Parameter",
+                    "description": "An optional list of tag names that this tag depends on to fire. Execution of this tag will be prevented until the tags with the given names complete their execution."
+                },
+                "fingerprint": {
+                    "description": "The fingerprint of the GTM Tag as computed at storage time. This value is recomputed whenever the tag is modified.",
+                    "type": "string"
+                },
+                "firingRuleId": {
+                    "description": "Firing rule IDs. A tag will fire when any of the listed rules are true and all of its blockingRuleIds (if any specified) are false.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "firingTriggerId": {
+                    "description": "Firing trigger IDs. A tag will fire when any of the listed triggers are true and all of its blockingTriggerIds (if any specified) are false.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "liveOnly": {
+                    "description": "If set to true, this tag will only fire in the live environment (e.g. not in preview or debug mode).",
+                    "type": "boolean"
+                },
+                "name": {
+                    "annotations": {
+                        "required": [
+                            "tagmanager.accounts.containers.tags.create"
+                        ]
+                    },
+                    "description": "Tag display name.",
+                    "type": "string"
+                },
+                "notes": {
+                    "description": "User notes on how to apply this tag in the container.",
+                    "type": "string"
+                },
+                "parameter": {
+                    "description": "The tag's parameters.",
+                    "items": {
+                        "$ref": "Parameter"
+                    },
+                    "type": "array"
+                },
+                "priority": {
+                    "$ref": "Parameter",
+                    "description": "User defined numeric priority of the tag. Tags are fired asynchronously in order of priority. Tags with higher numeric value fire first. A tag's priority can be a positive or negative value. The default value is 0."
+                },
+                "scheduleEndMs": {
+                    "description": "The end timestamp in milliseconds to schedule a tag.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "scheduleStartMs": {
+                    "description": "The start timestamp in milliseconds to schedule a tag.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "tagId": {
+                    "description": "The Tag ID uniquely identifies the GTM Tag.",
+                    "type": "string"
+                },
+                "type": {
+                    "annotations": {
+                        "required": [
+                            "tagmanager.accounts.containers.tags.create"
+                        ]
+                    },
+                    "description": "GTM Tag Type.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "Trigger": {
+            "description": "Represents a Google Tag Manager Trigger",
+            "id": "Trigger",
+            "properties": {
+                "accountId": {
+                    "description": "GTM Account ID.",
+                    "type": "string"
+                },
+                "autoEventFilter": {
+                    "description": "Used in the case of auto event tracking.",
+                    "items": {
+                        "$ref": "Condition"
+                    },
+                    "type": "array"
+                },
+                "checkValidation": {
+                    "$ref": "Parameter",
+                    "description": "Whether or not we should only fire tags if the form submit or link click event is not cancelled by some other event handler (e.g. because of validation). Only valid for Form Submission and Link Click triggers."
+                },
+                "containerId": {
+                    "description": "GTM Container ID.",
+                    "type": "string"
+                },
+                "customEventFilter": {
+                    "description": "Used in the case of custom event, which is fired iff all Conditions are true.",
+                    "items": {
+                        "$ref": "Condition"
+                    },
+                    "type": "array"
+                },
+                "enableAllVideos": {
+                    "$ref": "Parameter",
+                    "description": "Reloads the videos in the page that don't already have the YT API enabled. If false, only capture events from videos that already have the API enabled. Only valid for YouTube triggers."
+                },
+                "eventName": {
+                    "$ref": "Parameter",
+                    "description": "Name of the GTM event that is fired. Only valid for Timer triggers."
+                },
+                "filter": {
+                    "description": "The trigger will only fire iff all Conditions are true.",
+                    "items": {
+                        "$ref": "Condition"
+                    },
+                    "type": "array"
+                },
+                "fingerprint": {
+                    "description": "The fingerprint of the GTM Trigger as computed at storage time. This value is recomputed whenever the trigger is modified.",
+                    "type": "string"
+                },
+                "interval": {
+                    "$ref": "Parameter",
+                    "description": "Time between triggering recurring Timer Events (in milliseconds). Only valid for Timer triggers."
+                },
+                "limit": {
+                    "$ref": "Parameter",
+                    "description": "Limit of the number of GTM events this Timer Trigger will fire. If no limit is set, we will continue to fire GTM events until the user leaves the page. Only valid for Timer triggers."
+                },
+                "name": {
+                    "annotations": {
+                        "required": [
+                            "tagmanager.accounts.containers.triggers.create"
+                        ]
+                    },
+                    "description": "Trigger display name.",
+                    "type": "string"
+                },
+                "triggerId": {
+                    "description": "The Trigger ID uniquely identifies the GTM Trigger.",
+                    "type": "string"
+                },
+                "type": {
+                    "annotations": {
+                        "required": [
+                            "tagmanager.accounts.containers.triggers.create"
+                        ]
+                    },
+                    "description": "Defines the data layer event that causes this trigger.",
+                    "enum": [
+                        "ajaxSubmission",
+                        "always",
+                        "click",
+                        "customEvent",
+                        "domReady",
+                        "formSubmission",
+                        "historyChange",
+                        "jsError",
+                        "linkClick",
+                        "pageview",
+                        "timer",
+                        "windowLoaded",
+                        "youTube"
+                    ],
+                    "enumDescriptions": [
+                        "",
+                        "",
+                        "",
+                        "",
+                        "",
+                        "",
+                        "",
+                        "",
+                        "",
+                        "",
+                        "",
+                        "",
+                        ""
+                    ],
+                    "type": "string"
+                },
+                "uniqueTriggerId": {
+                    "$ref": "Parameter",
+                    "description": "Globally unique id of the trigger that auto-generates this Form Submit or Link Click listeners if any. Used to make incompatible auto-events work together with trigger filtering based on trigger ids. This value is populated during output generation since the tags implied by triggers don't exist until then. Only valid for Form Submission and Link Click triggers."
+                },
+                "videoPercentageList": {
+                    "$ref": "Parameter",
+                    "description": "List of integer percentage values. The trigger will fire as each percentage is reached in any instrumented videos. Only valid for YouTube triggers."
+                },
+                "waitForTags": {
+                    "$ref": "Parameter",
+                    "description": "Whether or not we should delay the form submissions or link opening until all of the tags have fired (by preventing the default action and later simulating the default action). Only valid for Form Submission and Link Click triggers."
+                },
+                "waitForTagsTimeout": {
+                    "$ref": "Parameter",
+                    "description": "How long to wait (in milliseconds) for tags to fire when 'waits_for_tags' above evaluates to true. Only valid for Form Submission and Link Click triggers."
+                }
+            },
+            "type": "object"
+        },
+        "UserAccess": {
+            "description": "Represents a user's permissions to an account and its container.",
+            "id": "UserAccess",
+            "properties": {
+                "accountAccess": {
+                    "$ref": "AccountAccess",
+                    "annotations": {
+                        "required": [
+                            "tagmanager.accounts.permissions.create"
+                        ]
+                    },
+                    "description": "GTM Account access permissions."
+                },
+                "accountId": {
+                    "description": "GTM Account ID.",
+                    "type": "string"
+                },
+                "containerAccess": {
+                    "description": "GTM Container access permissions.",
+                    "items": {
+                        "$ref": "ContainerAccess"
+                    },
+                    "type": "array"
+                },
+                "emailAddress": {
+                    "annotations": {
+                        "required": [
+                            "tagmanager.accounts.permissions.create"
+                        ]
+                    },
+                    "description": "User's email address.",
+                    "type": "string"
+                },
+                "permissionId": {
+                    "description": "Account Permission ID.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "Variable": {
+            "description": "Represents a Google Tag Manager Variable.",
+            "id": "Variable",
+            "properties": {
+                "accountId": {
+                    "description": "GTM Account ID.",
+                    "type": "string"
+                },
+                "containerId": {
+                    "description": "GTM Container ID.",
+                    "type": "string"
+                },
+                "disablingTriggerId": {
+                    "description": "For mobile containers only: A list of trigger IDs for disabling conditional variables; the variable is enabled if one of the enabling trigger is true while all the disabling trigger are false. Treated as an unordered set.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "enablingTriggerId": {
+                    "description": "For mobile containers only: A list of trigger IDs for enabling conditional variables; the variable is enabled if one of the enabling triggers is true while all the disabling triggers are false. Treated as an unordered set.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "fingerprint": {
+                    "description": "The fingerprint of the GTM Variable as computed at storage time. This value is recomputed whenever the variable is modified.",
+                    "type": "string"
+                },
+                "name": {
+                    "annotations": {
+                        "required": [
+                            "tagmanager.accounts.containers.variables.create"
+                        ]
+                    },
+                    "description": "Variable display name.",
+                    "type": "string"
+                },
+                "notes": {
+                    "description": "User notes on how to apply this variable in the container.",
+                    "type": "string"
+                },
+                "parameter": {
+                    "description": "The variable's parameters.",
+                    "items": {
+                        "$ref": "Parameter"
+                    },
+                    "type": "array"
+                },
+                "scheduleEndMs": {
+                    "description": "The end timestamp in milliseconds to schedule a variable.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "scheduleStartMs": {
+                    "description": "The start timestamp in milliseconds to schedule a variable.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "type": {
+                    "annotations": {
+                        "required": [
+                            "tagmanager.accounts.containers.variables.create",
+                            "tagmanager.accounts.containers.variables.update"
+                        ]
+                    },
+                    "description": "GTM Variable Type.",
+                    "type": "string"
+                },
+                "variableId": {
+                    "description": "The Variable ID uniquely identifies the GTM Variable.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        }
+    },
+    "servicePath": "tagmanager/v1/",
+    "title": "Tag Manager API",
+    "version": "v1"
+}
\ No newline at end of file
diff --git a/discovery/googleapis/tasks__v1.json b/discovery/googleapis/tasks__v1.json
index 3261552..421dfc5 100644
--- a/discovery/googleapis/tasks__v1.json
+++ b/discovery/googleapis/tasks__v1.json
@@ -17,10 +17,10 @@
     "description": "Lets you manage your tasks and task lists.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/google-apps/tasks/firstapp",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/2OzpktTyb8G1n0lJqDrsLrojoIY\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/KGWAadJXyIQhHMwmLhtcS8SUf-4\"",
     "icons": {
-        "x16": "http://www.google.com/images/icons/product/tasks-16.png",
-        "x32": "http://www.google.com/images/icons/product/tasks-32.png"
+        "x16": "https://www.google.com/images/icons/product/tasks-16.png",
+        "x32": "https://www.google.com/images/icons/product/tasks-32.png"
     },
     "id": "tasks:v1",
     "kind": "discovery#restDescription",
@@ -515,7 +515,7 @@
             }
         }
     },
-    "revision": "20130403",
+    "revision": "20141024",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Task": {
diff --git a/discovery/googleapis_beta/autoscaler__v1beta2.json b/discovery/googleapis_beta/autoscaler__v1beta2.json
index fa2dc12..661a706 100644
--- a/discovery/googleapis_beta/autoscaler__v1beta2.json
+++ b/discovery/googleapis_beta/autoscaler__v1beta2.json
@@ -17,7 +17,7 @@
     "description": "The Google Compute Engine Autoscaler API provides autoscaling for groups of Cloud VMs.",
     "discoveryVersion": "v1",
     "documentationLink": "http://developers.google.com/compute/docs/autoscaler",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/mXaVlrmfb2VNKELCD4Zc-7YB4IU\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/5UzSOWUO3ZYn_NUebnJd-hd4w8w\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -438,9 +438,53 @@
                     ]
                 }
             }
+        },
+        "zones": {
+            "methods": {
+                "list": {
+                    "description": "",
+                    "httpMethod": "GET",
+                    "id": "autoscaler.zones.list",
+                    "parameterOrder": [
+                        "project"
+                    ],
+                    "parameters": {
+                        "filter": {
+                            "location": "query",
+                            "type": "string"
+                        },
+                        "maxResults": {
+                            "default": "500",
+                            "format": "uint32",
+                            "location": "query",
+                            "maximum": "500",
+                            "minimum": "0",
+                            "type": "integer"
+                        },
+                        "pageToken": {
+                            "location": "query",
+                            "type": "string"
+                        },
+                        "project": {
+                            "location": "path",
+                            "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "{project}/zones",
+                    "response": {
+                        "$ref": "ZoneList"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/compute",
+                        "https://www.googleapis.com/auth/compute.readonly"
+                    ]
+                }
+            }
         }
     },
-    "revision": "20141013",
+    "revision": "20141024",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Autoscaler": {
@@ -587,6 +631,27 @@
             },
             "type": "object"
         },
+        "DeprecationStatus": {
+            "id": "DeprecationStatus",
+            "properties": {
+                "deleted": {
+                    "type": "string"
+                },
+                "deprecated": {
+                    "type": "string"
+                },
+                "obsolete": {
+                    "type": "string"
+                },
+                "replacement": {
+                    "type": "string"
+                },
+                "state": {
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
         "Operation": {
             "id": "Operation",
             "properties": {
@@ -734,6 +799,90 @@
                 }
             },
             "type": "object"
+        },
+        "Zone": {
+            "id": "Zone",
+            "properties": {
+                "creationTimestamp": {
+                    "type": "string"
+                },
+                "deprecated": {
+                    "$ref": "DeprecationStatus"
+                },
+                "description": {
+                    "type": "string"
+                },
+                "id": {
+                    "format": "uint64",
+                    "type": "string"
+                },
+                "kind": {
+                    "default": "autoscaler#zone",
+                    "description": "Type of the resource.",
+                    "type": "string"
+                },
+                "maintenanceWindows": {
+                    "items": {
+                        "properties": {
+                            "beginTime": {
+                                "type": "string"
+                            },
+                            "description": {
+                                "type": "string"
+                            },
+                            "endTime": {
+                                "type": "string"
+                            },
+                            "name": {
+                                "type": "string"
+                            }
+                        },
+                        "type": "object"
+                    },
+                    "type": "array"
+                },
+                "name": {
+                    "type": "string"
+                },
+                "region": {
+                    "type": "string"
+                },
+                "selfLink": {
+                    "description": "Server defined URL for the resource (output only).",
+                    "type": "string"
+                },
+                "status": {
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "ZoneList": {
+            "id": "ZoneList",
+            "properties": {
+                "id": {
+                    "type": "string"
+                },
+                "items": {
+                    "items": {
+                        "$ref": "Zone"
+                    },
+                    "type": "array"
+                },
+                "kind": {
+                    "default": "autoscaler#zoneList",
+                    "description": "Type of resource.",
+                    "type": "string"
+                },
+                "nextPageToken": {
+                    "type": "string"
+                },
+                "selfLink": {
+                    "description": "Server defined URL for this resource (output only).",
+                    "type": "string"
+                }
+            },
+            "type": "object"
         }
     },
     "servicePath": "autoscaler/v1beta2/",
diff --git a/discovery/googleapis_beta/cloudmonitoring__v2beta1.json b/discovery/googleapis_beta/cloudmonitoring__v2beta1.json
index f804d8b..747a810 100644
--- a/discovery/googleapis_beta/cloudmonitoring__v2beta1.json
+++ b/discovery/googleapis_beta/cloudmonitoring__v2beta1.json
@@ -15,7 +15,7 @@
     "description": "API for accessing Google Cloud and API monitoring data.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/cloud-monitoring/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/I5Av_yaMSSyYMM_MBNIflh0DmG8\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/5LmbKArdAmdomrkIZXAniXdeq9c\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -274,7 +274,7 @@
             }
         }
     },
-    "revision": "20141010",
+    "revision": "20140929",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "ListMetricDescriptorsRequest": {
diff --git a/discovery/googleapis_beta/container__v1beta1.json b/discovery/googleapis_beta/container__v1beta1.json
new file mode 100644
index 0000000..7819777
--- /dev/null
+++ b/discovery/googleapis_beta/container__v1beta1.json
@@ -0,0 +1,570 @@
+{
+    "auth": {
+        "oauth2": {
+            "scopes": {
+                "https://www.googleapis.com/auth/cloud-platform": {
+                    "description": "View and manage your data across Google Cloud Platform services"
+                }
+            }
+        }
+    },
+    "basePath": "/container/v1beta1/projects/",
+    "baseUrl": "https://www.googleapis.com/container/v1beta1/projects/",
+    "batchPath": "batch",
+    "description": "The Google Container Engine API is used for building and managing container based applications, powered by the open source Kubernetes technology.",
+    "discoveryVersion": "v1",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/ZrZBeDfQYPqAxFURJt0IhCOLUHQ\"",
+    "icons": {
+        "x16": "http://www.google.com/images/icons/product/search-16.gif",
+        "x32": "http://www.google.com/images/icons/product/search-32.gif"
+    },
+    "id": "container:v1beta1",
+    "kind": "discovery#restDescription",
+    "name": "container",
+    "ownerDomain": "google.com",
+    "ownerName": "Google",
+    "parameters": {
+        "alt": {
+            "default": "json",
+            "description": "Data format for the response.",
+            "enum": [
+                "json"
+            ],
+            "enumDescriptions": [
+                "Responses with Content-Type of application/json"
+            ],
+            "location": "query",
+            "type": "string"
+        },
+        "fields": {
+            "description": "Selector specifying which fields to include in a partial response.",
+            "location": "query",
+            "type": "string"
+        },
+        "key": {
+            "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+            "location": "query",
+            "type": "string"
+        },
+        "oauth_token": {
+            "description": "OAuth 2.0 token for the current user.",
+            "location": "query",
+            "type": "string"
+        },
+        "prettyPrint": {
+            "default": "true",
+            "description": "Returns response with indentations and line breaks.",
+            "location": "query",
+            "type": "boolean"
+        },
+        "quotaUser": {
+            "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.",
+            "location": "query",
+            "type": "string"
+        },
+        "userIp": {
+            "description": "IP address of the site where the request originates. Use this if you want to enforce per-user limits.",
+            "location": "query",
+            "type": "string"
+        }
+    },
+    "protocol": "rest",
+    "resources": {
+        "projects": {
+            "resources": {
+                "clusters": {
+                    "methods": {
+                        "list": {
+                            "description": "Lists all clusters owned by a project across all zones.",
+                            "httpMethod": "GET",
+                            "id": "container.projects.clusters.list",
+                            "parameterOrder": [
+                                "projectId"
+                            ],
+                            "parameters": {
+                                "projectId": {
+                                    "description": "The Google Developers Console project ID or  project number.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "{projectId}/clusters",
+                            "response": {
+                                "$ref": "ListAggregatedClustersResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/cloud-platform"
+                            ]
+                        }
+                    }
+                },
+                "operations": {
+                    "methods": {
+                        "list": {
+                            "description": "Lists all operations in a project, across all zones.",
+                            "httpMethod": "GET",
+                            "id": "container.projects.operations.list",
+                            "parameterOrder": [
+                                "projectId"
+                            ],
+                            "parameters": {
+                                "projectId": {
+                                    "description": "The Google Developers Console project ID or  project number.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "{projectId}/operations",
+                            "response": {
+                                "$ref": "ListAggregatedOperationsResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/cloud-platform"
+                            ]
+                        }
+                    }
+                },
+                "zones": {
+                    "resources": {
+                        "clusters": {
+                            "methods": {
+                                "create": {
+                                    "description": "Creates a cluster, consisting of the specified number and type of Google Compute Engine instances, plus a Kubernetes master instance.\n\nThe cluster is created in the project's default network.\n\nA firewall is added that allows traffic into port 443 on the master, which enables HTTPS. A firewall and a route is added for each node to allow the containers on that node to communicate with all other instances in the cluster.\n\nFinally, a route named k8s-iproute-10-xx-0-0 is created to track that the cluster's 10.xx.0.0/16 CIDR has been assigned.",
+                                    "httpMethod": "POST",
+                                    "id": "container.projects.zones.clusters.create",
+                                    "parameterOrder": [
+                                        "projectId",
+                                        "zoneId"
+                                    ],
+                                    "parameters": {
+                                        "projectId": {
+                                            "description": "The Google Developers Console project ID or  project number.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "zoneId": {
+                                            "description": "The name of the Google Compute Engine zone in which the cluster resides.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "{projectId}/zones/{zoneId}/clusters",
+                                    "request": {
+                                        "$ref": "CreateClusterRequest"
+                                    },
+                                    "response": {
+                                        "$ref": "Operation"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/cloud-platform"
+                                    ]
+                                },
+                                "delete": {
+                                    "description": "Deletes the cluster, including the Kubernetes master and all worker nodes.\n\nFirewalls and routes that were configured at cluster creation are also deleted.",
+                                    "httpMethod": "DELETE",
+                                    "id": "container.projects.zones.clusters.delete",
+                                    "parameterOrder": [
+                                        "projectId",
+                                        "zoneId",
+                                        "clusterId"
+                                    ],
+                                    "parameters": {
+                                        "clusterId": {
+                                            "description": "The name of the cluster to delete.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "projectId": {
+                                            "description": "The Google Developers Console project ID or  project number.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "zoneId": {
+                                            "description": "The name of the Google Compute Engine zone in which the cluster resides.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "{projectId}/zones/{zoneId}/clusters/{clusterId}",
+                                    "response": {
+                                        "$ref": "Operation"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/cloud-platform"
+                                    ]
+                                },
+                                "get": {
+                                    "description": "Gets a specific cluster.",
+                                    "httpMethod": "GET",
+                                    "id": "container.projects.zones.clusters.get",
+                                    "parameterOrder": [
+                                        "projectId",
+                                        "zoneId",
+                                        "clusterId"
+                                    ],
+                                    "parameters": {
+                                        "clusterId": {
+                                            "description": "The name of the cluster to retrieve.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "projectId": {
+                                            "description": "The Google Developers Console project ID or  project number.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "zoneId": {
+                                            "description": "The name of the Google Compute Engine zone in which the cluster resides.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "{projectId}/zones/{zoneId}/clusters/{clusterId}",
+                                    "response": {
+                                        "$ref": "Cluster"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/cloud-platform"
+                                    ]
+                                },
+                                "list": {
+                                    "description": "Lists all clusters owned by a project in the specified zone.",
+                                    "httpMethod": "GET",
+                                    "id": "container.projects.zones.clusters.list",
+                                    "parameterOrder": [
+                                        "projectId",
+                                        "zoneId"
+                                    ],
+                                    "parameters": {
+                                        "projectId": {
+                                            "description": "The Google Developers Console project ID or  project number.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "zoneId": {
+                                            "description": "The name of the Google Compute Engine zone in which the cluster resides.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "{projectId}/zones/{zoneId}/clusters",
+                                    "response": {
+                                        "$ref": "ListClustersResponse"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/cloud-platform"
+                                    ]
+                                }
+                            }
+                        },
+                        "operations": {
+                            "methods": {
+                                "get": {
+                                    "description": "Gets the specified operation.",
+                                    "httpMethod": "GET",
+                                    "id": "container.projects.zones.operations.get",
+                                    "parameterOrder": [
+                                        "projectId",
+                                        "zoneId",
+                                        "operationId"
+                                    ],
+                                    "parameters": {
+                                        "operationId": {
+                                            "description": "The server-assigned name of the operation.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "projectId": {
+                                            "description": "The Google Developers Console project ID or  project number.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "zoneId": {
+                                            "description": "The name of the Google Compute Engine zone in which the operation resides. This is always the same zone as the cluster with which the operation is associated.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "{projectId}/zones/{zoneId}/operations/{operationId}",
+                                    "response": {
+                                        "$ref": "Operation"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/cloud-platform"
+                                    ]
+                                },
+                                "list": {
+                                    "description": "Lists all operations in a project in a specific zone.",
+                                    "httpMethod": "GET",
+                                    "id": "container.projects.zones.operations.list",
+                                    "parameterOrder": [
+                                        "projectId",
+                                        "zoneId"
+                                    ],
+                                    "parameters": {
+                                        "projectId": {
+                                            "description": "The Google Developers Console project ID or  project number.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        },
+                                        "zoneId": {
+                                            "description": "The name of the Google Compute Engine zone to return operations for.",
+                                            "location": "path",
+                                            "required": true,
+                                            "type": "string"
+                                        }
+                                    },
+                                    "path": "{projectId}/zones/{zoneId}/operations",
+                                    "response": {
+                                        "$ref": "ListOperationsResponse"
+                                    },
+                                    "scopes": [
+                                        "https://www.googleapis.com/auth/cloud-platform"
+                                    ]
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    },
+    "revision": "20141103",
+    "rootUrl": "https://www.googleapis.com/",
+    "schemas": {
+        "Cluster": {
+            "id": "Cluster",
+            "properties": {
+                "clusterApiVersion": {
+                    "description": "The API version of the Kubernetes master and kubelets running in this cluster. Allowed value is 0.4.2, or leave blank to pick up the latest stable release.",
+                    "type": "string"
+                },
+                "containerIpv4Cidr": {
+                    "description": "[Output only] The IP addresses of the container pods in this cluster, in  CIDR notation (e.g. 1.2.3.4/29).",
+                    "type": "string"
+                },
+                "creationTimestamp": {
+                    "description": "[Output only] The time the cluster was created, in RFC3339 text format.",
+                    "type": "string"
+                },
+                "description": {
+                    "description": "An optional description of this cluster.",
+                    "type": "string"
+                },
+                "endpoint": {
+                    "description": "[Output only] The IP address of this cluster's Kubernetes master. The endpoint can be accessed from the internet at https://username:password@endpoint/.\n\nSee the masterAuth property of this resource for username and password information.",
+                    "type": "string"
+                },
+                "masterAuth": {
+                    "$ref": "MasterAuth",
+                    "description": "The HTTP basic authentication information for accessing the master. Because the master endpoint is open to the internet, you should create a strong password."
+                },
+                "name": {
+                    "description": "The name of this cluster. The name must be unique within this project and zone, and can be up to 40 characters with the following restrictions:  \n- Lowercase letters, numbers, and hyphens only.\n- Must start with a letter.\n- Must end with a number or a letter.",
+                    "type": "string"
+                },
+                "nodeConfig": {
+                    "$ref": "NodeConfig",
+                    "description": "The machine type and image to use for all nodes in this cluster. See the descriptions of the child properties of nodeConfig."
+                },
+                "nodeRoutingPrefixSize": {
+                    "description": "[Output only] The size of the address space on each node for hosting containers.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "numNodes": {
+                    "description": "The number of nodes to create in this cluster. You must ensure that your Compute Engine resource quota is sufficient for this number of instances plus one (to include the master). You must also have available firewall and routes quota.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "servicesIpv4Cidr": {
+                    "description": "[Output only] The IP addresses of the Kubernetes services in this cluster, in  CIDR notation (e.g. 1.2.3.4/29). Service addresses are always in the 10.0.0.0/16 range.",
+                    "type": "string"
+                },
+                "status": {
+                    "description": "[Output only] The current status of this cluster.",
+                    "enum": [
+                        "error",
+                        "provisioning",
+                        "running",
+                        "stopping"
+                    ],
+                    "enumDescriptions": [
+                        "",
+                        "",
+                        "",
+                        ""
+                    ],
+                    "type": "string"
+                },
+                "statusMessage": {
+                    "description": "[Output only] Additional information about the current status of this cluster, if available.",
+                    "type": "string"
+                },
+                "zone": {
+                    "description": "[Output only] The name of the Google Compute Engine zone in which the cluster resides.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "CreateClusterRequest": {
+            "id": "CreateClusterRequest",
+            "properties": {
+                "cluster": {
+                    "$ref": "Cluster",
+                    "description": "A cluster resource."
+                }
+            },
+            "type": "object"
+        },
+        "ListAggregatedClustersResponse": {
+            "id": "ListAggregatedClustersResponse",
+            "properties": {
+                "clusters": {
+                    "description": "A list of clusters in the project, across all zones.",
+                    "items": {
+                        "$ref": "Cluster"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "ListAggregatedOperationsResponse": {
+            "id": "ListAggregatedOperationsResponse",
+            "properties": {
+                "operations": {
+                    "description": "A list of operations in the project, across all zones.",
+                    "items": {
+                        "$ref": "Operation"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "ListClustersResponse": {
+            "id": "ListClustersResponse",
+            "properties": {
+                "clusters": {
+                    "description": "A list of clusters in the project in the specified zone.",
+                    "items": {
+                        "$ref": "Cluster"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "ListOperationsResponse": {
+            "id": "ListOperationsResponse",
+            "properties": {
+                "operations": {
+                    "description": "A list of operations in the project in the specified zone.",
+                    "items": {
+                        "$ref": "Operation"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "MasterAuth": {
+            "id": "MasterAuth",
+            "properties": {
+                "password": {
+                    "description": "The password to use when accessing the Kubernetes master endpoint.",
+                    "type": "string"
+                },
+                "user": {
+                    "description": "The username to use when accessing the Kubernetes master endpoint.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "NodeConfig": {
+            "id": "NodeConfig",
+            "properties": {
+                "machineType": {
+                    "description": "The name of a Google Compute Engine machine type (e.g. n1-standard-1).\n\nIf unspecified, the default machine type is n1-standard-1.",
+                    "type": "string"
+                },
+                "sourceImage": {
+                    "description": "The fully-specified name of a Google Compute Engine image. For example: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/backports-debian-7-wheezy-vYYYYMMDD (where YYYMMDD is the version date).\n\nIf specifying an image, you are responsible for ensuring its compatibility with the Debian 7 backports image. We recommend leaving this field blank to accept the default backports-debian-7-wheezy value.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "Operation": {
+            "description": "Defines the operation resource. All fields are output only.",
+            "id": "Operation",
+            "properties": {
+                "errorMessage": {
+                    "description": "If an error has occurred, a textual description of the error.",
+                    "type": "string"
+                },
+                "name": {
+                    "description": "The server-assigned ID for this operation. If the operation is fulfilled upfront, it may not have a resource name.",
+                    "type": "string"
+                },
+                "operationType": {
+                    "description": "The operation type.",
+                    "enum": [
+                        "createCluster",
+                        "deleteCluster"
+                    ],
+                    "enumDescriptions": [
+                        "",
+                        ""
+                    ],
+                    "type": "string"
+                },
+                "status": {
+                    "description": "The current status of the operation.",
+                    "enum": [
+                        "done",
+                        "pending",
+                        "running"
+                    ],
+                    "enumDescriptions": [
+                        "",
+                        "",
+                        ""
+                    ],
+                    "type": "string"
+                },
+                "target": {
+                    "description": "[Optional] The URL of the cluster resource that this operation is associated with.",
+                    "type": "string"
+                },
+                "zone": {
+                    "description": "The name of the Google Compute Engine zone in which the operation is taking place.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        }
+    },
+    "servicePath": "container/v1beta1/projects/",
+    "title": "Google Container Engine API",
+    "version": "v1beta1"
+}
\ No newline at end of file
diff --git a/discovery/googleapis_beta/genomics__v1beta.json b/discovery/googleapis_beta/genomics__v1beta.json
index 18b851a..5e2dca8 100644
--- a/discovery/googleapis_beta/genomics__v1beta.json
+++ b/discovery/googleapis_beta/genomics__v1beta.json
@@ -23,7 +23,7 @@
     "description": "Provides access to Genomics data.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/genomics/v1beta/reference",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/QFkFkv2LMi0ob1p4dyYfQYJIVYc\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/xe5Z99J2tlpBm9VuKqX5fLUBm4I\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -80,46 +80,6 @@
     },
     "protocol": "rest",
     "resources": {
-        "beacons": {
-            "methods": {
-                "get": {
-                    "description": "This is an experimental API that provides a Global Alliance for Genomics and Health Beacon. It may change at any time.",
-                    "httpMethod": "GET",
-                    "id": "genomics.beacons.get",
-                    "parameterOrder": [
-                        "variantSetId"
-                    ],
-                    "parameters": {
-                        "allele": {
-                            "description": "Required. The allele to look for ('A', 'C', 'G' or 'T').",
-                            "location": "query",
-                            "type": "string"
-                        },
-                        "position": {
-                            "description": "Required. The 0-based position to query.",
-                            "format": "int64",
-                            "location": "query",
-                            "type": "string"
-                        },
-                        "referenceName": {
-                            "description": "Required. The reference to query over.",
-                            "location": "query",
-                            "type": "string"
-                        },
-                        "variantSetId": {
-                            "description": "The ID of the variant set to query over. It must be public. Private variant sets will return an unauthorized exception.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        }
-                    },
-                    "path": "beacons/{variantSetId}",
-                    "response": {
-                        "$ref": "Beacon"
-                    }
-                }
-            }
-        },
         "callsets": {
             "methods": {
                 "create": {
@@ -146,7 +106,7 @@
                     ],
                     "parameters": {
                         "callSetId": {
-                            "description": "The ID of the callset to be deleted.",
+                            "description": "The ID of the call set to be deleted.",
                             "location": "path",
                             "required": true,
                             "type": "string"
@@ -166,7 +126,7 @@
                     ],
                     "parameters": {
                         "callSetId": {
-                            "description": "The ID of the callset.",
+                            "description": "The ID of the call set.",
                             "location": "path",
                             "required": true,
                             "type": "string"
@@ -190,7 +150,7 @@
                     ],
                     "parameters": {
                         "callSetId": {
-                            "description": "The ID of the callset to be updated.",
+                            "description": "The ID of the call set to be updated.",
                             "location": "path",
                             "required": true,
                             "type": "string"
@@ -208,7 +168,7 @@
                     ]
                 },
                 "search": {
-                    "description": "Gets a list of call sets matching the criteria.",
+                    "description": "Gets a list of call sets matching the criteria.\n\nImplements GlobalAllianceApi.searchCallSets.",
                     "httpMethod": "POST",
                     "id": "genomics.callsets.search",
                     "path": "callsets/search",
@@ -232,7 +192,7 @@
                     ],
                     "parameters": {
                         "callSetId": {
-                            "description": "The ID of the callset to be updated.",
+                            "description": "The ID of the call set to be updated.",
                             "location": "path",
                             "required": true,
                             "type": "string"
@@ -821,7 +781,7 @@
                     ]
                 },
                 "import": {
-                    "description": "Creates variant data by asynchronously importing the provided information. The variants for import will be merged with any existing data and each other according to the behavior of mergeVariants. In particular, this means for merged VCF variants that have conflicting INFO fields, some data will be arbitrarily discarded. As a special case, for single-sample VCF files, QUAL and FILTER fields will be moved to the call level; these are sometimes interpreted in a call-specific context. Imported VCF headers are appended to the metadata already in a VariantSet.",
+                    "description": "Creates variant data by asynchronously importing the provided information. The variants for import will be merged with any existing data and each other according to the behavior of mergeVariants. In particular, this means for merged VCF variants that have conflicting INFO fields, some data will be arbitrarily discarded. As a special case, for single-sample VCF files, QUAL and FILTER fields will be moved to the call level; these are sometimes interpreted in a call-specific context. Imported VCF headers are appended to the metadata already in a variant set.",
                     "httpMethod": "POST",
                     "id": "genomics.variants.import",
                     "path": "variants/import",
@@ -837,7 +797,7 @@
                     ]
                 },
                 "search": {
-                    "description": "Gets a list of variants matching the criteria.",
+                    "description": "Gets a list of variants matching the criteria.\n\nImplements GlobalAllianceApi.searchVariants.",
                     "httpMethod": "POST",
                     "id": "genomics.variants.search",
                     "path": "variants/search",
@@ -947,7 +907,7 @@
                     }
                 },
                 "patch": {
-                    "description": "Updates a variant set's metadata. All other modifications are silently ignored. Returns the modified variant set. This method supports patch semantics.",
+                    "description": "Updates a variant set's metadata. All other modifications are silently ignored. This method supports patch semantics.",
                     "httpMethod": "PATCH",
                     "id": "genomics.variantsets.patch",
                     "parameterOrder": [
@@ -973,7 +933,7 @@
                     ]
                 },
                 "search": {
-                    "description": "Returns a list of all variant sets matching search criteria.",
+                    "description": "Returns a list of all variant sets matching search criteria.\n\nImplements GlobalAllianceApi.searchVariantSets.",
                     "httpMethod": "POST",
                     "id": "genomics.variantsets.search",
                     "path": "variantsets/search",
@@ -989,7 +949,7 @@
                     ]
                 },
                 "update": {
-                    "description": "Updates a variant set's metadata. All other modifications are silently ignored. Returns the modified variant set.",
+                    "description": "Updates a variant set's metadata. All other modifications are silently ignored.",
                     "httpMethod": "PUT",
                     "id": "genomics.variantsets.update",
                     "parameterOrder": [
@@ -1017,22 +977,11 @@
             }
         }
     },
-    "revision": "20141015",
+    "revision": "20141028",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
-        "Beacon": {
-            "description": "A beacon represents whether any variant call in a variant set has a specific allele at a particular position.",
-            "id": "Beacon",
-            "properties": {
-                "exists": {
-                    "description": "True if the allele exists on any variant call, false otherwise.",
-                    "type": "boolean"
-                }
-            },
-            "type": "object"
-        },
         "Call": {
-            "description": "A Call represents the determination of genotype with respect to a particular variant. It may include associated information such as quality and phasing. For example, a Call might assign a probability of 0.32 to the occurrence of a SNP named rs1234 in a call set with the name NA12345.",
+            "description": "A call represents the determination of genotype with respect to a particular variant. It may include associated information such as quality and phasing. For example, a call might assign a probability of 0.32 to the occurrence of a SNP named rs1234 in a call set with the name NA12345.",
             "id": "Call",
             "properties": {
                 "callSetId": {
@@ -1078,7 +1027,7 @@
             "type": "object"
         },
         "CallSet": {
-            "description": "A CallSet is a collection of variant calls. It belongs to a variant set.",
+            "description": "A call set is a collection of variant calls, typically for one sample. It belongs to a variant set.",
             "id": "CallSet",
             "properties": {
                 "created": {
@@ -1098,11 +1047,11 @@
                         },
                         "type": "array"
                     },
-                    "description": "A map of additional callset information.",
+                    "description": "A map of additional call set information.",
                     "type": "object"
                 },
                 "name": {
-                    "description": "The callset name.",
+                    "description": "The call set name.",
                     "type": "string"
                 },
                 "sampleId": {
@@ -1164,11 +1113,11 @@
             "id": "ExperimentalCreateJobRequest",
             "properties": {
                 "align": {
-                    "description": "Specifies whether or not to run the alignment pipeline. At least one of align or callVariants must be provided.",
+                    "description": "Specifies whether or not to run the alignment pipeline. Either align or callVariants must be set.",
                     "type": "boolean"
                 },
                 "callVariants": {
-                    "description": "Specifies whether or not to run the variant calling pipeline. If specified, alignment will be performed first and the aligned BAMs will passed as input to the variant caller. At least one of align or callVariants must be provided.",
+                    "description": "Specifies whether or not to run the variant calling pipeline. Either align or callVariants must be set.",
                     "type": "boolean"
                 },
                 "gcsOutputPath": {
@@ -1549,6 +1498,8 @@
                 "type": {
                     "description": "The original request type.",
                     "enum": [
+                        "alignReadsets",
+                        "callReadsets",
                         "experimentalCreateJob",
                         "exportReadsets",
                         "exportVariants",
@@ -1562,6 +1513,8 @@
                         "",
                         "",
                         "",
+                        "",
+                        "",
                         ""
                     ],
                     "type": "string"
@@ -2245,7 +2198,7 @@
             "type": "object"
         },
         "Variant": {
-            "description": "A Variant represents a change in DNA sequence relative to some reference. For example, a Variant could represent a SNP or an insertion. Variants belong to a variant set.",
+            "description": "A variant represents a change in DNA sequence relative to a reference sequence. For example, a variant could represent a SNP or an insertion. Variants belong to a variant set. Each of the calls on a variant represent a determination of genotype with respect to that variant. For example, a call might assign probability of 0.32 to the occurrence of a SNP named rs1234 in a sample named NA12345. A call belongs to a call set, which contains related calls typically from one sample.",
             "id": "Variant",
             "properties": {
                 "alternateBases": {
@@ -2327,7 +2280,7 @@
             "type": "object"
         },
         "VariantSet": {
-            "description": "A VariantSet represents a collection of Variants and their summary statistics.",
+            "description": "A variant set is a collection of call sets and variants. It contains summary statistics of those contents. A variant set belongs to a dataset.",
             "id": "VariantSet",
             "properties": {
                 "datasetId": {
diff --git a/discovery/googleapis_beta/genomics__v1beta2.json b/discovery/googleapis_beta/genomics__v1beta2.json
new file mode 100644
index 0000000..425b981
--- /dev/null
+++ b/discovery/googleapis_beta/genomics__v1beta2.json
@@ -0,0 +1,2895 @@
+{
+    "auth": {
+        "oauth2": {
+            "scopes": {
+                "https://www.googleapis.com/auth/bigquery": {
+                    "description": "View and manage your data in Google BigQuery"
+                },
+                "https://www.googleapis.com/auth/devstorage.read_write": {
+                    "description": "Manage your data in Google Cloud Storage"
+                },
+                "https://www.googleapis.com/auth/genomics": {
+                    "description": "View and manage Genomics data"
+                },
+                "https://www.googleapis.com/auth/genomics.readonly": {
+                    "description": "View Genomics data"
+                }
+            }
+        }
+    },
+    "basePath": "/genomics/v1beta2/",
+    "baseUrl": "https://www.googleapis.com/genomics/v1beta2/",
+    "batchPath": "batch",
+    "description": "Provides access to Genomics data.",
+    "discoveryVersion": "v1",
+    "documentationLink": "https://developers.google.com/genomics/v1beta2/reference",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/EKP2HqTiCFaMtGY4TKqgoDAIFBQ\"",
+    "icons": {
+        "x16": "http://www.google.com/images/icons/product/search-16.gif",
+        "x32": "http://www.google.com/images/icons/product/search-32.gif"
+    },
+    "id": "genomics:v1beta2",
+    "kind": "discovery#restDescription",
+    "name": "genomics",
+    "ownerDomain": "google.com",
+    "ownerName": "Google",
+    "parameters": {
+        "alt": {
+            "default": "json",
+            "description": "Data format for the response.",
+            "enum": [
+                "json"
+            ],
+            "enumDescriptions": [
+                "Responses with Content-Type of application/json"
+            ],
+            "location": "query",
+            "type": "string"
+        },
+        "fields": {
+            "description": "Selector specifying which fields to include in a partial response.",
+            "location": "query",
+            "type": "string"
+        },
+        "key": {
+            "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+            "location": "query",
+            "type": "string"
+        },
+        "oauth_token": {
+            "description": "OAuth 2.0 token for the current user.",
+            "location": "query",
+            "type": "string"
+        },
+        "prettyPrint": {
+            "default": "true",
+            "description": "Returns response with indentations and line breaks.",
+            "location": "query",
+            "type": "boolean"
+        },
+        "quotaUser": {
+            "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.",
+            "location": "query",
+            "type": "string"
+        },
+        "userIp": {
+            "description": "IP address of the site where the request originates. Use this if you want to enforce per-user limits.",
+            "location": "query",
+            "type": "string"
+        }
+    },
+    "protocol": "rest",
+    "resources": {
+        "callsets": {
+            "methods": {
+                "create": {
+                    "description": "Creates a new call set.",
+                    "httpMethod": "POST",
+                    "id": "genomics.callsets.create",
+                    "path": "callsets",
+                    "request": {
+                        "$ref": "CallSet"
+                    },
+                    "response": {
+                        "$ref": "CallSet"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                },
+                "delete": {
+                    "description": "Deletes a call set.",
+                    "httpMethod": "DELETE",
+                    "id": "genomics.callsets.delete",
+                    "parameterOrder": [
+                        "callSetId"
+                    ],
+                    "parameters": {
+                        "callSetId": {
+                            "description": "The ID of the call set to be deleted.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "callsets/{callSetId}",
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                },
+                "get": {
+                    "description": "Gets a call set by ID.",
+                    "httpMethod": "GET",
+                    "id": "genomics.callsets.get",
+                    "parameterOrder": [
+                        "callSetId"
+                    ],
+                    "parameters": {
+                        "callSetId": {
+                            "description": "The ID of the call set.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "callsets/{callSetId}",
+                    "response": {
+                        "$ref": "CallSet"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics",
+                        "https://www.googleapis.com/auth/genomics.readonly"
+                    ]
+                },
+                "patch": {
+                    "description": "Updates a call set. This method supports patch semantics.",
+                    "httpMethod": "PATCH",
+                    "id": "genomics.callsets.patch",
+                    "parameterOrder": [
+                        "callSetId"
+                    ],
+                    "parameters": {
+                        "callSetId": {
+                            "description": "The ID of the call set to be updated.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "callsets/{callSetId}",
+                    "request": {
+                        "$ref": "CallSet"
+                    },
+                    "response": {
+                        "$ref": "CallSet"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                },
+                "search": {
+                    "description": "Gets a list of call sets matching the criteria.\n\nImplements GlobalAllianceApi.searchCallSets.",
+                    "httpMethod": "POST",
+                    "id": "genomics.callsets.search",
+                    "path": "callsets/search",
+                    "request": {
+                        "$ref": "SearchCallSetsRequest"
+                    },
+                    "response": {
+                        "$ref": "SearchCallSetsResponse"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics",
+                        "https://www.googleapis.com/auth/genomics.readonly"
+                    ]
+                },
+                "update": {
+                    "description": "Updates a call set.",
+                    "httpMethod": "PUT",
+                    "id": "genomics.callsets.update",
+                    "parameterOrder": [
+                        "callSetId"
+                    ],
+                    "parameters": {
+                        "callSetId": {
+                            "description": "The ID of the call set to be updated.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "callsets/{callSetId}",
+                    "request": {
+                        "$ref": "CallSet"
+                    },
+                    "response": {
+                        "$ref": "CallSet"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                }
+            }
+        },
+        "datasets": {
+            "methods": {
+                "create": {
+                    "description": "Creates a new dataset.",
+                    "httpMethod": "POST",
+                    "id": "genomics.datasets.create",
+                    "path": "datasets",
+                    "request": {
+                        "$ref": "Dataset"
+                    },
+                    "response": {
+                        "$ref": "Dataset"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                },
+                "delete": {
+                    "description": "Deletes a dataset.",
+                    "httpMethod": "DELETE",
+                    "id": "genomics.datasets.delete",
+                    "parameterOrder": [
+                        "datasetId"
+                    ],
+                    "parameters": {
+                        "datasetId": {
+                            "description": "The ID of the dataset to be deleted.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "datasets/{datasetId}",
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                },
+                "get": {
+                    "description": "Gets a dataset by ID.",
+                    "httpMethod": "GET",
+                    "id": "genomics.datasets.get",
+                    "parameterOrder": [
+                        "datasetId"
+                    ],
+                    "parameters": {
+                        "datasetId": {
+                            "description": "The ID of the dataset.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "datasets/{datasetId}",
+                    "response": {
+                        "$ref": "Dataset"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics",
+                        "https://www.googleapis.com/auth/genomics.readonly"
+                    ]
+                },
+                "list": {
+                    "description": "Lists all datasets.",
+                    "httpMethod": "GET",
+                    "id": "genomics.datasets.list",
+                    "parameters": {
+                        "pageSize": {
+                            "default": "50",
+                            "description": "The maximum number of results returned by this request.",
+                            "format": "int32",
+                            "location": "query",
+                            "type": "integer"
+                        },
+                        "pageToken": {
+                            "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response.",
+                            "location": "query",
+                            "type": "string"
+                        },
+                        "projectNumber": {
+                            "description": "Only return datasets which belong to this Google Developers Console project. Only accepts project numbers. Returns all public projects if no project number is specified.",
+                            "format": "int64",
+                            "location": "query",
+                            "type": "string"
+                        }
+                    },
+                    "path": "datasets",
+                    "response": {
+                        "$ref": "ListDatasetsResponse"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics",
+                        "https://www.googleapis.com/auth/genomics.readonly"
+                    ]
+                },
+                "patch": {
+                    "description": "Updates a dataset. This method supports patch semantics.",
+                    "httpMethod": "PATCH",
+                    "id": "genomics.datasets.patch",
+                    "parameterOrder": [
+                        "datasetId"
+                    ],
+                    "parameters": {
+                        "datasetId": {
+                            "description": "The ID of the dataset to be updated.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "datasets/{datasetId}",
+                    "request": {
+                        "$ref": "Dataset"
+                    },
+                    "response": {
+                        "$ref": "Dataset"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                },
+                "undelete": {
+                    "description": "Undeletes a dataset by restoring a dataset which was deleted via this API. This operation is only possible for a week after the deletion occurred.",
+                    "httpMethod": "POST",
+                    "id": "genomics.datasets.undelete",
+                    "parameterOrder": [
+                        "datasetId"
+                    ],
+                    "parameters": {
+                        "datasetId": {
+                            "description": "The ID of the dataset to be undeleted.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "datasets/{datasetId}/undelete",
+                    "response": {
+                        "$ref": "Dataset"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                },
+                "update": {
+                    "description": "Updates a dataset.",
+                    "httpMethod": "PUT",
+                    "id": "genomics.datasets.update",
+                    "parameterOrder": [
+                        "datasetId"
+                    ],
+                    "parameters": {
+                        "datasetId": {
+                            "description": "The ID of the dataset to be updated.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "datasets/{datasetId}",
+                    "request": {
+                        "$ref": "Dataset"
+                    },
+                    "response": {
+                        "$ref": "Dataset"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                }
+            }
+        },
+        "experimental": {
+            "resources": {
+                "jobs": {
+                    "methods": {
+                        "create": {
+                            "description": "Creates and asynchronously runs an ad-hoc job. This is an experimental call and may be removed or changed at any time.",
+                            "httpMethod": "POST",
+                            "id": "genomics.experimental.jobs.create",
+                            "path": "experimental/jobs/create",
+                            "request": {
+                                "$ref": "ExperimentalCreateJobRequest"
+                            },
+                            "response": {
+                                "$ref": "ExperimentalCreateJobResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/devstorage.read_write",
+                                "https://www.googleapis.com/auth/genomics"
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "jobs": {
+            "methods": {
+                "cancel": {
+                    "description": "Cancels a job by ID. Note that it is possible for partial results to be generated and stored for cancelled jobs.",
+                    "httpMethod": "POST",
+                    "id": "genomics.jobs.cancel",
+                    "parameterOrder": [
+                        "jobId"
+                    ],
+                    "parameters": {
+                        "jobId": {
+                            "description": "Required. The ID of the job.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "jobs/{jobId}/cancel",
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                },
+                "get": {
+                    "description": "Gets a job by ID.",
+                    "httpMethod": "GET",
+                    "id": "genomics.jobs.get",
+                    "parameterOrder": [
+                        "jobId"
+                    ],
+                    "parameters": {
+                        "jobId": {
+                            "description": "Required. The ID of the job.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "jobs/{jobId}",
+                    "response": {
+                        "$ref": "Job"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics",
+                        "https://www.googleapis.com/auth/genomics.readonly"
+                    ]
+                },
+                "search": {
+                    "description": "Gets a list of jobs matching the criteria.",
+                    "httpMethod": "POST",
+                    "id": "genomics.jobs.search",
+                    "path": "jobs/search",
+                    "request": {
+                        "$ref": "SearchJobsRequest"
+                    },
+                    "response": {
+                        "$ref": "SearchJobsResponse"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics",
+                        "https://www.googleapis.com/auth/genomics.readonly"
+                    ]
+                }
+            }
+        },
+        "readgroupsets": {
+            "methods": {
+                "align": {
+                    "description": "Aligns read data from existing read group sets or files from Google Cloud Storage. See the  alignment and variant calling documentation for more details.",
+                    "httpMethod": "POST",
+                    "id": "genomics.readgroupsets.align",
+                    "path": "readgroupsets/align",
+                    "request": {
+                        "$ref": "AlignReadGroupSetsRequest"
+                    },
+                    "response": {
+                        "$ref": "AlignReadGroupSetsResponse"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                },
+                "call": {
+                    "description": "Calls variants on read data from existing read group sets or files from Google Cloud Storage. See the  alignment and variant calling documentation for more details.",
+                    "httpMethod": "POST",
+                    "id": "genomics.readgroupsets.call",
+                    "path": "readgroupsets/call",
+                    "request": {
+                        "$ref": "CallReadGroupSetsRequest"
+                    },
+                    "response": {
+                        "$ref": "CallReadGroupSetsResponse"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                },
+                "delete": {
+                    "description": "Deletes a read group set.",
+                    "httpMethod": "DELETE",
+                    "id": "genomics.readgroupsets.delete",
+                    "parameterOrder": [
+                        "readGroupSetId"
+                    ],
+                    "parameters": {
+                        "readGroupSetId": {
+                            "description": "The ID of the read group set to be deleted. The caller must have WRITE permissions to the dataset associated with this read group set.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "readgroupsets/{readGroupSetId}",
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                },
+                "export": {
+                    "description": "Exports read group sets to a BAM file in Google Cloud Storage.\n\nNote that currently there may be some differences between exported BAM files and the original BAM file at the time of import. In particular, comments in the input file header will not be preserved, and some custom tags will be converted to strings.",
+                    "httpMethod": "POST",
+                    "id": "genomics.readgroupsets.export",
+                    "path": "readgroupsets/export",
+                    "request": {
+                        "$ref": "ExportReadGroupSetsRequest"
+                    },
+                    "response": {
+                        "$ref": "ExportReadGroupSetsResponse"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/devstorage.read_write",
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                },
+                "get": {
+                    "description": "Gets a read group set by ID.",
+                    "httpMethod": "GET",
+                    "id": "genomics.readgroupsets.get",
+                    "parameterOrder": [
+                        "readGroupSetId"
+                    ],
+                    "parameters": {
+                        "readGroupSetId": {
+                            "description": "The ID of the read group set.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "readgroupsets/{readGroupSetId}",
+                    "response": {
+                        "$ref": "ReadGroupSet"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics",
+                        "https://www.googleapis.com/auth/genomics.readonly"
+                    ]
+                },
+                "import": {
+                    "description": "Creates read group sets by asynchronously importing the provided information.\n\nNote that currently comments in the input file header are not imported and some custom tags will be converted to strings, rather than preserving tag types. The caller must have WRITE permissions to the dataset.",
+                    "httpMethod": "POST",
+                    "id": "genomics.readgroupsets.import",
+                    "path": "readgroupsets/import",
+                    "request": {
+                        "$ref": "ImportReadGroupSetsRequest"
+                    },
+                    "response": {
+                        "$ref": "ImportReadGroupSetsResponse"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/devstorage.read_write",
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                },
+                "patch": {
+                    "description": "Updates a read group set. This method supports patch semantics.",
+                    "httpMethod": "PATCH",
+                    "id": "genomics.readgroupsets.patch",
+                    "parameterOrder": [
+                        "readGroupSetId"
+                    ],
+                    "parameters": {
+                        "readGroupSetId": {
+                            "description": "The ID of the read group set to be updated. The caller must have WRITE permissions to the dataset associated with this read group set.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "readgroupsets/{readGroupSetId}",
+                    "request": {
+                        "$ref": "ReadGroupSet"
+                    },
+                    "response": {
+                        "$ref": "ReadGroupSet"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                },
+                "search": {
+                    "description": "Searches for read group sets matching the criteria.\n\nImplements GlobalAllianceApi.searchReadGroupSets.",
+                    "httpMethod": "POST",
+                    "id": "genomics.readgroupsets.search",
+                    "path": "readgroupsets/search",
+                    "request": {
+                        "$ref": "SearchReadGroupSetsRequest"
+                    },
+                    "response": {
+                        "$ref": "SearchReadGroupSetsResponse"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics",
+                        "https://www.googleapis.com/auth/genomics.readonly"
+                    ]
+                },
+                "update": {
+                    "description": "Updates a read group set.",
+                    "httpMethod": "PUT",
+                    "id": "genomics.readgroupsets.update",
+                    "parameterOrder": [
+                        "readGroupSetId"
+                    ],
+                    "parameters": {
+                        "readGroupSetId": {
+                            "description": "The ID of the read group set to be updated. The caller must have WRITE permissions to the dataset associated with this read group set.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "readgroupsets/{readGroupSetId}",
+                    "request": {
+                        "$ref": "ReadGroupSet"
+                    },
+                    "response": {
+                        "$ref": "ReadGroupSet"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                }
+            },
+            "resources": {
+                "coveragebuckets": {
+                    "methods": {
+                        "list": {
+                            "description": "Lists fixed width coverage buckets for a read group set, each of which correspond to a range of a reference sequence. Each bucket summarizes coverage information across its corresponding genomic range.\n\nCoverage is defined as the number of reads which are aligned to a given base in the reference sequence. Coverage buckets are available at several precomputed bucket widths, enabling retrieval of various coverage 'zoom levels'. The caller must have READ permissions for the target read group set.",
+                            "httpMethod": "GET",
+                            "id": "genomics.readgroupsets.coveragebuckets.list",
+                            "parameterOrder": [
+                                "readGroupSetId"
+                            ],
+                            "parameters": {
+                                "pageSize": {
+                                    "default": "1024",
+                                    "description": "The maximum number of results to return in a single page. If unspecified, defaults to 1024. The maximum value is 2048.",
+                                    "format": "int32",
+                                    "location": "query",
+                                    "type": "integer"
+                                },
+                                "pageToken": {
+                                    "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response.",
+                                    "location": "query",
+                                    "type": "string"
+                                },
+                                "range.end": {
+                                    "description": "The end position of the range on the reference, 0-based exclusive. If specified, referenceName must also be specified.",
+                                    "format": "int64",
+                                    "location": "query",
+                                    "type": "string"
+                                },
+                                "range.referenceName": {
+                                    "description": "The reference sequence name, for example chr1, 1, or chrX.",
+                                    "location": "query",
+                                    "type": "string"
+                                },
+                                "range.start": {
+                                    "description": "The start position of the range on the reference, 0-based inclusive. If specified, referenceName must also be specified.",
+                                    "format": "int64",
+                                    "location": "query",
+                                    "type": "string"
+                                },
+                                "readGroupSetId": {
+                                    "description": "Required. The ID of the read group set over which coverage is requested.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                },
+                                "targetBucketWidth": {
+                                    "description": "The desired width of each reported coverage bucket in base pairs. This will be rounded down to the nearest precomputed bucket width; the value of which is returned as bucketWidth in the response. Defaults to infinity (each bucket spans an entire reference sequence) or the length of the target range, if specified. The smallest precomputed bucketWidth is currently 2048 base pairs; this is subject to change.",
+                                    "format": "int64",
+                                    "location": "query",
+                                    "type": "string"
+                                }
+                            },
+                            "path": "readgroupsets/{readGroupSetId}/coveragebuckets",
+                            "response": {
+                                "$ref": "ListCoverageBucketsResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/genomics",
+                                "https://www.googleapis.com/auth/genomics.readonly"
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "reads": {
+            "methods": {
+                "search": {
+                    "description": "Gets a list of reads for one or more read group sets. Reads search operates over a genomic coordinate space of reference sequence & position defined over the reference sequences to which the requested read group sets are aligned.\n\nIf a target positional range is specified, search returns all reads whose alignment to the reference genome overlap the range. A query which specifies only read group set IDs yields all reads in those read group sets, including unmapped reads.\n\nAll reads returned (including reads on subsequent pages) are ordered by genomic coordinate (reference sequence & position). Reads with equivalent genomic coordinates are returned in a deterministic order.\n\nImplements GlobalAllianceApi.searchReads.",
+                    "httpMethod": "POST",
+                    "id": "genomics.reads.search",
+                    "path": "reads/search",
+                    "request": {
+                        "$ref": "SearchReadsRequest"
+                    },
+                    "response": {
+                        "$ref": "SearchReadsResponse"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics",
+                        "https://www.googleapis.com/auth/genomics.readonly"
+                    ]
+                }
+            }
+        },
+        "references": {
+            "methods": {
+                "get": {
+                    "description": "Gets a reference.\n\nImplements GlobalAllianceApi.getReference.",
+                    "httpMethod": "GET",
+                    "id": "genomics.references.get",
+                    "parameterOrder": [
+                        "referenceId"
+                    ],
+                    "parameters": {
+                        "referenceId": {
+                            "description": "The ID of the reference.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "references/{referenceId}",
+                    "response": {
+                        "$ref": "Reference"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics",
+                        "https://www.googleapis.com/auth/genomics.readonly"
+                    ]
+                },
+                "search": {
+                    "description": "Searches for references which match the given criteria.\n\nImplements GlobalAllianceApi.searchReferences.",
+                    "httpMethod": "POST",
+                    "id": "genomics.references.search",
+                    "path": "references/search",
+                    "request": {
+                        "$ref": "SearchReferencesRequest"
+                    },
+                    "response": {
+                        "$ref": "SearchReferencesResponse"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics",
+                        "https://www.googleapis.com/auth/genomics.readonly"
+                    ]
+                }
+            },
+            "resources": {
+                "bases": {
+                    "methods": {
+                        "list": {
+                            "description": "Lists the bases in a reference, optionally restricted to a range.\n\nImplements GlobalAllianceApi.getReferenceBases.",
+                            "httpMethod": "GET",
+                            "id": "genomics.references.bases.list",
+                            "parameterOrder": [
+                                "referenceId"
+                            ],
+                            "parameters": {
+                                "end": {
+                                    "description": "The end position (0-based, exclusive) of this query. Defaults to the length of this reference.",
+                                    "format": "int64",
+                                    "location": "query",
+                                    "type": "string"
+                                },
+                                "pageSize": {
+                                    "default": "200000",
+                                    "description": "Specifies the maximum number of bases to return in a single page.",
+                                    "format": "int32",
+                                    "location": "query",
+                                    "type": "integer"
+                                },
+                                "pageToken": {
+                                    "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response.",
+                                    "location": "query",
+                                    "type": "string"
+                                },
+                                "referenceId": {
+                                    "description": "The ID of the reference.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                },
+                                "start": {
+                                    "description": "The start position (0-based) of this query. Defaults to 0.",
+                                    "format": "int64",
+                                    "location": "query",
+                                    "type": "string"
+                                }
+                            },
+                            "path": "references/{referenceId}/bases",
+                            "response": {
+                                "$ref": "ListBasesResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/genomics",
+                                "https://www.googleapis.com/auth/genomics.readonly"
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "referencesets": {
+            "methods": {
+                "get": {
+                    "description": "Gets a reference set.\n\nImplements GlobalAllianceApi.getReferenceSet.",
+                    "httpMethod": "GET",
+                    "id": "genomics.referencesets.get",
+                    "parameterOrder": [
+                        "referenceSetId"
+                    ],
+                    "parameters": {
+                        "referenceSetId": {
+                            "description": "The ID of the reference set.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "referencesets/{referenceSetId}",
+                    "response": {
+                        "$ref": "ReferenceSet"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics",
+                        "https://www.googleapis.com/auth/genomics.readonly"
+                    ]
+                },
+                "search": {
+                    "description": "Searches for reference sets which match the given criteria.\n\nImplements GlobalAllianceApi.searchReferenceSets.",
+                    "httpMethod": "POST",
+                    "id": "genomics.referencesets.search",
+                    "path": "referencesets/search",
+                    "request": {
+                        "$ref": "SearchReferenceSetsRequest"
+                    },
+                    "response": {
+                        "$ref": "SearchReferenceSetsResponse"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics",
+                        "https://www.googleapis.com/auth/genomics.readonly"
+                    ]
+                }
+            }
+        },
+        "variants": {
+            "methods": {
+                "create": {
+                    "description": "Creates a new variant.",
+                    "httpMethod": "POST",
+                    "id": "genomics.variants.create",
+                    "path": "variants",
+                    "request": {
+                        "$ref": "Variant"
+                    },
+                    "response": {
+                        "$ref": "Variant"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                },
+                "delete": {
+                    "description": "Deletes a variant.",
+                    "httpMethod": "DELETE",
+                    "id": "genomics.variants.delete",
+                    "parameterOrder": [
+                        "variantId"
+                    ],
+                    "parameters": {
+                        "variantId": {
+                            "description": "The ID of the variant to be deleted.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "variants/{variantId}",
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                },
+                "get": {
+                    "description": "Gets a variant by ID.",
+                    "httpMethod": "GET",
+                    "id": "genomics.variants.get",
+                    "parameterOrder": [
+                        "variantId"
+                    ],
+                    "parameters": {
+                        "variantId": {
+                            "description": "The ID of the variant.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "variants/{variantId}",
+                    "response": {
+                        "$ref": "Variant"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics",
+                        "https://www.googleapis.com/auth/genomics.readonly"
+                    ]
+                },
+                "search": {
+                    "description": "Gets a list of variants matching the criteria.\n\nImplements GlobalAllianceApi.searchVariants.",
+                    "httpMethod": "POST",
+                    "id": "genomics.variants.search",
+                    "path": "variants/search",
+                    "request": {
+                        "$ref": "SearchVariantsRequest"
+                    },
+                    "response": {
+                        "$ref": "SearchVariantsResponse"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics",
+                        "https://www.googleapis.com/auth/genomics.readonly"
+                    ]
+                },
+                "update": {
+                    "description": "Updates a variant's names and info fields. All other modifications are silently ignored. Returns the modified variant without its calls.",
+                    "httpMethod": "PUT",
+                    "id": "genomics.variants.update",
+                    "parameterOrder": [
+                        "variantId"
+                    ],
+                    "parameters": {
+                        "variantId": {
+                            "description": "The ID of the variant to be updated.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "variants/{variantId}",
+                    "request": {
+                        "$ref": "Variant"
+                    },
+                    "response": {
+                        "$ref": "Variant"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                }
+            }
+        },
+        "variantsets": {
+            "methods": {
+                "delete": {
+                    "description": "Deletes the contents of a variant set. The variant set object is not deleted.",
+                    "httpMethod": "DELETE",
+                    "id": "genomics.variantsets.delete",
+                    "parameterOrder": [
+                        "variantSetId"
+                    ],
+                    "parameters": {
+                        "variantSetId": {
+                            "description": "The ID of the variant set to be deleted.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "variantsets/{variantSetId}",
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                },
+                "export": {
+                    "description": "Exports variant set data to an external destination.",
+                    "httpMethod": "POST",
+                    "id": "genomics.variantsets.export",
+                    "parameterOrder": [
+                        "variantSetId"
+                    ],
+                    "parameters": {
+                        "variantSetId": {
+                            "description": "Required. The ID of the variant set that contains variant data which should be exported. The caller must have READ access to this variant set.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "variantsets/{variantSetId}/export",
+                    "request": {
+                        "$ref": "ExportVariantSetRequest"
+                    },
+                    "response": {
+                        "$ref": "ExportVariantSetResponse"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/bigquery",
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                },
+                "get": {
+                    "description": "Gets a variant set by ID.",
+                    "httpMethod": "GET",
+                    "id": "genomics.variantsets.get",
+                    "parameterOrder": [
+                        "variantSetId"
+                    ],
+                    "parameters": {
+                        "variantSetId": {
+                            "description": "Required. The ID of the variant set.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "variantsets/{variantSetId}",
+                    "response": {
+                        "$ref": "VariantSet"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics",
+                        "https://www.googleapis.com/auth/genomics.readonly"
+                    ]
+                },
+                "importVariants": {
+                    "description": "Creates variant data by asynchronously importing the provided information.\n\nThe variants for import will be merged with any existing data and each other according to the behavior of mergeVariants. In particular, this means for merged VCF variants that have conflicting INFO fields, some data will be arbitrarily discarded. As a special case, for single-sample VCF files, QUAL and FILTER fields will be moved to the call level; these are sometimes interpreted in a call-specific context. Imported VCF headers are appended to the metadata already in a variant set.",
+                    "httpMethod": "POST",
+                    "id": "genomics.variantsets.importVariants",
+                    "parameterOrder": [
+                        "variantSetId"
+                    ],
+                    "parameters": {
+                        "variantSetId": {
+                            "description": "Required. The variant set to which variant data should be imported.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "variantsets/{variantSetId}/importVariants",
+                    "request": {
+                        "$ref": "ImportVariantsRequest"
+                    },
+                    "response": {
+                        "$ref": "ImportVariantsResponse"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/devstorage.read_write",
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                },
+                "mergeVariants": {
+                    "description": "Merges the given variants with existing variants. Each variant will be merged with an existing variant that matches its reference sequence, start, end, reference bases, and alternative bases. If no such variant exists, a new one will be created.\n\nWhen variants are merged, the call information from the new variant is added to the existing variant, and other fields (such as key/value pairs) are discarded.",
+                    "httpMethod": "POST",
+                    "id": "genomics.variantsets.mergeVariants",
+                    "parameterOrder": [
+                        "variantSetId"
+                    ],
+                    "parameters": {
+                        "variantSetId": {
+                            "description": "The destination variant set.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "variantsets/{variantSetId}/mergeVariants",
+                    "request": {
+                        "$ref": "MergeVariantsRequest"
+                    }
+                },
+                "patch": {
+                    "description": "Updates a variant set's metadata. All other modifications are silently ignored. This method supports patch semantics.",
+                    "httpMethod": "PATCH",
+                    "id": "genomics.variantsets.patch",
+                    "parameterOrder": [
+                        "variantSetId"
+                    ],
+                    "parameters": {
+                        "variantSetId": {
+                            "description": "The ID of the variant to be updated.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "variantsets/{variantSetId}",
+                    "request": {
+                        "$ref": "VariantSet"
+                    },
+                    "response": {
+                        "$ref": "VariantSet"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                },
+                "search": {
+                    "description": "Returns a list of all variant sets matching search criteria.\n\nImplements GlobalAllianceApi.searchVariantSets.",
+                    "httpMethod": "POST",
+                    "id": "genomics.variantsets.search",
+                    "path": "variantsets/search",
+                    "request": {
+                        "$ref": "SearchVariantSetsRequest"
+                    },
+                    "response": {
+                        "$ref": "SearchVariantSetsResponse"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics",
+                        "https://www.googleapis.com/auth/genomics.readonly"
+                    ]
+                },
+                "update": {
+                    "description": "Updates a variant set's metadata. All other modifications are silently ignored.",
+                    "httpMethod": "PUT",
+                    "id": "genomics.variantsets.update",
+                    "parameterOrder": [
+                        "variantSetId"
+                    ],
+                    "parameters": {
+                        "variantSetId": {
+                            "description": "The ID of the variant to be updated.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "variantsets/{variantSetId}",
+                    "request": {
+                        "$ref": "VariantSet"
+                    },
+                    "response": {
+                        "$ref": "VariantSet"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                }
+            }
+        }
+    },
+    "revision": "20141028",
+    "rootUrl": "https://www.googleapis.com/",
+    "schemas": {
+        "AlignReadGroupSetsRequest": {
+            "description": "The read group set align request.",
+            "id": "AlignReadGroupSetsRequest",
+            "properties": {
+                "bamSourceUris": {
+                    "description": "The BAM source files for alignment. Exactly one of readGroupSetIds, bamSourceUris, interleavedFastqSource or pairedFastqSource must be provided. The caller must have READ permissions for these files.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "datasetId": {
+                    "description": "Required. The ID of the dataset the newly aligned read group sets will belong to. The caller must have WRITE permissions to this dataset.",
+                    "type": "string"
+                },
+                "interleavedFastqSource": {
+                    "$ref": "InterleavedFastqSource",
+                    "description": "The interleaved FASTQ source files for alignment, where both members of each pair of reads are found on consecutive records within the same FASTQ file. Exactly one of readGroupSetIds, bamSourceUris, interleavedFastqSource or pairedFastqSource must be provided."
+                },
+                "pairedFastqSource": {
+                    "$ref": "PairedFastqSource",
+                    "description": "The paired end FASTQ source files for alignment, where each member of a pair of reads are found in separate files. Exactly one of readGroupSetIds, bamSourceUris, interleavedFastqSource or pairedFastqSource must be provided."
+                },
+                "readGroupSetIds": {
+                    "description": "The IDs of the read group sets which will be aligned. New read group sets will be generated to hold the aligned data, the originals will not be modified. The caller must have READ permissions for these read group sets. Exactly one of readGroupSetIds, bamSourceUris, interleavedFastqSource or pairedFastqSource must be provided.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "AlignReadGroupSetsResponse": {
+            "description": "The read group set align response.",
+            "id": "AlignReadGroupSetsResponse",
+            "properties": {
+                "jobId": {
+                    "description": "A job ID that can be used to get status information.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "Call": {
+            "description": "A call represents the determination of genotype with respect to a particular variant. It may include associated information such as quality and phasing. For example, a call might assign a probability of 0.32 to the occurrence of a SNP named rs1234 in a call set with the name NA12345.",
+            "id": "Call",
+            "properties": {
+                "callSetId": {
+                    "description": "The ID of the call set this variant call belongs to.",
+                    "type": "string"
+                },
+                "callSetName": {
+                    "description": "The name of the call set this variant call belongs to.",
+                    "type": "string"
+                },
+                "genotype": {
+                    "description": "The genotype of this variant call. Each value represents either the value of the referenceBases field or a 1-based index into alternateBases. If a variant had a referenceBases value of T and an alternateBases value of [\"A\", \"C\"], and the genotype was [2, 1], that would mean the call represented the heterozygous value CA for this variant. If the genotype was instead [0, 1], the represented value would be TA. Ordering of the genotype values is important if the phaseset is present. If a genotype is not called (that is, a . is present in the GT string) -1 is returned.",
+                    "items": {
+                        "format": "int32",
+                        "type": "integer"
+                    },
+                    "type": "array"
+                },
+                "genotypeLikelihood": {
+                    "description": "The genotype likelihoods for this variant call. Each array entry represents how likely a specific genotype is for this call. The value ordering is defined by the GL tag in the VCF spec.",
+                    "items": {
+                        "format": "double",
+                        "type": "number"
+                    },
+                    "type": "array"
+                },
+                "info": {
+                    "additionalProperties": {
+                        "description": "A string which maps to an array of values.",
+                        "items": {
+                            "type": "string"
+                        },
+                        "type": "array"
+                    },
+                    "description": "A map of additional variant call information.",
+                    "type": "object"
+                },
+                "phaseset": {
+                    "description": "If this field is present, this variant call's genotype ordering implies the phase of the bases and is consistent with any other variant calls in the same reference sequence which have the same phaseset value. When importing data from VCF, if the genotype data was phased but no phase set was specified this field will be set to *.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "CallReadGroupSetsRequest": {
+            "description": "The read group set call request.",
+            "id": "CallReadGroupSetsRequest",
+            "properties": {
+                "datasetId": {
+                    "description": "Required. The ID of the dataset the called variants will belong to. The caller must have WRITE permissions to this dataset.",
+                    "type": "string"
+                },
+                "readGroupSetIds": {
+                    "description": "The IDs of the read group sets which will be called. The caller must have READ permissions for these read group sets. One of readGroupSetIds or sourceUris must be provided.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "sourceUris": {
+                    "description": "A list of URIs pointing at BAM files in Google Cloud Storage which will be called. FASTQ files are not allowed. The caller must have READ permissions for these files. One of readGroupSetIds or sourceUris must be provided.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "CallReadGroupSetsResponse": {
+            "description": "The read group set call response.",
+            "id": "CallReadGroupSetsResponse",
+            "properties": {
+                "jobId": {
+                    "description": "A job ID that can be used to get status information.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "CallSet": {
+            "description": "A call set is a collection of variant calls, typically for one sample. It belongs to a variant set.",
+            "id": "CallSet",
+            "properties": {
+                "created": {
+                    "description": "The date this call set was created in milliseconds from the epoch.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "id": {
+                    "description": "The Google generated ID of the call set, immutable.",
+                    "type": "string"
+                },
+                "info": {
+                    "additionalProperties": {
+                        "description": "A string which maps to an array of values.",
+                        "items": {
+                            "type": "string"
+                        },
+                        "type": "array"
+                    },
+                    "description": "A map of additional call set information.",
+                    "type": "object"
+                },
+                "name": {
+                    "description": "The call set name.",
+                    "type": "string"
+                },
+                "sampleId": {
+                    "description": "The sample ID this call set corresponds to.",
+                    "type": "string"
+                },
+                "variantSetIds": {
+                    "description": "The IDs of the variant sets this call set belongs to.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "CigarUnit": {
+            "description": "A single CIGAR operation.",
+            "id": "CigarUnit",
+            "properties": {
+                "operation": {
+                    "enum": [
+                        "ALIGNMENT_MATCH",
+                        "CLIP_HARD",
+                        "CLIP_SOFT",
+                        "DELETE",
+                        "INSERT",
+                        "PAD",
+                        "SEQUENCE_MATCH",
+                        "SEQUENCE_MISMATCH",
+                        "SKIP"
+                    ],
+                    "enumDescriptions": [
+                        "",
+                        "",
+                        "",
+                        "",
+                        "",
+                        "",
+                        "",
+                        "",
+                        ""
+                    ],
+                    "type": "string"
+                },
+                "operationLength": {
+                    "description": "The number of bases that the operation runs for. Required.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "referenceSequence": {
+                    "description": "referenceSequence is only used at mismatches (SEQUENCE_MISMATCH) and deletions (DELETE). Filling this field replaces SAM's MD tag. If the relevant information is not available, this field is unset.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "CoverageBucket": {
+            "description": "A bucket over which read coverage has been precomputed. A bucket corresponds to a specific range of the reference sequence.",
+            "id": "CoverageBucket",
+            "properties": {
+                "meanCoverage": {
+                    "description": "The average number of reads which are aligned to each individual reference base in this bucket.",
+                    "format": "float",
+                    "type": "number"
+                },
+                "range": {
+                    "$ref": "Range",
+                    "description": "The genomic coordinate range spanned by this bucket."
+                }
+            },
+            "type": "object"
+        },
+        "Dataset": {
+            "description": "A Dataset is a collection of genomic data.",
+            "id": "Dataset",
+            "properties": {
+                "id": {
+                    "description": "The Google generated ID of the dataset, immutable.",
+                    "type": "string"
+                },
+                "isPublic": {
+                    "description": "Flag indicating whether or not a dataset is publicly viewable. If a dataset is not public, it inherits viewing permissions from its project.",
+                    "type": "boolean"
+                },
+                "name": {
+                    "description": "The dataset name.",
+                    "type": "string"
+                },
+                "projectNumber": {
+                    "description": "The Google Developers Console project number that this dataset belongs to.",
+                    "format": "int64",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "ExperimentalCreateJobRequest": {
+            "description": "The job creation request.",
+            "id": "ExperimentalCreateJobRequest",
+            "properties": {
+                "align": {
+                    "description": "Specifies whether or not to run the alignment pipeline. Either align or callVariants must be set.",
+                    "type": "boolean"
+                },
+                "callVariants": {
+                    "description": "Specifies whether or not to run the variant calling pipeline. Either align or callVariants must be set.",
+                    "type": "boolean"
+                },
+                "gcsOutputPath": {
+                    "description": "Specifies where to copy the results of certain pipelines. This should be in the form of gs://bucket/path.",
+                    "type": "string"
+                },
+                "pairedSourceUris": {
+                    "description": "A list of Google Cloud Storage URIs of paired end .fastq files to operate upon. If specified, this represents the second file of each paired .fastq file. The first file of each pair should be specified in sourceUris.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "projectNumber": {
+                    "description": "Required. The Google Cloud Project ID with which to associate the request.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "sourceUris": {
+                    "description": "A list of Google Cloud Storage URIs of data files to operate upon. These can be .bam, interleaved .fastq, or paired .fastq. If specifying paired .fastq files, the first of each pair of files should be listed here, and the second of each pair should be listed in pairedSourceUris.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "ExperimentalCreateJobResponse": {
+            "description": "The job creation response.",
+            "id": "ExperimentalCreateJobResponse",
+            "properties": {
+                "jobId": {
+                    "description": "A job ID that can be used to get status information.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "ExportReadGroupSetsRequest": {
+            "description": "The read group set export request.",
+            "id": "ExportReadGroupSetsRequest",
+            "properties": {
+                "exportUri": {
+                    "description": "A Google Cloud Storage URI where the exported BAM file will be created. The currently authenticated user must have write access to the new file location. An error will be returned if the URI already contains data.",
+                    "type": "string"
+                },
+                "projectNumber": {
+                    "description": "The Google Developers Console project number that owns this export.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "readGroupSetIds": {
+                    "description": "The IDs of the read group sets to export.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "referenceNames": {
+                    "description": "The reference names to export. If this is not specified, all reference sequences, including unmapped reads, are exported. Use * to export only unmapped reads.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "ExportReadGroupSetsResponse": {
+            "description": "The read group set export response.",
+            "id": "ExportReadGroupSetsResponse",
+            "properties": {
+                "jobId": {
+                    "description": "A job ID that can be used to get status information.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "ExportVariantSetRequest": {
+            "description": "The variant data export request.",
+            "id": "ExportVariantSetRequest",
+            "properties": {
+                "bigqueryDataset": {
+                    "description": "The BigQuery dataset to export data to. Note that this is distinct from the Genomics concept of \"dataset\".",
+                    "type": "string"
+                },
+                "bigqueryTable": {
+                    "description": "The BigQuery table to export data to. If the table doesn't exist, it will be created. If it already exists, it will be overwritten.",
+                    "type": "string"
+                },
+                "callSetIds": {
+                    "description": "If provided, only variant call information from the specified call sets will be exported. By default all variant calls are exported.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "format": {
+                    "description": "The format for the exported data.",
+                    "enum": [
+                        "BIGQUERY"
+                    ],
+                    "enumDescriptions": [
+                        ""
+                    ],
+                    "type": "string"
+                },
+                "projectNumber": {
+                    "description": "The Google Cloud project number that owns the destination BigQuery dataset. The caller must have WRITE access to this project. This project will also own the resulting export job.",
+                    "format": "int64",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "ExportVariantSetResponse": {
+            "description": "The variant data export response.",
+            "id": "ExportVariantSetResponse",
+            "properties": {
+                "jobId": {
+                    "description": "A job ID that can be used to get status information.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "FastqMetadata": {
+            "id": "FastqMetadata",
+            "properties": {
+                "libraryName": {
+                    "description": "Optionally specifies the library name for alignment from FASTQ.",
+                    "type": "string"
+                },
+                "platformName": {
+                    "description": "Optionally specifies the platform name for alignment from FASTQ. For example: CAPILLARY, LS454, ILLUMINA, SOLID, HELICOS, IONTORRENT, PACBIO.",
+                    "type": "string"
+                },
+                "platformUnit": {
+                    "description": "Optionally specifies the platform unit for alignment from FASTQ. For example: flowcell-barcode.lane for Illumina or slide for SOLID.",
+                    "type": "string"
+                },
+                "readGroupName": {
+                    "description": "Optionally specifies the read group name for alignment from FASTQ.",
+                    "type": "string"
+                },
+                "sampleName": {
+                    "description": "Optionally specifies the sample name for alignment from FASTQ.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "ImportReadGroupSetsRequest": {
+            "description": "The read group set import request.",
+            "id": "ImportReadGroupSetsRequest",
+            "properties": {
+                "datasetId": {
+                    "description": "Required. The ID of the dataset these read group sets will belong to. The caller must have WRITE permissions to this dataset.",
+                    "type": "string"
+                },
+                "referenceSetId": {
+                    "description": "The reference set to which the imported read group sets are aligned to, if any. The reference names of this reference set must be a superset of those found in the imported file headers. If no reference set id is provided, a best effort is made to associate with a matching reference set.",
+                    "type": "string"
+                },
+                "sourceUris": {
+                    "description": "A list of URIs pointing at BAM files in Google Cloud Storage.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "ImportReadGroupSetsResponse": {
+            "description": "The read group set import response.",
+            "id": "ImportReadGroupSetsResponse",
+            "properties": {
+                "jobId": {
+                    "description": "A job ID that can be used to get status information.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "ImportVariantsRequest": {
+            "description": "The variant data import request.",
+            "id": "ImportVariantsRequest",
+            "properties": {
+                "format": {
+                    "description": "The format of the variant data being imported.",
+                    "enum": [
+                        "COMPLETE_GENOMICS",
+                        "VCF"
+                    ],
+                    "enumDescriptions": [
+                        "",
+                        ""
+                    ],
+                    "type": "string"
+                },
+                "sourceUris": {
+                    "description": "A list of URIs pointing at VCF files in Google Cloud Storage. See the VCF Specification for more details on the input format.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "ImportVariantsResponse": {
+            "description": "The variant data import response.",
+            "id": "ImportVariantsResponse",
+            "properties": {
+                "jobId": {
+                    "description": "A job ID that can be used to get status information.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "InterleavedFastqSource": {
+            "description": "Describes an interleaved FASTQ file source for alignment.",
+            "id": "InterleavedFastqSource",
+            "properties": {
+                "metadata": {
+                    "$ref": "FastqMetadata",
+                    "description": "Optionally specifies the metadata to be associated with the final aligned read group set."
+                },
+                "sourceUris": {
+                    "description": "A list of URIs pointing at interleaved FASTQ files in Google Cloud Storage which will be aligned. The caller must have READ permissions for these files.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "Job": {
+            "description": "A Job represents an ongoing process that can be monitored for status information.",
+            "id": "Job",
+            "properties": {
+                "created": {
+                    "description": "The date this job was created, in milliseconds from the epoch.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "detailedStatus": {
+                    "description": "A more detailed description of this job's current status.",
+                    "type": "string"
+                },
+                "errors": {
+                    "description": "Any errors that occurred during processing.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "id": {
+                    "description": "The job ID.",
+                    "type": "string"
+                },
+                "importedIds": {
+                    "description": "If this Job represents an import, this field will contain the IDs of the objects that were successfully imported.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "projectNumber": {
+                    "description": "The Google Developers Console project number to which this job belongs.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "request": {
+                    "$ref": "JobRequest",
+                    "description": "A summarized representation of the original service request."
+                },
+                "status": {
+                    "description": "The status of this job.",
+                    "enum": [
+                        "CANCELED",
+                        "FAILURE",
+                        "NEW",
+                        "PENDING",
+                        "RUNNING",
+                        "SUCCESS",
+                        "UNKNOWN_STATUS"
+                    ],
+                    "enumDescriptions": [
+                        "",
+                        "",
+                        "",
+                        "",
+                        "",
+                        "",
+                        ""
+                    ],
+                    "type": "string"
+                },
+                "warnings": {
+                    "description": "Any warnings that occurred during processing.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "JobRequest": {
+            "description": "A summary representation of the service request that spawned the job.",
+            "id": "JobRequest",
+            "properties": {
+                "destination": {
+                    "description": "The data destination of the request, for example, a Google BigQuery Table or Dataset ID.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "source": {
+                    "description": "The data source of the request, for example, a Google Cloud Storage object path or Readset ID.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "type": {
+                    "description": "The original request type.",
+                    "enum": [
+                        "ALIGN_READSETS",
+                        "CALL_READSETS",
+                        "EXPERIMENTAL_CREATE_JOB",
+                        "EXPORT_READSETS",
+                        "EXPORT_VARIANTS",
+                        "IMPORT_READSETS",
+                        "IMPORT_VARIANTS",
+                        "UNKNOWN_TYPE"
+                    ],
+                    "enumDescriptions": [
+                        "",
+                        "",
+                        "",
+                        "",
+                        "",
+                        "",
+                        "",
+                        ""
+                    ],
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "LinearAlignment": {
+            "description": "A linear alignment can be represented by one CIGAR string. Describes the mapped position and local alignment of the read to the reference.",
+            "id": "LinearAlignment",
+            "properties": {
+                "cigar": {
+                    "description": "Represents the local alignment of this sequence (alignment matches, indels, etc) against the reference.",
+                    "items": {
+                        "$ref": "CigarUnit"
+                    },
+                    "type": "array"
+                },
+                "mappingQuality": {
+                    "description": "The mapping quality of this alignment. Represents how likely the read maps to this position as opposed to other locations.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "position": {
+                    "$ref": "Position",
+                    "description": "The position of this alignment."
+                }
+            },
+            "type": "object"
+        },
+        "ListBasesResponse": {
+            "id": "ListBasesResponse",
+            "properties": {
+                "nextPageToken": {
+                    "description": "The continuation token, which is used to page through large result sets. Provide this value in a subsequent request to return the next page of results. This field will be empty if there aren't any additional results.",
+                    "type": "string"
+                },
+                "offset": {
+                    "description": "The offset position (0-based) of the given sequence from the start of this Reference. This value will differ for each page in a paginated request.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "sequence": {
+                    "description": "A substring of the bases that make up this reference.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "ListCoverageBucketsResponse": {
+            "id": "ListCoverageBucketsResponse",
+            "properties": {
+                "bucketWidth": {
+                    "description": "The length of each coverage bucket in base pairs. Note that buckets at the end of a reference sequence may be shorter. This value is omitted if the bucket width is infinity (the default behaviour, with no range or targetBucketWidth).",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "coverageBuckets": {
+                    "description": "The coverage buckets. The list of buckets is sparse; a bucket with 0 overlapping reads is not returned. A bucket never crosses more than one reference sequence. Each bucket has width bucketWidth, unless its end is the end of the reference sequence.",
+                    "items": {
+                        "$ref": "CoverageBucket"
+                    },
+                    "type": "array"
+                },
+                "nextPageToken": {
+                    "description": "The continuation token, which is used to page through large result sets. Provide this value in a subsequent request to return the next page of results. This field will be empty if there aren't any additional results.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "ListDatasetsResponse": {
+            "description": "The dataset list response.",
+            "id": "ListDatasetsResponse",
+            "properties": {
+                "datasets": {
+                    "description": "The list of matching Datasets.",
+                    "items": {
+                        "$ref": "Dataset"
+                    },
+                    "type": "array"
+                },
+                "nextPageToken": {
+                    "description": "The continuation token, which is used to page through large result sets. Provide this value in a subsequent request to return the next page of results. This field will be empty if there aren't any additional results.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "MergeVariantsRequest": {
+            "id": "MergeVariantsRequest",
+            "properties": {
+                "variants": {
+                    "description": "The variants to be merged with existing variants.",
+                    "items": {
+                        "$ref": "Variant"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "Metadata": {
+            "description": "Metadata describes a single piece of variant call metadata. These data include a top level key and either a single value string (value) or a list of key-value pairs (info.) Value and info are mutually exclusive.",
+            "id": "Metadata",
+            "properties": {
+                "description": {
+                    "description": "A textual description of this metadata.",
+                    "type": "string"
+                },
+                "id": {
+                    "description": "User-provided ID field, not enforced by this API. Two or more pieces of structured metadata with identical id and key fields are considered equivalent.",
+                    "type": "string"
+                },
+                "info": {
+                    "additionalProperties": {
+                        "description": "A string which maps to an array of values.",
+                        "items": {
+                            "type": "string"
+                        },
+                        "type": "array"
+                    },
+                    "description": "Remaining structured metadata key-value pairs.",
+                    "type": "object"
+                },
+                "key": {
+                    "description": "The top-level key.",
+                    "type": "string"
+                },
+                "number": {
+                    "description": "The number of values that can be included in a field described by this metadata.",
+                    "type": "string"
+                },
+                "type": {
+                    "description": "The type of data. Possible types include: Integer, Float, Flag, Character, and String.",
+                    "enum": [
+                        "CHARACTER",
+                        "FLAG",
+                        "FLOAT",
+                        "INTEGER",
+                        "STRING",
+                        "UNKNOWN_TYPE"
+                    ],
+                    "enumDescriptions": [
+                        "",
+                        "",
+                        "",
+                        "",
+                        "",
+                        ""
+                    ],
+                    "type": "string"
+                },
+                "value": {
+                    "description": "The value field for simple metadata",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "PairedFastqSource": {
+            "description": "Describes a paired-end FASTQ file source for alignment.",
+            "id": "PairedFastqSource",
+            "properties": {
+                "firstSourceUris": {
+                    "description": "A list of URIs pointing at paired end FASTQ files in Google Cloud Storage which will be aligned. The first of each paired file should be specified here, in an order that matches the second of each paired file specified in secondSourceUris. For example: firstSourceUris: [file1_1.fq, file2_1.fq], secondSourceUris: [file1_2.fq, file2_2.fq]. The caller must have READ permissions for these files.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "metadata": {
+                    "$ref": "FastqMetadata",
+                    "description": "Optionally specifies the metadata to be associated with the final aligned read group set."
+                },
+                "secondSourceUris": {
+                    "description": "A list of URIs pointing at paired end FASTQ files in Google Cloud Storage which will be aligned. The second of each paired file should be specified here, in an order that matches the first of each paired file specified in firstSourceUris. For example: firstSourceUris: [file1_1.fq, file2_1.fq], secondSourceUris: [file1_2.fq, file2_2.fq]. The caller must have READ permissions for these files.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "Position": {
+            "description": "An abstraction for referring to a genomic position, in relation to some already known reference. For now, represents a genomic position as a reference name, a base number on that reference (0-based), and a determination of forward or reverse strand.",
+            "id": "Position",
+            "properties": {
+                "position": {
+                    "description": "The 0-based offset from the start of the forward strand for that reference.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "referenceName": {
+                    "description": "The name of the reference in whatever reference set is being used.",
+                    "type": "string"
+                },
+                "reverseStrand": {
+                    "description": "Whether this position is on the reverse strand, as opposed to the forward strand.",
+                    "type": "boolean"
+                }
+            },
+            "type": "object"
+        },
+        "Range": {
+            "description": "A 0-based half-open genomic coordinate range over a reference sequence.",
+            "id": "Range",
+            "properties": {
+                "end": {
+                    "description": "The end position of the range on the reference, 0-based exclusive. If specified, referenceName must also be specified.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "referenceName": {
+                    "description": "The reference sequence name, for example chr1, 1, or chrX.",
+                    "type": "string"
+                },
+                "start": {
+                    "description": "The start position of the range on the reference, 0-based inclusive. If specified, referenceName must also be specified.",
+                    "format": "int64",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "Read": {
+            "description": "A read alignment describes a linear alignment of a string of DNA to a reference sequence, in addition to metadata about the fragment (the molecule of DNA sequenced) and the read (the bases which were read by the sequencer). A read is equivalent to a line in a SAM file. A read belongs to exactly one read group and exactly one read group set.",
+            "id": "Read",
+            "properties": {
+                "alignedQuality": {
+                    "description": "The quality of the read sequence contained in this alignment record. alignedSequence and alignedQuality may be shorter than the full read sequence and quality. This will occur if the alignment is part of a chimeric alignment, or if the read was trimmed. When this occurs, the CIGAR for this read will begin/end with a hard clip operator that will indicate the length of the excised sequence.",
+                    "items": {
+                        "format": "int32",
+                        "type": "integer"
+                    },
+                    "type": "array"
+                },
+                "alignedSequence": {
+                    "description": "The bases of the read sequence contained in this alignment record. alignedSequence and alignedQuality may be shorter than the full read sequence and quality. This will occur if the alignment is part of a chimeric alignment, or if the read was trimmed. When this occurs, the CIGAR for this read will begin/end with a hard clip operator that will indicate the length of the excised sequence.",
+                    "type": "string"
+                },
+                "alignment": {
+                    "$ref": "LinearAlignment",
+                    "description": "The linear alignment for this alignment record. This field will be null if the read is unmapped."
+                },
+                "duplicateFragment": {
+                    "description": "The fragment is a PCR or optical duplicate (SAM flag 0x400)",
+                    "type": "boolean"
+                },
+                "failedVendorQualityChecks": {
+                    "description": "SAM flag 0x200",
+                    "type": "boolean"
+                },
+                "fragmentLength": {
+                    "description": "The observed length of the fragment, equivalent to TLEN in SAM.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "fragmentName": {
+                    "description": "The fragment name. Equivalent to QNAME (query template name) in SAM.",
+                    "type": "string"
+                },
+                "id": {
+                    "description": "The unique ID for this read. This is a generated unique ID, not to be confused with fragmentName.",
+                    "type": "string"
+                },
+                "info": {
+                    "additionalProperties": {
+                        "description": "A string which maps to an array of values.",
+                        "items": {
+                            "type": "string"
+                        },
+                        "type": "array"
+                    },
+                    "description": "A map of additional read alignment information.",
+                    "type": "object"
+                },
+                "nextMatePosition": {
+                    "$ref": "Position",
+                    "description": "The mapping of the primary alignment of the (readNumber+1)%numberReads read in the fragment. It replaces mate position and mate strand in SAM."
+                },
+                "numberReads": {
+                    "description": "The number of reads in the fragment (extension to SAM flag 0x1).",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "properPlacement": {
+                    "description": "The orientation and the distance between reads from the fragment are consistent with the sequencing protocol (extension to SAM flag 0x2)",
+                    "type": "boolean"
+                },
+                "readGroupId": {
+                    "description": "The ID of the read group this read belongs to. (Every read must belong to exactly one read group.)",
+                    "type": "string"
+                },
+                "readGroupSetId": {
+                    "description": "The ID of the read group set this read belongs to. (Every read must belong to exactly one read group set.)",
+                    "type": "string"
+                },
+                "readNumber": {
+                    "description": "The read number in sequencing. 0-based and less than numberReads. This field replaces SAM flag 0x40 and 0x80.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "secondaryAlignment": {
+                    "description": "Whether this alignment is secondary. Equivalent to SAM flag 0x100. A secondary alignment represents an alternative to the primary alignment for this read. Aligners may return secondary alignments if a read can map ambiguously to multiple coordinates in the genome. By convention, each read has one and only one alignment where both secondaryAlignment and supplementaryAlignment are false.",
+                    "type": "boolean"
+                },
+                "supplementaryAlignment": {
+                    "description": "Whether this alignment is supplementary. Equivalent to SAM flag 0x800. Supplementary alignments are used in the representation of a chimeric alignment. In a chimeric alignment, a read is split into multiple linear alignments that map to different reference contigs. The first linear alignment in the read will be designated as the representative alignment; the remaining linear alignments will be designated as supplementary alignments. These alignments may have different mapping quality scores. In each linear alignment in a chimeric alignment, the read will be hard clipped. The alignedSequence and alignedQuality fields in the alignment record will only represent the bases for its respective linear alignment.",
+                    "type": "boolean"
+                }
+            },
+            "type": "object"
+        },
+        "ReadGroup": {
+            "description": "A read group is all the data that's processed the same way by the sequencer.",
+            "id": "ReadGroup",
+            "properties": {
+                "datasetId": {
+                    "description": "The ID of the dataset this read group belongs to.",
+                    "type": "string"
+                },
+                "description": {
+                    "description": "A free-form text description of this read group.",
+                    "type": "string"
+                },
+                "experiment": {
+                    "$ref": "ReadGroupExperiment",
+                    "description": "The experiment used to generate this read group."
+                },
+                "id": {
+                    "description": "The generated unique read group ID. Note: This is different than the @RG ID field in the SAM spec. For that value, see the name field.",
+                    "type": "string"
+                },
+                "info": {
+                    "additionalProperties": {
+                        "description": "A string which maps to an array of values.",
+                        "items": {
+                            "type": "string"
+                        },
+                        "type": "array"
+                    },
+                    "description": "A map of additional read group information.",
+                    "type": "object"
+                },
+                "name": {
+                    "description": "The read group name. This corresponds to the @RG ID field in the SAM spec.",
+                    "type": "string"
+                },
+                "predictedInsertSize": {
+                    "description": "The predicted insert size of this read group. The insert size is the length the sequenced DNA fragment from end-to-end, not including the adapters.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "programs": {
+                    "description": "The programs used to generate this read group. Programs are always identical for all read groups within a read group set. For this reason, only the first read group in a returned set will have this field populated.",
+                    "items": {
+                        "$ref": "ReadGroupProgram"
+                    },
+                    "type": "array"
+                },
+                "referenceSetId": {
+                    "description": "The reference set the reads in this read group are aligned to. Required if there are any read alignments.",
+                    "type": "string"
+                },
+                "sampleId": {
+                    "description": "The sample this read group's data was generated from. Note: This is not an actual ID within this repository, but rather an identifier for a sample which may be meaningful to some external system.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "ReadGroupExperiment": {
+            "id": "ReadGroupExperiment",
+            "properties": {
+                "instrumentModel": {
+                    "description": "The instrument model used as part of this experiment. This maps to sequencing technology in BAM.",
+                    "type": "string"
+                },
+                "libraryId": {
+                    "description": "The library used as part of this experiment. Note: This is not an actual ID within this repository, but rather an identifier for a library which may be meaningful to some external system.",
+                    "type": "string"
+                },
+                "platformUnit": {
+                    "description": "The platform unit used as part of this experiment e.g. flowcell-barcode.lane for Illumina or slide for SOLiD. Corresponds to the",
+                    "type": "string"
+                },
+                "sequencingCenter": {
+                    "description": "The sequencing center used as part of this experiment.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "ReadGroupProgram": {
+            "id": "ReadGroupProgram",
+            "properties": {
+                "commandLine": {
+                    "description": "The command line used to run this program.",
+                    "type": "string"
+                },
+                "id": {
+                    "description": "The user specified locally unique ID of the program. Used along with prevProgramId to define an ordering between programs.",
+                    "type": "string"
+                },
+                "name": {
+                    "description": "The name of the program.",
+                    "type": "string"
+                },
+                "prevProgramId": {
+                    "description": "The ID of the program run before this one.",
+                    "type": "string"
+                },
+                "version": {
+                    "description": "The version of the program run.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "ReadGroupSet": {
+            "description": "A read group set is a logical collection of read groups, which are collections of reads produced by a sequencer. A read group set typically models reads corresponding to one sample, sequenced one way, and aligned one way.  \n- A read group set belongs to one dataset.\n- A read group belongs to one read group set.\n- A read belongs to one read group.",
+            "id": "ReadGroupSet",
+            "properties": {
+                "datasetId": {
+                    "description": "The dataset ID.",
+                    "type": "string"
+                },
+                "filename": {
+                    "description": "The filename of the original source file for this read group set, if any.",
+                    "type": "string"
+                },
+                "id": {
+                    "description": "The read group set ID.",
+                    "type": "string"
+                },
+                "name": {
+                    "description": "The read group set name. By default this will be initialized to the sample name of the sequenced data contained in this set.",
+                    "type": "string"
+                },
+                "readGroups": {
+                    "description": "The read groups in this set. There are typically 1-10 read groups in a read group set.",
+                    "items": {
+                        "$ref": "ReadGroup"
+                    },
+                    "type": "array"
+                },
+                "referenceSetId": {
+                    "description": "The reference set the reads in this read group set are aligned to.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "Reference": {
+            "description": "A reference is a canonical assembled DNA sequence, intended to act as a reference coordinate space for other genomic annotations. A single reference might represent the human chromosome 1 or mitochandrial DNA, for instance. A reference belongs to one or more reference sets.",
+            "id": "Reference",
+            "properties": {
+                "id": {
+                    "description": "The Google generated immutable ID of the reference.",
+                    "type": "string"
+                },
+                "length": {
+                    "description": "The length of this reference's sequence.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "md5checksum": {
+                    "description": "MD5 of the upper-case sequence excluding all whitespace characters (this is equivalent to SQ:M5 in SAM). This value is represented in lower case hexadecimal format.",
+                    "type": "string"
+                },
+                "name": {
+                    "description": "The name of this reference, for example 22.",
+                    "type": "string"
+                },
+                "ncbiTaxonId": {
+                    "description": "ID from http://www.ncbi.nlm.nih.gov/taxonomy (e.g. 9606->human) if not specified by the containing reference set.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "sourceAccessions": {
+                    "description": "All known corresponding accession IDs in INSDC (GenBank/ENA/DDBJ) ideally with a version number, for example GCF_000001405.26.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "sourceURI": {
+                    "description": "The URI from which the sequence was obtained. Specifies a FASTA format file/string with one name, sequence pair.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "ReferenceBound": {
+            "description": "ReferenceBound records an upper bound for the starting coordinate of variants in a particular reference.",
+            "id": "ReferenceBound",
+            "properties": {
+                "referenceName": {
+                    "description": "The reference the bound is associate with.",
+                    "type": "string"
+                },
+                "upperBound": {
+                    "description": "An upper bound (inclusive) on the starting coordinate of any variant in the reference sequence.",
+                    "format": "int64",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "ReferenceSet": {
+            "description": "A reference set is a set of references which typically comprise a reference assembly for a species, such as GRCh38 which is representative of the human genome. A reference set defines a common coordinate space for comparing reference-aligned experimental data. A reference set contains 1 or more references.",
+            "id": "ReferenceSet",
+            "properties": {
+                "assemblyId": {
+                    "description": "Public id of this reference set, such as GRCh37.",
+                    "type": "string"
+                },
+                "description": {
+                    "description": "Optional free text description of this reference set.",
+                    "type": "string"
+                },
+                "id": {
+                    "description": "The Google generated immutable ID of the reference set.",
+                    "type": "string"
+                },
+                "md5checksum": {
+                    "description": "Order-independent MD5 checksum which identifies this reference set. The checksum is computed by sorting all lower case hexidecimal string reference.md5checksum (for all reference in this set) in ascending lexicographic order, concatenating, and taking the MD5 of that value. The resulting value is represented in lower case hexadecimal format.",
+                    "type": "string"
+                },
+                "ncbiTaxonId": {
+                    "description": "ID from http://www.ncbi.nlm.nih.gov/taxonomy (e.g. 9606->human) indicating the species which this assembly is intended to model. Note that contained references may specify a different ncbiTaxonId, as assemblies may contain reference sequences which do not belong to the modeled species, e.g. EBV in a human reference genome.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "referenceIds": {
+                    "description": "The IDs of the reference objects that are part of this set. Reference.md5checksum must be unique within this set.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "sourceAccessions": {
+                    "description": "All known corresponding accession IDs in INSDC (GenBank/ENA/DDBJ) ideally with a version number, for example NC_000001.11.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "sourceURI": {
+                    "description": "The URI from which the references were obtained.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "SearchCallSetsRequest": {
+            "description": "The call set search request.",
+            "id": "SearchCallSetsRequest",
+            "properties": {
+                "name": {
+                    "description": "Only return call sets for which a substring of the name matches this string.",
+                    "type": "string"
+                },
+                "pageSize": {
+                    "description": "The maximum number of call sets to return.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "pageToken": {
+                    "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response.",
+                    "type": "string"
+                },
+                "variantSetIds": {
+                    "description": "Restrict the query to call sets within the given variant sets. At least one ID must be provided.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "SearchCallSetsResponse": {
+            "description": "The call set search response.",
+            "id": "SearchCallSetsResponse",
+            "properties": {
+                "callSets": {
+                    "description": "The list of matching call sets.",
+                    "items": {
+                        "$ref": "CallSet"
+                    },
+                    "type": "array"
+                },
+                "nextPageToken": {
+                    "description": "The continuation token, which is used to page through large result sets. Provide this value in a subsequent request to return the next page of results. This field will be empty if there aren't any additional results.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "SearchJobsRequest": {
+            "description": "The jobs search request.",
+            "id": "SearchJobsRequest",
+            "properties": {
+                "createdAfter": {
+                    "description": "If specified, only jobs created on or after this date, given in milliseconds since Unix epoch, will be returned.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "createdBefore": {
+                    "description": "If specified, only jobs created prior to this date, given in milliseconds since Unix epoch, will be returned.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "pageSize": {
+                    "description": "Specifies the number of results to return in a single page. Defaults to 128. The maximum value is 256.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "pageToken": {
+                    "description": "The continuation token which is used to page through large result sets. To get the next page of results, set this parameter to the value of the nextPageToken from the previous response.",
+                    "type": "string"
+                },
+                "projectNumber": {
+                    "description": "Required. Only return jobs which belong to this Google Developers",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "status": {
+                    "description": "Only return jobs which have a matching status.",
+                    "items": {
+                        "enum": [
+                            "CANCELED",
+                            "FAILURE",
+                            "NEW",
+                            "PENDING",
+                            "RUNNING",
+                            "SUCCESS",
+                            "UNKNOWN_STATUS"
+                        ],
+                        "enumDescriptions": [
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            ""
+                        ],
+                        "type": "string"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "SearchJobsResponse": {
+            "description": "The job search response.",
+            "id": "SearchJobsResponse",
+            "properties": {
+                "jobs": {
+                    "description": "The list of jobs results, ordered newest to oldest.",
+                    "items": {
+                        "$ref": "Job"
+                    },
+                    "type": "array"
+                },
+                "nextPageToken": {
+                    "description": "The continuation token which is used to page through large result sets. Provide this value is a subsequent request to return the next page of results. This field will be empty if there are no more results.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "SearchReadGroupSetsRequest": {
+            "description": "The read group set search request.",
+            "id": "SearchReadGroupSetsRequest",
+            "properties": {
+                "datasetIds": {
+                    "description": "Restricts this query to read group sets within the given datasets. At least one ID must be provided.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "name": {
+                    "description": "Only return read group sets for which a substring of the name matches this string.",
+                    "type": "string"
+                },
+                "pageSize": {
+                    "description": "Specifies number of results to return in a single page. If unspecified, it will default to 128. The maximum value is 1024.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "pageToken": {
+                    "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "SearchReadGroupSetsResponse": {
+            "description": "The read group set search response.",
+            "id": "SearchReadGroupSetsResponse",
+            "properties": {
+                "nextPageToken": {
+                    "description": "The continuation token, which is used to page through large result sets. Provide this value in a subsequent request to return the next page of results. This field will be empty if there aren't any additional results.",
+                    "type": "string"
+                },
+                "readGroupSets": {
+                    "description": "The list of matching read group sets.",
+                    "items": {
+                        "$ref": "ReadGroupSet"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "SearchReadsRequest": {
+            "description": "The read search request.",
+            "id": "SearchReadsRequest",
+            "properties": {
+                "end": {
+                    "description": "The end position of the range on the reference, 0-based exclusive. If specified, referenceName must also be specified.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "pageSize": {
+                    "description": "Specifies number of results to return in a single page. If unspecified, it will default to 256. The maximum value is 2048.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "pageToken": {
+                    "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response.",
+                    "type": "string"
+                },
+                "readGroupIds": {
+                    "description": "The IDs of the read groups within which to search for reads. All specified read groups must belong to the same read group sets. Must specify one of readGroupSetIds or readGroupIds.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "readGroupSetIds": {
+                    "description": "The IDs of the read groups sets within which to search for reads. All specified read group sets must be aligned against a common set of reference sequences; this defines the genomic coordinates for the query. Must specify one of readGroupSetIds or readGroupIds.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "referenceName": {
+                    "description": "The reference sequence name, for example chr1, 1, or chrX. If set to *, only unmapped reads are returned.",
+                    "type": "string"
+                },
+                "start": {
+                    "description": "The start position of the range on the reference, 0-based inclusive. If specified, referenceName must also be specified.",
+                    "format": "int64",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "SearchReadsResponse": {
+            "description": "The read search response.",
+            "id": "SearchReadsResponse",
+            "properties": {
+                "alignments": {
+                    "description": "The list of matching alignments sorted by mapped genomic coordinate, if any, ascending in position within the same reference. Unmapped reads, which have no position, are returned last and are further sorted in ascending lexicographic order by fragment name.",
+                    "items": {
+                        "$ref": "Read"
+                    },
+                    "type": "array"
+                },
+                "nextPageToken": {
+                    "description": "The continuation token, which is used to page through large result sets. Provide this value in a subsequent request to return the next page of results. This field will be empty if there aren't any additional results.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "SearchReferenceSetsRequest": {
+            "id": "SearchReferenceSetsRequest",
+            "properties": {
+                "accessions": {
+                    "description": "If present, return references for which the accession matches any of these strings. Best to give a version number, for example GCF_000001405.26. If only the main accession number is given then all records with that main accession will be returned, whichever version. Note that different versions will have different sequences.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "md5checksums": {
+                    "description": "If present, return references for which the md5checksum matches. See ReferenceSet.md5checksum for details.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "pageSize": {
+                    "description": "Specifies the maximum number of results to return in a single page.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "pageToken": {
+                    "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "SearchReferenceSetsResponse": {
+            "id": "SearchReferenceSetsResponse",
+            "properties": {
+                "nextPageToken": {
+                    "description": "The continuation token, which is used to page through large result sets. Provide this value in a subsequent request to return the next page of results. This field will be empty if there aren't any additional results.",
+                    "type": "string"
+                },
+                "referenceSets": {
+                    "description": "The matching references sets.",
+                    "items": {
+                        "$ref": "ReferenceSet"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "SearchReferencesRequest": {
+            "description": "",
+            "id": "SearchReferencesRequest",
+            "properties": {
+                "accessions": {
+                    "description": "If present, return references for which the accession matches this string. Best to give a version number, for example GCF_000001405.26. If only the main accession number is given then all records with that main accession will be returned, whichever version. Note that different versions will have different sequences.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "md5checksums": {
+                    "description": "If present, return references for which the md5checksum matches. See Reference.md5checksum for construction details.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "pageSize": {
+                    "description": "Specifies the maximum number of results to return in a single page.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "pageToken": {
+                    "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response.",
+                    "type": "string"
+                },
+                "referenceSetId": {
+                    "description": "If present, return only references which belong to this reference set.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "SearchReferencesResponse": {
+            "id": "SearchReferencesResponse",
+            "properties": {
+                "nextPageToken": {
+                    "description": "The continuation token, which is used to page through large result sets. Provide this value in a subsequent request to return the next page of results. This field will be empty if there aren't any additional results.",
+                    "type": "string"
+                },
+                "references": {
+                    "description": "The matching references.",
+                    "items": {
+                        "$ref": "Reference"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "SearchVariantSetsRequest": {
+            "description": "The search variant sets request.",
+            "id": "SearchVariantSetsRequest",
+            "properties": {
+                "datasetIds": {
+                    "description": "Exactly one dataset ID must be provided here. Only variant sets which belong to this dataset will be returned.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "pageSize": {
+                    "description": "The maximum number of variant sets to return in a request.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "pageToken": {
+                    "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "SearchVariantSetsResponse": {
+            "description": "The search variant sets response.",
+            "id": "SearchVariantSetsResponse",
+            "properties": {
+                "nextPageToken": {
+                    "description": "The continuation token, which is used to page through large result sets. Provide this value in a subsequent request to return the next page of results. This field will be empty if there aren't any additional results.",
+                    "type": "string"
+                },
+                "variantSets": {
+                    "description": "The variant sets belonging to the requested dataset.",
+                    "items": {
+                        "$ref": "VariantSet"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "SearchVariantsRequest": {
+            "description": "The variant search request.",
+            "id": "SearchVariantsRequest",
+            "properties": {
+                "callSetIds": {
+                    "description": "Only return variant calls which belong to call sets with these ids. Leaving this blank returns all variant calls. If a variant has no calls belonging to any of these call sets, it won't be returned at all. Currently, variants with no calls from any call set will never be returned.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "end": {
+                    "description": "Required. The end of the window (0-based, exclusive) for which overlapping variants should be returned.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "maxCalls": {
+                    "description": "The maximum number of calls to return. However, at least one variant will always be returned, even if it has more calls than this limit.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "pageSize": {
+                    "description": "The maximum number of variants to return.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "pageToken": {
+                    "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response.",
+                    "type": "string"
+                },
+                "referenceName": {
+                    "description": "Required. Only return variants in this reference sequence.",
+                    "type": "string"
+                },
+                "start": {
+                    "description": "Required. The beginning of the window (0-based, inclusive) for which overlapping variants should be returned.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "variantName": {
+                    "description": "Only return variants which have exactly this name.",
+                    "type": "string"
+                },
+                "variantSetIds": {
+                    "description": "Exactly one variant set ID must be provided. Only variants from this variant set will be returned.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "SearchVariantsResponse": {
+            "description": "The variant search response.",
+            "id": "SearchVariantsResponse",
+            "properties": {
+                "nextPageToken": {
+                    "description": "The continuation token, which is used to page through large result sets. Provide this value in a subsequent request to return the next page of results. This field will be empty if there aren't any additional results.",
+                    "type": "string"
+                },
+                "variants": {
+                    "description": "The list of matching Variants.",
+                    "items": {
+                        "$ref": "Variant"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "Variant": {
+            "description": "A variant represents a change in DNA sequence relative to a reference sequence. For example, a variant could represent a SNP or an insertion. Variants belong to a variant set. Each of the calls on a variant represent a determination of genotype with respect to that variant. For example, a call might assign probability of 0.32 to the occurrence of a SNP named rs1234 in a sample named NA12345. A call belongs to a call set, which contains related calls typically from one sample.",
+            "id": "Variant",
+            "properties": {
+                "alternateBases": {
+                    "description": "The bases that appear instead of the reference bases.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "calls": {
+                    "description": "The variant calls for this particular variant. Each one represents the determination of genotype with respect to this variant.",
+                    "items": {
+                        "$ref": "Call"
+                    },
+                    "type": "array"
+                },
+                "created": {
+                    "description": "The date this variant was created, in milliseconds from the epoch.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "end": {
+                    "description": "The end position (0-based) of this variant. This corresponds to the first base after the last base in the reference allele. So, the length of the reference allele is (end - start). This is useful for variants that don't explicitly give alternate bases, for example large deletions.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "filter": {
+                    "description": "A list of filters (normally quality filters) this variant has failed. PASS indicates this variant has passed all filters.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "id": {
+                    "description": "The Google generated ID of the variant, immutable.",
+                    "type": "string"
+                },
+                "info": {
+                    "additionalProperties": {
+                        "description": "A string which maps to an array of values.",
+                        "items": {
+                            "type": "string"
+                        },
+                        "type": "array"
+                    },
+                    "description": "A map of additional variant information.",
+                    "type": "object"
+                },
+                "names": {
+                    "description": "Names for the variant, for example a RefSNP ID.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "quality": {
+                    "description": "A measure of how likely this variant is to be real. A higher value is better.",
+                    "format": "double",
+                    "type": "number"
+                },
+                "referenceBases": {
+                    "description": "The reference bases for this variant. They start at the given position.",
+                    "type": "string"
+                },
+                "referenceName": {
+                    "description": "The reference on which this variant occurs. (such as chr20 or X)",
+                    "type": "string"
+                },
+                "start": {
+                    "description": "The position at which this variant occurs (0-based). This corresponds to the first base of the string of reference bases.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "variantSetId": {
+                    "description": "The ID of the variant set this variant belongs to.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "VariantSet": {
+            "description": "A variant set is a collection of call sets and variants. It contains summary statistics of those contents. A variant set belongs to a dataset.",
+            "id": "VariantSet",
+            "properties": {
+                "datasetId": {
+                    "description": "The dataset to which this variant set belongs. Immutable.",
+                    "type": "string"
+                },
+                "id": {
+                    "description": "The Google-generated ID of the variant set. Immutable.",
+                    "type": "string"
+                },
+                "metadata": {
+                    "description": "The metadata associated with this variant set.",
+                    "items": {
+                        "$ref": "Metadata"
+                    },
+                    "type": "array"
+                },
+                "referenceBounds": {
+                    "description": "A list of all references used by the variants in a variant set with associated coordinate upper bounds for each one.",
+                    "items": {
+                        "$ref": "ReferenceBound"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        }
+    },
+    "servicePath": "genomics/v1beta2/",
+    "title": "Genomics API",
+    "version": "v1beta2"
+}
\ No newline at end of file
diff --git a/discovery/googleapis_beta/pubsub__v1beta1.json b/discovery/googleapis_beta/pubsub__v1beta1.json
index e44aa60..ee23df9 100644
--- a/discovery/googleapis_beta/pubsub__v1beta1.json
+++ b/discovery/googleapis_beta/pubsub__v1beta1.json
@@ -17,7 +17,7 @@
     "description": "Provides reliable, many-to-many, asynchronous messaging between applications.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/pubsub/v1beta1",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/ywePitQXGabB9vHcCh_sNtCXjDU\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/ZNCHPHCSd3g-pKxhKxXU20RmqpY\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/search-16.gif",
         "x32": "https://www.google.com/images/icons/product/search-32.gif"
@@ -93,7 +93,7 @@
                     ]
                 },
                 "create": {
-                    "description": "Creates a subscription on a given topic for a given subscriber. If the subscription already exists, returns ALREADY_EXISTS. If the corresponding topic doesn't exist, returns NOT_FOUND.",
+                    "description": "Creates a subscription on a given topic for a given subscriber. If the subscription already exists, returns ALREADY_EXISTS. If the corresponding topic doesn't exist, returns NOT_FOUND.\n\nIf the name is not provided in the request, the server will assign a random name for this subscription on the same project as the topic.",
                     "httpMethod": "POST",
                     "id": "pubsub.subscriptions.create",
                     "path": "subscriptions",
@@ -338,7 +338,7 @@
             }
         }
     },
-    "revision": "20140919",
+    "revision": "20141028",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AcknowledgeRequest": {
@@ -453,7 +453,7 @@
                     "description": "The message to publish."
                 },
                 "topic": {
-                    "description": "The name of the topic for which the message is being added.",
+                    "description": "The message in the request will be published on this topic.",
                     "type": "string"
                 }
             },
diff --git a/discovery/googleapis_beta/replicapool__v1beta1.json b/discovery/googleapis_beta/replicapool__v1beta1.json
deleted file mode 100644
index d07de73..0000000
--- a/discovery/googleapis_beta/replicapool__v1beta1.json
+++ /dev/null
@@ -1,1109 +0,0 @@
-{
-    "auth": {
-        "oauth2": {
-            "scopes": {
-                "https://www.googleapis.com/auth/cloud-platform": {
-                    "description": "View and manage your data across Google Cloud Platform services"
-                },
-                "https://www.googleapis.com/auth/ndev.cloudman": {
-                    "description": "View and manage your Google Cloud Platform management resources and deployment status information"
-                },
-                "https://www.googleapis.com/auth/ndev.cloudman.readonly": {
-                    "description": "View your Google Cloud Platform management resources and deployment status information"
-                },
-                "https://www.googleapis.com/auth/replicapool": {
-                    "description": "View and manage replica pools"
-                },
-                "https://www.googleapis.com/auth/replicapool.readonly": {
-                    "description": "View replica pools"
-                }
-            }
-        }
-    },
-    "basePath": "/replicapool/v1beta1/projects/",
-    "baseUrl": "https://www.googleapis.com/replicapool/v1beta1/projects/",
-    "batchPath": "batch",
-    "description": "The Replica Pool API allows users to declaratively provision and manage groups of Google Compute Engine instances based on a common template.",
-    "discoveryVersion": "v1",
-    "documentationLink": "https://developers.google.com/compute/docs/replica-pool/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/OCNWVpxMyrgI9AhJbRIevULm13s\"",
-    "icons": {
-        "x16": "http://www.google.com/images/icons/product/search-16.gif",
-        "x32": "http://www.google.com/images/icons/product/search-32.gif"
-    },
-    "id": "replicapool:v1beta1",
-    "kind": "discovery#restDescription",
-    "labels": [
-        "limited_availability"
-    ],
-    "name": "replicapool",
-    "ownerDomain": "google.com",
-    "ownerName": "Google",
-    "parameters": {
-        "alt": {
-            "default": "json",
-            "description": "Data format for the response.",
-            "enum": [
-                "json"
-            ],
-            "enumDescriptions": [
-                "Responses with Content-Type of application/json"
-            ],
-            "location": "query",
-            "type": "string"
-        },
-        "fields": {
-            "description": "Selector specifying which fields to include in a partial response.",
-            "location": "query",
-            "type": "string"
-        },
-        "key": {
-            "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-            "location": "query",
-            "type": "string"
-        },
-        "oauth_token": {
-            "description": "OAuth 2.0 token for the current user.",
-            "location": "query",
-            "type": "string"
-        },
-        "prettyPrint": {
-            "default": "true",
-            "description": "Returns response with indentations and line breaks.",
-            "location": "query",
-            "type": "boolean"
-        },
-        "quotaUser": {
-            "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.",
-            "location": "query",
-            "type": "string"
-        },
-        "userIp": {
-            "description": "IP address of the site where the request originates. Use this if you want to enforce per-user limits.",
-            "location": "query",
-            "type": "string"
-        }
-    },
-    "protocol": "rest",
-    "resources": {
-        "pools": {
-            "methods": {
-                "delete": {
-                    "description": "Deletes a replica pool.",
-                    "httpMethod": "POST",
-                    "id": "replicapool.pools.delete",
-                    "parameterOrder": [
-                        "projectName",
-                        "zone",
-                        "poolName"
-                    ],
-                    "parameters": {
-                        "poolName": {
-                            "description": "The name of the replica pool for this request.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        },
-                        "projectName": {
-                            "description": "The project ID for this replica pool.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        },
-                        "zone": {
-                            "description": "The zone for this replica pool.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        }
-                    },
-                    "path": "{projectName}/zones/{zone}/pools/{poolName}",
-                    "request": {
-                        "$ref": "PoolsDeleteRequest"
-                    },
-                    "scopes": [
-                        "https://www.googleapis.com/auth/cloud-platform",
-                        "https://www.googleapis.com/auth/ndev.cloudman",
-                        "https://www.googleapis.com/auth/replicapool"
-                    ]
-                },
-                "get": {
-                    "description": "Gets information about a single replica pool.",
-                    "httpMethod": "GET",
-                    "id": "replicapool.pools.get",
-                    "parameterOrder": [
-                        "projectName",
-                        "zone",
-                        "poolName"
-                    ],
-                    "parameters": {
-                        "poolName": {
-                            "description": "The name of the replica pool for this request.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        },
-                        "projectName": {
-                            "description": "The project ID for this replica pool.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        },
-                        "zone": {
-                            "description": "The zone for this replica pool.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        }
-                    },
-                    "path": "{projectName}/zones/{zone}/pools/{poolName}",
-                    "response": {
-                        "$ref": "Pool"
-                    },
-                    "scopes": [
-                        "https://www.googleapis.com/auth/cloud-platform",
-                        "https://www.googleapis.com/auth/ndev.cloudman",
-                        "https://www.googleapis.com/auth/ndev.cloudman.readonly",
-                        "https://www.googleapis.com/auth/replicapool",
-                        "https://www.googleapis.com/auth/replicapool.readonly"
-                    ]
-                },
-                "insert": {
-                    "description": "Inserts a new replica pool.",
-                    "httpMethod": "POST",
-                    "id": "replicapool.pools.insert",
-                    "parameterOrder": [
-                        "projectName",
-                        "zone"
-                    ],
-                    "parameters": {
-                        "projectName": {
-                            "description": "The project ID for this replica pool.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        },
-                        "zone": {
-                            "description": "The zone for this replica pool.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        }
-                    },
-                    "path": "{projectName}/zones/{zone}/pools",
-                    "request": {
-                        "$ref": "Pool"
-                    },
-                    "response": {
-                        "$ref": "Pool"
-                    },
-                    "scopes": [
-                        "https://www.googleapis.com/auth/cloud-platform",
-                        "https://www.googleapis.com/auth/ndev.cloudman",
-                        "https://www.googleapis.com/auth/replicapool"
-                    ]
-                },
-                "list": {
-                    "description": "List all replica pools.",
-                    "httpMethod": "GET",
-                    "id": "replicapool.pools.list",
-                    "parameterOrder": [
-                        "projectName",
-                        "zone"
-                    ],
-                    "parameters": {
-                        "maxResults": {
-                            "default": "500",
-                            "description": "Maximum count of results to be returned. Acceptable values are 0 to 100, inclusive. (Default: 50)",
-                            "format": "int32",
-                            "location": "query",
-                            "maximum": "1000",
-                            "minimum": "0",
-                            "type": "integer"
-                        },
-                        "pageToken": {
-                            "description": "Set this to the nextPageToken value returned by a previous list request to obtain the next page of results from the previous list request.",
-                            "location": "query",
-                            "type": "string"
-                        },
-                        "projectName": {
-                            "description": "The project ID for this request.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        },
-                        "zone": {
-                            "description": "The zone for this replica pool.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        }
-                    },
-                    "path": "{projectName}/zones/{zone}/pools",
-                    "response": {
-                        "$ref": "PoolsListResponse"
-                    },
-                    "scopes": [
-                        "https://www.googleapis.com/auth/cloud-platform",
-                        "https://www.googleapis.com/auth/ndev.cloudman",
-                        "https://www.googleapis.com/auth/ndev.cloudman.readonly",
-                        "https://www.googleapis.com/auth/replicapool",
-                        "https://www.googleapis.com/auth/replicapool.readonly"
-                    ]
-                },
-                "resize": {
-                    "description": "Resize a pool. This is an asynchronous operation, and multiple overlapping resize requests can be made. Replica Pools will use the information from the last resize request.",
-                    "httpMethod": "POST",
-                    "id": "replicapool.pools.resize",
-                    "parameterOrder": [
-                        "projectName",
-                        "zone",
-                        "poolName"
-                    ],
-                    "parameters": {
-                        "numReplicas": {
-                            "description": "The desired number of replicas to resize to. If this number is larger than the existing number of replicas, new replicas will be added. If the number is smaller, then existing replicas will be deleted.",
-                            "format": "int32",
-                            "location": "query",
-                            "type": "integer"
-                        },
-                        "poolName": {
-                            "description": "The name of the replica pool for this request.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        },
-                        "projectName": {
-                            "description": "The project ID for this replica pool.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        },
-                        "zone": {
-                            "description": "The zone for this replica pool.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        }
-                    },
-                    "path": "{projectName}/zones/{zone}/pools/{poolName}/resize",
-                    "response": {
-                        "$ref": "Pool"
-                    },
-                    "scopes": [
-                        "https://www.googleapis.com/auth/cloud-platform",
-                        "https://www.googleapis.com/auth/ndev.cloudman",
-                        "https://www.googleapis.com/auth/replicapool"
-                    ]
-                },
-                "updatetemplate": {
-                    "description": "Update the template used by the pool.",
-                    "httpMethod": "POST",
-                    "id": "replicapool.pools.updatetemplate",
-                    "parameterOrder": [
-                        "projectName",
-                        "zone",
-                        "poolName"
-                    ],
-                    "parameters": {
-                        "poolName": {
-                            "description": "The name of the replica pool for this request.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        },
-                        "projectName": {
-                            "description": "The project ID for this replica pool.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        },
-                        "zone": {
-                            "description": "The zone for this replica pool.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        }
-                    },
-                    "path": "{projectName}/zones/{zone}/pools/{poolName}/updateTemplate",
-                    "request": {
-                        "$ref": "Template"
-                    },
-                    "scopes": [
-                        "https://www.googleapis.com/auth/cloud-platform",
-                        "https://www.googleapis.com/auth/ndev.cloudman",
-                        "https://www.googleapis.com/auth/replicapool"
-                    ]
-                }
-            }
-        },
-        "replicas": {
-            "methods": {
-                "delete": {
-                    "description": "Deletes a replica from the pool.",
-                    "httpMethod": "POST",
-                    "id": "replicapool.replicas.delete",
-                    "parameterOrder": [
-                        "projectName",
-                        "zone",
-                        "poolName",
-                        "replicaName"
-                    ],
-                    "parameters": {
-                        "poolName": {
-                            "description": "The replica pool name for this request.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        },
-                        "projectName": {
-                            "description": "The project ID for this request.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        },
-                        "replicaName": {
-                            "description": "The name of the replica for this request.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        },
-                        "zone": {
-                            "description": "The zone where the replica lives.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        }
-                    },
-                    "path": "{projectName}/zones/{zone}/pools/{poolName}/replicas/{replicaName}",
-                    "request": {
-                        "$ref": "ReplicasDeleteRequest"
-                    },
-                    "response": {
-                        "$ref": "Replica"
-                    },
-                    "scopes": [
-                        "https://www.googleapis.com/auth/cloud-platform",
-                        "https://www.googleapis.com/auth/ndev.cloudman",
-                        "https://www.googleapis.com/auth/replicapool"
-                    ]
-                },
-                "get": {
-                    "description": "Gets information about a specific replica.",
-                    "httpMethod": "GET",
-                    "id": "replicapool.replicas.get",
-                    "parameterOrder": [
-                        "projectName",
-                        "zone",
-                        "poolName",
-                        "replicaName"
-                    ],
-                    "parameters": {
-                        "poolName": {
-                            "description": "The replica pool name for this request.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        },
-                        "projectName": {
-                            "description": "The project ID for this request.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        },
-                        "replicaName": {
-                            "description": "The name of the replica for this request.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        },
-                        "zone": {
-                            "description": "The zone where the replica lives.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        }
-                    },
-                    "path": "{projectName}/zones/{zone}/pools/{poolName}/replicas/{replicaName}",
-                    "response": {
-                        "$ref": "Replica"
-                    },
-                    "scopes": [
-                        "https://www.googleapis.com/auth/cloud-platform",
-                        "https://www.googleapis.com/auth/ndev.cloudman",
-                        "https://www.googleapis.com/auth/ndev.cloudman.readonly",
-                        "https://www.googleapis.com/auth/replicapool",
-                        "https://www.googleapis.com/auth/replicapool.readonly"
-                    ]
-                },
-                "list": {
-                    "description": "Lists all replicas in a pool.",
-                    "httpMethod": "GET",
-                    "id": "replicapool.replicas.list",
-                    "parameterOrder": [
-                        "projectName",
-                        "zone",
-                        "poolName"
-                    ],
-                    "parameters": {
-                        "maxResults": {
-                            "default": "500",
-                            "description": "Maximum count of results to be returned. Acceptable values are 0 to 100, inclusive. (Default: 50)",
-                            "format": "int32",
-                            "location": "query",
-                            "maximum": "1000",
-                            "minimum": "0",
-                            "type": "integer"
-                        },
-                        "pageToken": {
-                            "description": "Set this to the nextPageToken value returned by a previous list request to obtain the next page of results from the previous list request.",
-                            "location": "query",
-                            "type": "string"
-                        },
-                        "poolName": {
-                            "description": "The replica pool name for this request.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        },
-                        "projectName": {
-                            "description": "The project ID for this request.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        },
-                        "zone": {
-                            "description": "The zone where the replica pool lives.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        }
-                    },
-                    "path": "{projectName}/zones/{zone}/pools/{poolName}/replicas",
-                    "response": {
-                        "$ref": "ReplicasListResponse"
-                    },
-                    "scopes": [
-                        "https://www.googleapis.com/auth/cloud-platform",
-                        "https://www.googleapis.com/auth/ndev.cloudman",
-                        "https://www.googleapis.com/auth/ndev.cloudman.readonly",
-                        "https://www.googleapis.com/auth/replicapool",
-                        "https://www.googleapis.com/auth/replicapool.readonly"
-                    ]
-                },
-                "restart": {
-                    "description": "Restarts a replica in a pool.",
-                    "httpMethod": "POST",
-                    "id": "replicapool.replicas.restart",
-                    "parameterOrder": [
-                        "projectName",
-                        "zone",
-                        "poolName",
-                        "replicaName"
-                    ],
-                    "parameters": {
-                        "poolName": {
-                            "description": "The replica pool name for this request.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        },
-                        "projectName": {
-                            "description": "The project ID for this request.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        },
-                        "replicaName": {
-                            "description": "The name of the replica for this request.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        },
-                        "zone": {
-                            "description": "The zone where the replica lives.",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        }
-                    },
-                    "path": "{projectName}/zones/{zone}/pools/{poolName}/replicas/{replicaName}/restart",
-                    "response": {
-                        "$ref": "Replica"
-                    },
-                    "scopes": [
-                        "https://www.googleapis.com/auth/cloud-platform",
-                        "https://www.googleapis.com/auth/ndev.cloudman",
-                        "https://www.googleapis.com/auth/replicapool"
-                    ]
-                }
-            }
-        }
-    },
-    "revision": "20141002",
-    "rootUrl": "https://www.googleapis.com/",
-    "schemas": {
-        "AccessConfig": {
-            "description": "A Compute Engine network accessConfig. Identical to the accessConfig on corresponding Compute Engine resource.",
-            "id": "AccessConfig",
-            "properties": {
-                "name": {
-                    "description": "Name of this access configuration.",
-                    "type": "string"
-                },
-                "natIp": {
-                    "description": "An external IP address associated with this instance.",
-                    "type": "string"
-                },
-                "type": {
-                    "description": "Type of this access configuration file. Currently only ONE_TO_ONE_NAT is supported.",
-                    "type": "string"
-                }
-            },
-            "type": "object"
-        },
-        "Action": {
-            "description": "An action that gets executed during initialization of the replicas.",
-            "id": "Action",
-            "properties": {
-                "commands": {
-                    "description": "A list of commands to run, one per line. If any command fails, the whole action is considered a failure and no further actions are run. This also marks the virtual machine or replica as a failure.",
-                    "items": {
-                        "type": "string"
-                    },
-                    "type": "array"
-                },
-                "envVariables": {
-                    "description": "A list of environment variables to use for the commands in this action.",
-                    "items": {
-                        "$ref": "EnvVariable"
-                    },
-                    "type": "array"
-                },
-                "timeoutMilliSeconds": {
-                    "description": "If an action's commands on a particular replica do not finish in the specified timeoutMilliSeconds, the replica is considered to be in a FAILING state. No efforts are made to stop any processes that were spawned or created as the result of running the action's commands. The default is the max allowed value, 1 hour (i.e. 3600000 milliseconds).",
-                    "format": "int32",
-                    "type": "integer"
-                }
-            },
-            "type": "object"
-        },
-        "DiskAttachment": {
-            "description": "Specifies how to attach a disk to a Replica.",
-            "id": "DiskAttachment",
-            "properties": {
-                "deviceName": {
-                    "description": "The device name of this disk.",
-                    "type": "string"
-                },
-                "index": {
-                    "description": "A zero-based index to assign to this disk, where 0 is reserved for the boot disk. If not specified, this is assigned by the server.",
-                    "format": "uint32",
-                    "type": "integer"
-                }
-            },
-            "type": "object"
-        },
-        "EnvVariable": {
-            "description": "An environment variable to set for an action.",
-            "id": "EnvVariable",
-            "properties": {
-                "hidden": {
-                    "description": "Deprecated, do not use.",
-                    "type": "boolean"
-                },
-                "name": {
-                    "description": "The name of the environment variable.",
-                    "type": "string"
-                },
-                "value": {
-                    "description": "The value of the variable.",
-                    "type": "string"
-                }
-            },
-            "type": "object"
-        },
-        "ExistingDisk": {
-            "description": "A pre-existing persistent disk that will be attached to every Replica in the Pool in READ_ONLY mode.",
-            "id": "ExistingDisk",
-            "properties": {
-                "attachment": {
-                    "$ref": "DiskAttachment",
-                    "description": "How the disk will be attached to the Replica."
-                },
-                "source": {
-                    "description": "The name of the Persistent Disk resource. The Persistent Disk resource must be in the same zone as the Pool.",
-                    "type": "string"
-                }
-            },
-            "type": "object"
-        },
-        "HealthCheck": {
-            "id": "HealthCheck",
-            "properties": {
-                "checkIntervalSec": {
-                    "description": "How often (in seconds) to make HTTP requests for this healthcheck. The default value is 5 seconds.",
-                    "format": "int32",
-                    "type": "integer"
-                },
-                "description": {
-                    "description": "The description for this health check.",
-                    "type": "string"
-                },
-                "healthyThreshold": {
-                    "description": "The number of consecutive health check requests that need to succeed before the replica is considered healthy again. The default value is 2.",
-                    "format": "int32",
-                    "type": "integer"
-                },
-                "host": {
-                    "description": "The value of the host header in the HTTP health check request. If left empty (default value), the localhost IP 127.0.0.1 will be used.",
-                    "type": "string"
-                },
-                "name": {
-                    "description": "The name of this health check.",
-                    "type": "string"
-                },
-                "path": {
-                    "description": "The localhost request path to send this health check, in the format /path/to/use. For example, /healthcheck.",
-                    "type": "string"
-                },
-                "port": {
-                    "description": "The TCP port for the health check requests.",
-                    "format": "int32",
-                    "type": "integer"
-                },
-                "timeoutSec": {
-                    "description": "How long (in seconds) to wait before a timeout failure for this healthcheck. The default value is 5 seconds.",
-                    "format": "int32",
-                    "type": "integer"
-                },
-                "unhealthyThreshold": {
-                    "description": "The number of consecutive health check requests that need to fail in order to consider the replica unhealthy. The default value is 2.",
-                    "format": "int32",
-                    "type": "integer"
-                }
-            },
-            "type": "object"
-        },
-        "Label": {
-            "description": "A label to apply to this replica pool.",
-            "id": "Label",
-            "properties": {
-                "key": {
-                    "description": "The key for this label.",
-                    "type": "string"
-                },
-                "value": {
-                    "description": "The value of this label.",
-                    "type": "string"
-                }
-            },
-            "type": "object"
-        },
-        "Metadata": {
-            "description": "A Compute Engine metadata entry. Identical to the metadata on the corresponding Compute Engine resource.",
-            "id": "Metadata",
-            "properties": {
-                "fingerPrint": {
-                    "description": "The fingerprint of the metadata. Required for updating the metadata entries for this instance.",
-                    "type": "string"
-                },
-                "items": {
-                    "description": "A list of metadata items.",
-                    "items": {
-                        "$ref": "MetadataItem"
-                    },
-                    "type": "array"
-                }
-            },
-            "type": "object"
-        },
-        "MetadataItem": {
-            "description": "A Compute Engine metadata item, defined as a key:value pair. Identical to the metadata on the corresponding Compute Engine resource.",
-            "id": "MetadataItem",
-            "properties": {
-                "key": {
-                    "description": "A metadata key.",
-                    "type": "string"
-                },
-                "value": {
-                    "description": "A metadata value.",
-                    "type": "string"
-                }
-            },
-            "type": "object"
-        },
-        "NetworkInterface": {
-            "description": "A Compute Engine NetworkInterface resource. Identical to the NetworkInterface on the corresponding Compute Engine resource.",
-            "id": "NetworkInterface",
-            "properties": {
-                "accessConfigs": {
-                    "description": "An array of configurations for this interface. This specifies how this interface is configured to interact with other network services.",
-                    "items": {
-                        "$ref": "AccessConfig"
-                    },
-                    "type": "array"
-                },
-                "network": {
-                    "description": "Name the Network resource to which this interface applies.",
-                    "type": "string"
-                },
-                "networkIp": {
-                    "description": "An optional IPV4 internal network address to assign to the instance for this network interface.",
-                    "type": "string"
-                }
-            },
-            "type": "object"
-        },
-        "NewDisk": {
-            "description": "A Persistent Disk resource that will be created and attached to each Replica in the Pool. Each Replica will have a unique persistent disk that is created and attached to that Replica in READ_WRITE mode.",
-            "id": "NewDisk",
-            "properties": {
-                "attachment": {
-                    "$ref": "DiskAttachment",
-                    "description": "How the disk will be attached to the Replica."
-                },
-                "autoDelete": {
-                    "description": "If true, then this disk will be deleted when the instance is deleted. The default value is true.",
-                    "type": "boolean"
-                },
-                "boot": {
-                    "description": "If true, indicates that this is the root persistent disk.",
-                    "type": "boolean"
-                },
-                "initializeParams": {
-                    "$ref": "NewDiskInitializeParams",
-                    "description": "Create the new disk using these parameters. The name of the disk will be <instance_name>-<four_random_charactersgt;."
-                }
-            },
-            "type": "object"
-        },
-        "NewDiskInitializeParams": {
-            "description": "Initialization parameters for creating a new disk.",
-            "id": "NewDiskInitializeParams",
-            "properties": {
-                "diskSizeGb": {
-                    "description": "The size of the created disk in gigabytes.",
-                    "format": "int64",
-                    "type": "string"
-                },
-                "diskType": {
-                    "description": "Name of the disk type resource describing which disk type to use to create the disk. For example 'pd-ssd' or 'pd-standard'. Default is 'pd-standard'",
-                    "type": "string"
-                },
-                "sourceImage": {
-                    "description": "The name or fully-qualified URL of a source image to use to create this disk. If you provide a name of the source image, Replica Pool will look for an image with that name in your project. If you are specifying an image provided by Compute Engine, you will need to provide the full URL with the correct project, such as:\nhttp://www.googleapis.com/compute/v1/projects/debian-cloud/ global/images/debian-wheezy-7-vYYYYMMDD",
-                    "type": "string"
-                }
-            },
-            "type": "object"
-        },
-        "Pool": {
-            "id": "Pool",
-            "properties": {
-                "autoRestart": {
-                    "description": "Whether replicas in this pool should be restarted if they experience a failure. The default value is true.",
-                    "type": "boolean"
-                },
-                "baseInstanceName": {
-                    "description": "The base instance name to use for the replicas in this pool. This must match the regex [a-z]([-a-z0-9]*[a-z0-9])?. If specified, the instances in this replica pool will be named in the format <base-instance-name>-<ID>. The <ID> postfix will be a four character alphanumeric identifier generated by the service.\n\nIf this is not specified by the user, a random base instance name is generated by the service.",
-                    "type": "string"
-                },
-                "currentNumReplicas": {
-                    "description": "[Output Only] The current number of replicas in the pool.",
-                    "format": "int32",
-                    "type": "integer"
-                },
-                "description": {
-                    "description": "An optional description of the replica pool.",
-                    "type": "string"
-                },
-                "healthChecks": {
-                    "description": "Deprecated. Please use template[].healthChecks instead.",
-                    "items": {
-                        "$ref": "HealthCheck"
-                    },
-                    "type": "array"
-                },
-                "initialNumReplicas": {
-                    "description": "The initial number of replicas this pool should have. You must provide a value greater than or equal to 0.",
-                    "format": "int32",
-                    "type": "integer"
-                },
-                "labels": {
-                    "description": "A list of labels to attach to this replica pool and all created virtual machines in this replica pool.",
-                    "items": {
-                        "$ref": "Label"
-                    },
-                    "type": "array"
-                },
-                "name": {
-                    "description": "The name of the replica pool. Must follow the regex [a-z]([-a-z0-9]*[a-z0-9])? and be 1-28 characters long.",
-                    "type": "string"
-                },
-                "numReplicas": {
-                    "description": "Deprecated! Use initial_num_replicas instead.",
-                    "format": "int32",
-                    "type": "integer"
-                },
-                "resourceViews": {
-                    "description": "The list of resource views that should be updated with all the replicas that are managed by this pool.",
-                    "items": {
-                        "type": "string"
-                    },
-                    "type": "array"
-                },
-                "selfLink": {
-                    "description": "[Output Only] A self-link to the replica pool.",
-                    "type": "string"
-                },
-                "targetPool": {
-                    "description": "Deprecated, please use target_pools instead.",
-                    "type": "string"
-                },
-                "targetPools": {
-                    "description": "A list of target pools to update with the replicas that are managed by this pool. If specified, the replicas in this replica pool will be added to the specified target pools for load balancing purposes. The replica pool must live in the same region as the specified target pools. These values must be the target pool resource names, and not fully qualified URLs.",
-                    "items": {
-                        "type": "string"
-                    },
-                    "type": "array"
-                },
-                "template": {
-                    "$ref": "Template",
-                    "description": "The template to use when creating replicas in this pool. This template is used during initial instance creation of the pool, when growing the pool in size, or when a replica restarts."
-                },
-                "type": {
-                    "description": "Deprecated! Do not set.",
-                    "type": "string"
-                }
-            },
-            "type": "object"
-        },
-        "PoolsDeleteRequest": {
-            "id": "PoolsDeleteRequest",
-            "properties": {
-                "abandonInstances": {
-                    "description": "If there are instances you would like to keep, you can specify them here. These instances won't be deleted, but the associated replica objects will be removed.",
-                    "items": {
-                        "type": "string"
-                    },
-                    "type": "array"
-                }
-            },
-            "type": "object"
-        },
-        "PoolsListResponse": {
-            "id": "PoolsListResponse",
-            "properties": {
-                "nextPageToken": {
-                    "type": "string"
-                },
-                "resources": {
-                    "items": {
-                        "$ref": "Pool"
-                    },
-                    "type": "array"
-                }
-            },
-            "type": "object"
-        },
-        "Replica": {
-            "description": "An individual Replica within a Pool. Replicas are automatically created by the replica pool, using the template provided by the user. You cannot directly create replicas.",
-            "id": "Replica",
-            "properties": {
-                "name": {
-                    "description": "[Output Only] The name of the Replica object.",
-                    "type": "string"
-                },
-                "selfLink": {
-                    "description": "[Output Only] The self-link of the Replica.",
-                    "type": "string"
-                },
-                "status": {
-                    "$ref": "ReplicaStatus",
-                    "description": "[Output Only] Last known status of the Replica."
-                }
-            },
-            "type": "object"
-        },
-        "ReplicaStatus": {
-            "description": "The current status of a Replica.",
-            "id": "ReplicaStatus",
-            "properties": {
-                "details": {
-                    "description": "[Output Only] Human-readable details about the current state of the replica",
-                    "type": "string"
-                },
-                "state": {
-                    "description": "[Output Only] The state of the Replica.",
-                    "type": "string"
-                },
-                "templateVersion": {
-                    "description": "[Output Only] The template used to build the replica.",
-                    "type": "string"
-                },
-                "vmLink": {
-                    "description": "[Output Only] Link to the virtual machine that this Replica represents.",
-                    "type": "string"
-                },
-                "vmStartTime": {
-                    "description": "[Output Only] The time that this Replica got to the RUNNING state, in RFC 3339 format. If the start time is unknown, UNKNOWN is returned.",
-                    "type": "string"
-                }
-            },
-            "type": "object"
-        },
-        "ReplicasDeleteRequest": {
-            "id": "ReplicasDeleteRequest",
-            "properties": {
-                "abandonInstance": {
-                    "description": "Whether the instance resource represented by this replica should be deleted or abandoned. If abandoned, the replica will be deleted but the virtual machine instance will remain. By default, this is set to false and the instance will be deleted along with the replica.",
-                    "type": "boolean"
-                }
-            },
-            "type": "object"
-        },
-        "ReplicasListResponse": {
-            "id": "ReplicasListResponse",
-            "properties": {
-                "nextPageToken": {
-                    "type": "string"
-                },
-                "resources": {
-                    "items": {
-                        "$ref": "Replica"
-                    },
-                    "type": "array"
-                }
-            },
-            "type": "object"
-        },
-        "ServiceAccount": {
-            "description": "A Compute Engine service account, identical to the Compute Engine resource.",
-            "id": "ServiceAccount",
-            "properties": {
-                "email": {
-                    "description": "The service account email address, for example: 123845678986@project.gserviceaccount.com",
-                    "type": "string"
-                },
-                "scopes": {
-                    "description": "The list of OAuth2 scopes to obtain for the service account, for example: https://www.googleapis.com/auth/devstorage.full_control",
-                    "items": {
-                        "type": "string"
-                    },
-                    "type": "array"
-                }
-            },
-            "type": "object"
-        },
-        "Tag": {
-            "description": "A Compute Engine Instance tag, identical to the tags on the corresponding Compute Engine Instance resource.",
-            "id": "Tag",
-            "properties": {
-                "fingerPrint": {
-                    "description": "The fingerprint of the tag. Required for updating the list of tags.",
-                    "type": "string"
-                },
-                "items": {
-                    "description": "Items contained in this tag.",
-                    "items": {
-                        "type": "string"
-                    },
-                    "type": "array"
-                }
-            },
-            "type": "object"
-        },
-        "Template": {
-            "description": "The template used for creating replicas in the pool.",
-            "id": "Template",
-            "properties": {
-                "action": {
-                    "$ref": "Action",
-                    "description": "An action to run during initialization of your replicas. An action is run as shell commands which are executed one after the other in the same bash shell, so any state established by one command is inherited by later commands."
-                },
-                "healthChecks": {
-                    "description": "A list of HTTP Health Checks to configure for this replica pool and all virtual machines in this replica pool.",
-                    "items": {
-                        "$ref": "HealthCheck"
-                    },
-                    "type": "array"
-                },
-                "version": {
-                    "description": "A free-form string describing the version of this template. You can provide any versioning string you would like. For example, version1 or template-v1.",
-                    "type": "string"
-                },
-                "vmParams": {
-                    "$ref": "VmParams",
-                    "description": "The virtual machine parameters to use for creating replicas. You can define settings such as the machine type and the image of replicas in this pool. This is required if replica type is SMART_VM."
-                }
-            },
-            "type": "object"
-        },
-        "VmParams": {
-            "description": "Parameters for creating a Compute Engine Instance resource. Most fields are identical to the corresponding Compute Engine resource.",
-            "id": "VmParams",
-            "properties": {
-                "baseInstanceName": {
-                    "description": "Deprecated. Please use baseInstanceName instead.",
-                    "type": "string"
-                },
-                "canIpForward": {
-                    "description": "Enables IP Forwarding, which allows this instance to receive packets destined for a different IP address, and send packets with a different source IP. See IP Forwarding for more information.",
-                    "type": "boolean"
-                },
-                "description": {
-                    "description": "An optional textual description of the instance.",
-                    "type": "string"
-                },
-                "disksToAttach": {
-                    "description": "A list of existing Persistent Disk resources to attach to each replica in the pool. Each disk will be attached in read-only mode to every replica.",
-                    "items": {
-                        "$ref": "ExistingDisk"
-                    },
-                    "type": "array"
-                },
-                "disksToCreate": {
-                    "description": "A list of Disk resources to create and attach to each Replica in the Pool. Currently, you can only define one disk and it must be a root persistent disk. Note that Replica Pool will create a root persistent disk for each replica.",
-                    "items": {
-                        "$ref": "NewDisk"
-                    },
-                    "type": "array"
-                },
-                "machineType": {
-                    "description": "The machine type for this instance. The resource name (e.g. n1-standard-1).",
-                    "type": "string"
-                },
-                "metadata": {
-                    "$ref": "Metadata",
-                    "description": "The metadata key/value pairs assigned to this instance."
-                },
-                "networkInterfaces": {
-                    "description": "A list of network interfaces for the instance. Currently only one interface is supported by Google Compute Engine, ONE_TO_ONE_NAT.",
-                    "items": {
-                        "$ref": "NetworkInterface"
-                    },
-                    "type": "array"
-                },
-                "onHostMaintenance": {
-                    "type": "string"
-                },
-                "serviceAccounts": {
-                    "description": "A list of Service Accounts to enable for this instance.",
-                    "items": {
-                        "$ref": "ServiceAccount"
-                    },
-                    "type": "array"
-                },
-                "tags": {
-                    "$ref": "Tag",
-                    "description": "A list of tags to apply to the Google Compute Engine instance to identify resources."
-                }
-            },
-            "type": "object"
-        }
-    },
-    "servicePath": "replicapool/v1beta1/projects/",
-    "title": "Replica Pool API",
-    "version": "v1beta1"
-}
\ No newline at end of file
diff --git a/discovery/googleapis_beta/replicapool__v1beta2.json b/discovery/googleapis_beta/replicapool__v1beta2.json
new file mode 100644
index 0000000..4ea6921
--- /dev/null
+++ b/discovery/googleapis_beta/replicapool__v1beta2.json
@@ -0,0 +1,1028 @@
+{
+    "auth": {
+        "oauth2": {
+            "scopes": {
+                "https://www.googleapis.com/auth/cloud-platform": {
+                    "description": "View and manage your data across Google Cloud Platform services"
+                },
+                "https://www.googleapis.com/auth/compute": {
+                    "description": "View and manage your Google Compute Engine resources"
+                },
+                "https://www.googleapis.com/auth/compute.readonly": {
+                    "description": "View your Google Compute Engine resources"
+                }
+            }
+        }
+    },
+    "basePath": "/replicapool/v1beta2/projects/",
+    "baseUrl": "https://www.googleapis.com/replicapool/v1beta2/projects/",
+    "batchPath": "batch",
+    "description": "The Google Compute Engine Instance Group Manager API provides groups of homogenous Compute Engine Instances.",
+    "discoveryVersion": "v1",
+    "documentationLink": "https://developers.google.com/compute/docs/instance-groups/manager/v1beta2",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/o8KVD2TZK8SqQA452IHtm6GW-J8\"",
+    "icons": {
+        "x16": "http://www.google.com/images/icons/product/search-16.gif",
+        "x32": "http://www.google.com/images/icons/product/search-32.gif"
+    },
+    "id": "replicapool:v1beta2",
+    "kind": "discovery#restDescription",
+    "labels": [
+        "limited_availability"
+    ],
+    "name": "replicapool",
+    "ownerDomain": "google.com",
+    "ownerName": "Google",
+    "parameters": {
+        "alt": {
+            "default": "json",
+            "description": "Data format for the response.",
+            "enum": [
+                "json"
+            ],
+            "enumDescriptions": [
+                "Responses with Content-Type of application/json"
+            ],
+            "location": "query",
+            "type": "string"
+        },
+        "fields": {
+            "description": "Selector specifying which fields to include in a partial response.",
+            "location": "query",
+            "type": "string"
+        },
+        "key": {
+            "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+            "location": "query",
+            "type": "string"
+        },
+        "oauth_token": {
+            "description": "OAuth 2.0 token for the current user.",
+            "location": "query",
+            "type": "string"
+        },
+        "prettyPrint": {
+            "default": "true",
+            "description": "Returns response with indentations and line breaks.",
+            "location": "query",
+            "type": "boolean"
+        },
+        "quotaUser": {
+            "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.",
+            "location": "query",
+            "type": "string"
+        },
+        "userIp": {
+            "description": "IP address of the site where the request originates. Use this if you want to enforce per-user limits.",
+            "location": "query",
+            "type": "string"
+        }
+    },
+    "protocol": "rest",
+    "resources": {
+        "instanceGroupManagers": {
+            "methods": {
+                "abandonInstances": {
+                    "description": "Removes the specified instances from the managed instance group, and from any target pools of which they were members, without deleting the instances.",
+                    "httpMethod": "POST",
+                    "id": "replicapool.instanceGroupManagers.abandonInstances",
+                    "parameterOrder": [
+                        "project",
+                        "zone",
+                        "instanceGroupManager"
+                    ],
+                    "parameters": {
+                        "instanceGroupManager": {
+                            "description": "The name of the instance group manager.",
+                            "location": "path",
+                            "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "project": {
+                            "description": "The Google Developers Console project name.",
+                            "location": "path",
+                            "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "zone": {
+                            "description": "The name of the zone in which the instance group manager resides.",
+                            "location": "path",
+                            "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/abandonInstances",
+                    "request": {
+                        "$ref": "InstanceGroupManagersAbandonInstancesRequest"
+                    },
+                    "response": {
+                        "$ref": "Operation"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
+                        "https://www.googleapis.com/auth/compute"
+                    ]
+                },
+                "delete": {
+                    "description": "Deletes the instance group manager and all instances contained within. If you'd like to delete the manager without deleting the instances, you must first abandon the instances to remove them from the group.",
+                    "httpMethod": "DELETE",
+                    "id": "replicapool.instanceGroupManagers.delete",
+                    "parameterOrder": [
+                        "project",
+                        "zone",
+                        "instanceGroupManager"
+                    ],
+                    "parameters": {
+                        "instanceGroupManager": {
+                            "description": "Name of the Instance Group Manager resource to delete.",
+                            "location": "path",
+                            "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "project": {
+                            "description": "The Google Developers Console project name.",
+                            "location": "path",
+                            "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "zone": {
+                            "description": "The name of the zone in which the instance group manager resides.",
+                            "location": "path",
+                            "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}",
+                    "response": {
+                        "$ref": "Operation"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
+                        "https://www.googleapis.com/auth/compute"
+                    ]
+                },
+                "deleteInstances": {
+                    "description": "Deletes the specified instances. The instances are removed from the instance group and any target pools of which they are a member, then deleted. The targetSize of the instance group manager is reduced by the number of instances deleted.",
+                    "httpMethod": "POST",
+                    "id": "replicapool.instanceGroupManagers.deleteInstances",
+                    "parameterOrder": [
+                        "project",
+                        "zone",
+                        "instanceGroupManager"
+                    ],
+                    "parameters": {
+                        "instanceGroupManager": {
+                            "description": "The name of the instance group manager.",
+                            "location": "path",
+                            "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "project": {
+                            "description": "The Google Developers Console project name.",
+                            "location": "path",
+                            "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "zone": {
+                            "description": "The name of the zone in which the instance group manager resides.",
+                            "location": "path",
+                            "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/deleteInstances",
+                    "request": {
+                        "$ref": "InstanceGroupManagersDeleteInstancesRequest"
+                    },
+                    "response": {
+                        "$ref": "Operation"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
+                        "https://www.googleapis.com/auth/compute"
+                    ]
+                },
+                "get": {
+                    "description": "Returns the specified Instance Group Manager resource.",
+                    "httpMethod": "GET",
+                    "id": "replicapool.instanceGroupManagers.get",
+                    "parameterOrder": [
+                        "project",
+                        "zone",
+                        "instanceGroupManager"
+                    ],
+                    "parameters": {
+                        "instanceGroupManager": {
+                            "description": "Name of the instance resource to return.",
+                            "location": "path",
+                            "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "project": {
+                            "description": "The Google Developers Console project name.",
+                            "location": "path",
+                            "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "zone": {
+                            "description": "The name of the zone in which the instance group manager resides.",
+                            "location": "path",
+                            "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}",
+                    "response": {
+                        "$ref": "InstanceGroupManager"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
+                        "https://www.googleapis.com/auth/compute",
+                        "https://www.googleapis.com/auth/compute.readonly"
+                    ]
+                },
+                "insert": {
+                    "description": "Creates an instance group manager, as well as the instance group and the specified number of instances.",
+                    "httpMethod": "POST",
+                    "id": "replicapool.instanceGroupManagers.insert",
+                    "parameterOrder": [
+                        "project",
+                        "zone",
+                        "size"
+                    ],
+                    "parameters": {
+                        "project": {
+                            "description": "The Google Developers Console project name.",
+                            "location": "path",
+                            "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "size": {
+                            "description": "Number of instances that should exist.",
+                            "format": "int32",
+                            "location": "query",
+                            "minimum": "0",
+                            "required": true,
+                            "type": "integer"
+                        },
+                        "zone": {
+                            "description": "The name of the zone in which the instance group manager resides.",
+                            "location": "path",
+                            "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "{project}/zones/{zone}/instanceGroupManagers",
+                    "request": {
+                        "$ref": "InstanceGroupManager"
+                    },
+                    "response": {
+                        "$ref": "Operation"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
+                        "https://www.googleapis.com/auth/compute"
+                    ]
+                },
+                "list": {
+                    "description": "Retrieves the list of Instance Group Manager resources contained within the specified zone.",
+                    "httpMethod": "GET",
+                    "id": "replicapool.instanceGroupManagers.list",
+                    "parameterOrder": [
+                        "project",
+                        "zone"
+                    ],
+                    "parameters": {
+                        "filter": {
+                            "description": "Optional. Filter expression for filtering listed resources.",
+                            "location": "query",
+                            "type": "string"
+                        },
+                        "maxResults": {
+                            "default": "500",
+                            "description": "Optional. Maximum count of results to be returned. Maximum value is 500 and default value is 500.",
+                            "format": "uint32",
+                            "location": "query",
+                            "maximum": "500",
+                            "minimum": "0",
+                            "type": "integer"
+                        },
+                        "pageToken": {
+                            "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+                            "location": "query",
+                            "type": "string"
+                        },
+                        "project": {
+                            "description": "The Google Developers Console project name.",
+                            "location": "path",
+                            "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "zone": {
+                            "description": "The name of the zone in which the instance group manager resides.",
+                            "location": "path",
+                            "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "{project}/zones/{zone}/instanceGroupManagers",
+                    "response": {
+                        "$ref": "InstanceGroupManagerList"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
+                        "https://www.googleapis.com/auth/compute",
+                        "https://www.googleapis.com/auth/compute.readonly"
+                    ]
+                },
+                "recreateInstances": {
+                    "description": "Recreates the specified instances. The instances are deleted, then recreated using the instance group manager's current instance template.",
+                    "httpMethod": "POST",
+                    "id": "replicapool.instanceGroupManagers.recreateInstances",
+                    "parameterOrder": [
+                        "project",
+                        "zone",
+                        "instanceGroupManager"
+                    ],
+                    "parameters": {
+                        "instanceGroupManager": {
+                            "description": "The name of the instance group manager.",
+                            "location": "path",
+                            "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "project": {
+                            "description": "The Google Developers Console project name.",
+                            "location": "path",
+                            "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "zone": {
+                            "description": "The name of the zone in which the instance group manager resides.",
+                            "location": "path",
+                            "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/recreateInstances",
+                    "request": {
+                        "$ref": "InstanceGroupManagersRecreateInstancesRequest"
+                    },
+                    "response": {
+                        "$ref": "Operation"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
+                        "https://www.googleapis.com/auth/compute"
+                    ]
+                },
+                "resize": {
+                    "description": "Resizes the managed instance group up or down. If resized up, new instances are created using the current instance template. If resized down, instances are removed in the order outlined in Resizing a managed instance group.",
+                    "httpMethod": "POST",
+                    "id": "replicapool.instanceGroupManagers.resize",
+                    "parameterOrder": [
+                        "project",
+                        "zone",
+                        "instanceGroupManager",
+                        "size"
+                    ],
+                    "parameters": {
+                        "instanceGroupManager": {
+                            "description": "The name of the instance group manager.",
+                            "location": "path",
+                            "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "project": {
+                            "description": "The Google Developers Console project name.",
+                            "location": "path",
+                            "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "size": {
+                            "description": "Number of instances that should exist in this Instance Group Manager.",
+                            "format": "int32",
+                            "location": "query",
+                            "minimum": "0",
+                            "required": true,
+                            "type": "integer"
+                        },
+                        "zone": {
+                            "description": "The name of the zone in which the instance group manager resides.",
+                            "location": "path",
+                            "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resize",
+                    "response": {
+                        "$ref": "Operation"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
+                        "https://www.googleapis.com/auth/compute"
+                    ]
+                },
+                "setInstanceTemplate": {
+                    "description": "Sets the instance template to use when creating new instances in this group. Existing instances are not affected.",
+                    "httpMethod": "POST",
+                    "id": "replicapool.instanceGroupManagers.setInstanceTemplate",
+                    "parameterOrder": [
+                        "project",
+                        "zone",
+                        "instanceGroupManager"
+                    ],
+                    "parameters": {
+                        "instanceGroupManager": {
+                            "description": "The name of the instance group manager.",
+                            "location": "path",
+                            "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "project": {
+                            "description": "The Google Developers Console project name.",
+                            "location": "path",
+                            "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "zone": {
+                            "description": "The name of the zone in which the instance group manager resides.",
+                            "location": "path",
+                            "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setInstanceTemplate",
+                    "request": {
+                        "$ref": "InstanceGroupManagersSetInstanceTemplateRequest"
+                    },
+                    "response": {
+                        "$ref": "Operation"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
+                        "https://www.googleapis.com/auth/compute"
+                    ]
+                },
+                "setTargetPools": {
+                    "description": "Modifies the target pools to which all new instances in this group are assigned. Existing instances in the group are not affected.",
+                    "httpMethod": "POST",
+                    "id": "replicapool.instanceGroupManagers.setTargetPools",
+                    "parameterOrder": [
+                        "project",
+                        "zone",
+                        "instanceGroupManager"
+                    ],
+                    "parameters": {
+                        "instanceGroupManager": {
+                            "description": "The name of the instance group manager.",
+                            "location": "path",
+                            "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "project": {
+                            "description": "The Google Developers Console project name.",
+                            "location": "path",
+                            "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "zone": {
+                            "description": "The name of the zone in which the instance group manager resides.",
+                            "location": "path",
+                            "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setTargetPools",
+                    "request": {
+                        "$ref": "InstanceGroupManagersSetTargetPoolsRequest"
+                    },
+                    "response": {
+                        "$ref": "Operation"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
+                        "https://www.googleapis.com/auth/compute"
+                    ]
+                }
+            }
+        },
+        "zoneOperations": {
+            "methods": {
+                "get": {
+                    "description": "Retrieves the specified zone-specific operation resource.",
+                    "httpMethod": "GET",
+                    "id": "replicapool.zoneOperations.get",
+                    "parameterOrder": [
+                        "project",
+                        "zone",
+                        "operation"
+                    ],
+                    "parameters": {
+                        "operation": {
+                            "description": "Name of the operation resource to return.",
+                            "location": "path",
+                            "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "project": {
+                            "description": "Name of the project scoping this request.",
+                            "location": "path",
+                            "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "zone": {
+                            "description": "Name of the zone scoping this request.",
+                            "location": "path",
+                            "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "{project}/zones/{zone}/operations/{operation}",
+                    "response": {
+                        "$ref": "Operation"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
+                        "https://www.googleapis.com/auth/compute"
+                    ]
+                },
+                "list": {
+                    "description": "Retrieves the list of operation resources contained within the specified zone.",
+                    "httpMethod": "GET",
+                    "id": "replicapool.zoneOperations.list",
+                    "parameterOrder": [
+                        "project",
+                        "zone"
+                    ],
+                    "parameters": {
+                        "filter": {
+                            "description": "Optional. Filter expression for filtering listed resources.",
+                            "location": "query",
+                            "type": "string"
+                        },
+                        "maxResults": {
+                            "default": "500",
+                            "description": "Optional. Maximum count of results to be returned. Maximum value is 500 and default value is 500.",
+                            "format": "uint32",
+                            "location": "query",
+                            "maximum": "500",
+                            "minimum": "0",
+                            "type": "integer"
+                        },
+                        "pageToken": {
+                            "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+                            "location": "query",
+                            "type": "string"
+                        },
+                        "project": {
+                            "description": "Name of the project scoping this request.",
+                            "location": "path",
+                            "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "zone": {
+                            "description": "Name of the zone scoping this request.",
+                            "location": "path",
+                            "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "{project}/zones/{zone}/operations",
+                    "response": {
+                        "$ref": "OperationList"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
+                        "https://www.googleapis.com/auth/compute"
+                    ]
+                }
+            }
+        }
+    },
+    "revision": "20141002",
+    "rootUrl": "https://www.googleapis.com/",
+    "schemas": {
+        "InstanceGroupManager": {
+            "description": "An Instance Group Manager resource.",
+            "id": "InstanceGroupManager",
+            "properties": {
+                "baseInstanceName": {
+                    "description": "The base instance name to use for instances in this group. The value must be a valid RFC1035 name. Supported characters are lowercase letters, numbers, and hyphens (-). Instances are named by appending a hyphen and a random four-character string to the base instance name.",
+                    "type": "string"
+                },
+                "creationTimestamp": {
+                    "description": "[Output only] The time the instance group manager was created, in RFC3339 text format.",
+                    "type": "string"
+                },
+                "currentSize": {
+                    "description": "[Output only] The number of instances that currently exist and are a part of this group. This includes instances that are starting but are not yet RUNNING, and instances that are in the process of being deleted or abandoned.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "description": {
+                    "description": "An optional textual description of the instance group manager.",
+                    "type": "string"
+                },
+                "fingerprint": {
+                    "description": "[Output only] Fingerprint of the instance group manager. This field is used for optimistic locking. An up-to-date fingerprint must be provided in order to modify the Instance Group Manager resource.",
+                    "format": "byte",
+                    "type": "string"
+                },
+                "group": {
+                    "description": "[Output only] The full URL of the instance group created by the manager. This group contains all of the instances being managed, and cannot contain non-managed instances.",
+                    "type": "string"
+                },
+                "id": {
+                    "description": "[Output only] A server-assigned unique identifier for the resource.",
+                    "format": "uint64",
+                    "type": "string"
+                },
+                "instanceTemplate": {
+                    "description": "The full URL to an instance template from which all new instances will be created.",
+                    "type": "string"
+                },
+                "kind": {
+                    "default": "replicapool#instanceGroupManager",
+                    "description": "[Output only] The resource type. Always replicapool#instanceGroupManager.",
+                    "type": "string"
+                },
+                "name": {
+                    "description": "The name of the instance group manager. Must be 1-63 characters long and comply with RFC1035. Supported characters include lowercase letters, numbers, and hyphens.",
+                    "type": "string"
+                },
+                "selfLink": {
+                    "description": "[Output only] The fully qualified URL for this resource.",
+                    "type": "string"
+                },
+                "targetPools": {
+                    "description": "The full URL of all target pools to which new instances in the group are added. Updating the target pool values does not affect existing instances.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "targetSize": {
+                    "description": "[Output only] The number of instances that the manager is attempting to maintain. Deleting or abandoning instances affects this number, as does resizing the group.",
+                    "format": "int32",
+                    "type": "integer"
+                }
+            },
+            "type": "object"
+        },
+        "InstanceGroupManagerList": {
+            "id": "InstanceGroupManagerList",
+            "properties": {
+                "id": {
+                    "description": "Unique identifier for the resource; defined by the server (output only).",
+                    "type": "string"
+                },
+                "items": {
+                    "description": "A list of instance resources.",
+                    "items": {
+                        "$ref": "InstanceGroupManager"
+                    },
+                    "type": "array"
+                },
+                "kind": {
+                    "default": "replicapool#instanceGroupManagerList",
+                    "description": "Type of resource.",
+                    "type": "string"
+                },
+                "nextPageToken": {
+                    "description": "A token used to continue a truncated list request (output only).",
+                    "type": "string"
+                },
+                "selfLink": {
+                    "description": "Server defined URL for this resource (output only).",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "InstanceGroupManagersAbandonInstancesRequest": {
+            "id": "InstanceGroupManagersAbandonInstancesRequest",
+            "properties": {
+                "instances": {
+                    "description": "The names of one or more instances to abandon. For example:\n{ 'instances': [ 'instance-c3po', 'instance-r2d2' ] }",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "InstanceGroupManagersDeleteInstancesRequest": {
+            "id": "InstanceGroupManagersDeleteInstancesRequest",
+            "properties": {
+                "instances": {
+                    "description": "Names of instances to delete.\n\nExample: 'instance-foo', 'instance-bar'",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "InstanceGroupManagersRecreateInstancesRequest": {
+            "id": "InstanceGroupManagersRecreateInstancesRequest",
+            "properties": {
+                "instances": {
+                    "description": "The names of one or more instances to recreate. For example:\n{ 'instances': [ 'instance-c3po', 'instance-r2d2' ] }",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "InstanceGroupManagersSetInstanceTemplateRequest": {
+            "id": "InstanceGroupManagersSetInstanceTemplateRequest",
+            "properties": {
+                "instanceTemplate": {
+                    "description": "The full URL to an Instance Template from which all new instances will be created.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "InstanceGroupManagersSetTargetPoolsRequest": {
+            "id": "InstanceGroupManagersSetTargetPoolsRequest",
+            "properties": {
+                "fingerprint": {
+                    "description": "The current fingerprint of the Instance Group Manager resource. If this does not match the server-side fingerprint of the resource, then the request will be rejected.",
+                    "format": "byte",
+                    "type": "string"
+                },
+                "targetPools": {
+                    "description": "A list of fully-qualified URLs to existing Target Pool resources. New instances in the Instance Group Manager will be added to the specified target pools; existing instances are not affected.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "Operation": {
+            "description": "An operation resource, used to manage asynchronous API requests.",
+            "id": "Operation",
+            "properties": {
+                "clientOperationId": {
+                    "description": "[Output only] An optional identifier specified by the client when the mutation was initiated. Must be unique for all operation resources in the project.",
+                    "type": "string"
+                },
+                "creationTimestamp": {
+                    "description": "[Output Only] The time that this operation was requested, in RFC3339 text format.",
+                    "type": "string"
+                },
+                "endTime": {
+                    "description": "[Output Only] The time that this operation was completed, in RFC3339 text format.",
+                    "type": "string"
+                },
+                "error": {
+                    "description": "[Output Only] If errors occurred during processing of this operation, this field will be populated.",
+                    "properties": {
+                        "errors": {
+                            "description": "[Output Only] The array of errors encountered while processing this operation.",
+                            "items": {
+                                "properties": {
+                                    "code": {
+                                        "description": "[Output Only] The error type identifier for this error.",
+                                        "type": "string"
+                                    },
+                                    "location": {
+                                        "description": "[Output Only] Indicates the field in the request which caused the error. This property is optional.",
+                                        "type": "string"
+                                    },
+                                    "message": {
+                                        "description": "[Output Only] An optional, human-readable error message.",
+                                        "type": "string"
+                                    }
+                                },
+                                "type": "object"
+                            },
+                            "type": "array"
+                        }
+                    },
+                    "type": "object"
+                },
+                "httpErrorMessage": {
+                    "description": "[Output only] If operation fails, the HTTP error message returned.",
+                    "type": "string"
+                },
+                "httpErrorStatusCode": {
+                    "description": "[Output only] If operation fails, the HTTP error status code returned.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "id": {
+                    "description": "[Output Only] Unique identifier for the resource, generated by the server.",
+                    "format": "uint64",
+                    "type": "string"
+                },
+                "insertTime": {
+                    "description": "[Output Only] The time that this operation was requested, in RFC3339 text format.",
+                    "type": "string"
+                },
+                "kind": {
+                    "default": "replicapool#operation",
+                    "description": "[Output only] Type of the resource.",
+                    "type": "string"
+                },
+                "name": {
+                    "description": "[Output Only] Name of the resource.",
+                    "type": "string"
+                },
+                "operationType": {
+                    "description": "[Output only] Type of the operation. Operations include insert, update, and delete.",
+                    "type": "string"
+                },
+                "progress": {
+                    "description": "[Output only] An optional progress indicator that ranges from 0 to 100. There is no requirement that this be linear or support any granularity of operations. This should not be used to guess at when the operation will be complete. This number should be monotonically increasing as the operation progresses.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "region": {
+                    "description": "[Output Only] URL of the region where the operation resides. Only available when performing regional operations.",
+                    "type": "string"
+                },
+                "selfLink": {
+                    "description": "[Output Only] Server-defined fully-qualified URL for this resource.",
+                    "type": "string"
+                },
+                "startTime": {
+                    "description": "[Output Only] The time that this operation was started by the server, in RFC3339 text format.",
+                    "type": "string"
+                },
+                "status": {
+                    "description": "[Output Only] Status of the operation.",
+                    "enum": [
+                        "DONE",
+                        "PENDING",
+                        "RUNNING"
+                    ],
+                    "enumDescriptions": [
+                        "",
+                        "",
+                        ""
+                    ],
+                    "type": "string"
+                },
+                "statusMessage": {
+                    "description": "[Output Only] An optional textual description of the current status of the operation.",
+                    "type": "string"
+                },
+                "targetId": {
+                    "description": "[Output Only] Unique target ID which identifies a particular incarnation of the target.",
+                    "format": "uint64",
+                    "type": "string"
+                },
+                "targetLink": {
+                    "description": "[Output only] URL of the resource the operation is mutating.",
+                    "type": "string"
+                },
+                "user": {
+                    "description": "[Output Only] User who requested the operation, for example: user@example.com.",
+                    "type": "string"
+                },
+                "warnings": {
+                    "description": "[Output Only] If there are issues with this operation, a warning is returned.",
+                    "items": {
+                        "properties": {
+                            "code": {
+                                "description": "[Output only] The warning type identifier for this warning.",
+                                "enum": [
+                                    "DEPRECATED_RESOURCE_USED",
+                                    "DISK_SIZE_LARGER_THAN_IMAGE_SIZE",
+                                    "INJECTED_KERNELS_DEPRECATED",
+                                    "NEXT_HOP_ADDRESS_NOT_ASSIGNED",
+                                    "NEXT_HOP_CANNOT_IP_FORWARD",
+                                    "NEXT_HOP_INSTANCE_NOT_FOUND",
+                                    "NEXT_HOP_INSTANCE_NOT_ON_NETWORK",
+                                    "NEXT_HOP_NOT_RUNNING",
+                                    "NO_RESULTS_ON_PAGE",
+                                    "REQUIRED_TOS_AGREEMENT",
+                                    "RESOURCE_NOT_DELETED",
+                                    "UNREACHABLE"
+                                ],
+                                "enumDescriptions": [
+                                    "",
+                                    "",
+                                    "",
+                                    "",
+                                    "",
+                                    "",
+                                    "",
+                                    "",
+                                    "",
+                                    "",
+                                    "",
+                                    ""
+                                ],
+                                "type": "string"
+                            },
+                            "data": {
+                                "description": "[Output only] Metadata for this warning in key:value format.",
+                                "items": {
+                                    "properties": {
+                                        "key": {
+                                            "description": "[Output Only] Metadata key for this warning.",
+                                            "type": "string"
+                                        },
+                                        "value": {
+                                            "description": "[Output Only] Metadata value for this warning.",
+                                            "type": "string"
+                                        }
+                                    },
+                                    "type": "object"
+                                },
+                                "type": "array"
+                            },
+                            "message": {
+                                "description": "[Output only] Optional human-readable details for this warning.",
+                                "type": "string"
+                            }
+                        },
+                        "type": "object"
+                    },
+                    "type": "array"
+                },
+                "zone": {
+                    "description": "[Output Only] URL of the zone where the operation resides. Only available when performing per-zone operations.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "OperationList": {
+            "id": "OperationList",
+            "properties": {
+                "id": {
+                    "description": "Unique identifier for the resource; defined by the server (output only).",
+                    "type": "string"
+                },
+                "items": {
+                    "description": "The operation resources.",
+                    "items": {
+                        "$ref": "Operation"
+                    },
+                    "type": "array"
+                },
+                "kind": {
+                    "default": "replicapool#operationList",
+                    "description": "Type of resource.",
+                    "type": "string"
+                },
+                "nextPageToken": {
+                    "description": "A token used to continue a truncated list request (output only).",
+                    "type": "string"
+                },
+                "selfLink": {
+                    "description": "Server defined URL for this resource (output only).",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        }
+    },
+    "servicePath": "replicapool/v1beta2/projects/",
+    "title": "Google Compute Engine Instance Group Manager API",
+    "version": "v1beta2"
+}
\ No newline at end of file
diff --git a/discovery/googleapis_beta/replicapoolupdater__v1beta1.json b/discovery/googleapis_beta/replicapoolupdater__v1beta1.json
new file mode 100644
index 0000000..90ddad8
--- /dev/null
+++ b/discovery/googleapis_beta/replicapoolupdater__v1beta1.json
@@ -0,0 +1,527 @@
+{
+    "auth": {
+        "oauth2": {
+            "scopes": {
+                "https://www.googleapis.com/auth/cloud-platform": {
+                    "description": "View and manage your data across Google Cloud Platform services"
+                },
+                "https://www.googleapis.com/auth/replicapool": {
+                    "description": "View and manage replica pools"
+                },
+                "https://www.googleapis.com/auth/replicapool.readonly": {
+                    "description": "View replica pools"
+                }
+            }
+        }
+    },
+    "basePath": "/replicapoolupdater/v1beta1/projects/",
+    "baseUrl": "https://www.googleapis.com/replicapoolupdater/v1beta1/projects/",
+    "batchPath": "batch",
+    "description": "The Google Compute Engine Instance Group Updater API provides services for updating groups of Compute Engine Instances.",
+    "discoveryVersion": "v1",
+    "documentationLink": "",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/7FRX0hPrcBX5nF_FMe00xO_Wdmw\"",
+    "icons": {
+        "x16": "http://www.google.com/images/icons/product/search-16.gif",
+        "x32": "http://www.google.com/images/icons/product/search-32.gif"
+    },
+    "id": "replicapoolupdater:v1beta1",
+    "kind": "discovery#restDescription",
+    "labels": [
+        "limited_availability"
+    ],
+    "name": "replicapoolupdater",
+    "ownerDomain": "google.com",
+    "ownerName": "Google",
+    "parameters": {
+        "alt": {
+            "default": "json",
+            "description": "Data format for the response.",
+            "enum": [
+                "json"
+            ],
+            "enumDescriptions": [
+                "Responses with Content-Type of application/json"
+            ],
+            "location": "query",
+            "type": "string"
+        },
+        "fields": {
+            "description": "Selector specifying which fields to include in a partial response.",
+            "location": "query",
+            "type": "string"
+        },
+        "key": {
+            "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+            "location": "query",
+            "type": "string"
+        },
+        "oauth_token": {
+            "description": "OAuth 2.0 token for the current user.",
+            "location": "query",
+            "type": "string"
+        },
+        "prettyPrint": {
+            "default": "true",
+            "description": "Returns response with indentations and line breaks.",
+            "location": "query",
+            "type": "boolean"
+        },
+        "quotaUser": {
+            "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.",
+            "location": "query",
+            "type": "string"
+        },
+        "userIp": {
+            "description": "IP address of the site where the request originates. Use this if you want to enforce per-user limits.",
+            "location": "query",
+            "type": "string"
+        }
+    },
+    "protocol": "rest",
+    "resources": {
+        "updates": {
+            "methods": {
+                "cancel": {
+                    "description": "Called on the particular Update endpoint. Cancels the update in state PAUSED. No-op if invoked in state CANCELLED.",
+                    "httpMethod": "POST",
+                    "id": "replicapoolupdater.updates.cancel",
+                    "parameterOrder": [
+                        "project",
+                        "zone",
+                        "instanceGroupManager",
+                        "update"
+                    ],
+                    "parameters": {
+                        "instanceGroupManager": {
+                            "description": "Name of the instance group manager for this request.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "project": {
+                            "description": "Project ID for this request.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "update": {
+                            "description": "Unique (in the context of a group) handle of an update.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "zone": {
+                            "description": "Zone for the instance group manager.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/updates/{update}/cancel",
+                    "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
+                        "https://www.googleapis.com/auth/replicapool"
+                    ]
+                },
+                "get": {
+                    "description": "Called on the particular Update endpoint. Returns the Update resource.",
+                    "httpMethod": "GET",
+                    "id": "replicapoolupdater.updates.get",
+                    "parameterOrder": [
+                        "project",
+                        "zone",
+                        "instanceGroupManager",
+                        "update"
+                    ],
+                    "parameters": {
+                        "instanceGroupManager": {
+                            "description": "Name of the instance group manager for this request.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "project": {
+                            "description": "Project ID for this request.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "update": {
+                            "description": "Unique (in the context of a group) handle of an update.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "zone": {
+                            "description": "Zone for the instance group manager.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/updates/{update}",
+                    "response": {
+                        "$ref": "Update"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
+                        "https://www.googleapis.com/auth/replicapool",
+                        "https://www.googleapis.com/auth/replicapool.readonly"
+                    ]
+                },
+                "insert": {
+                    "description": "Called on the collection endpoint. Inserts the new Update resource and starts the update.",
+                    "httpMethod": "POST",
+                    "id": "replicapoolupdater.updates.insert",
+                    "parameterOrder": [
+                        "project",
+                        "zone",
+                        "instanceGroupManager"
+                    ],
+                    "parameters": {
+                        "instanceGroupManager": {
+                            "description": "Name of the instance group manager for this request.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "project": {
+                            "description": "Project ID for this request.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "zone": {
+                            "description": "Zone for the instance group manager.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/updates",
+                    "request": {
+                        "$ref": "Update"
+                    },
+                    "response": {
+                        "$ref": "InsertResponse"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
+                        "https://www.googleapis.com/auth/replicapool"
+                    ]
+                },
+                "list": {
+                    "description": "Called on the collection endpoint. Lists updates for a given instance group, in reverse chronological order. Pagination is supported, see ListRequestHeader.",
+                    "httpMethod": "GET",
+                    "id": "replicapoolupdater.updates.list",
+                    "parameterOrder": [
+                        "project",
+                        "zone",
+                        "instanceGroupManager"
+                    ],
+                    "parameters": {
+                        "instanceGroupManager": {
+                            "description": "Name of the instance group manager for this request.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "maxResults": {
+                            "default": "50",
+                            "description": "Maximum count of results to be returned. Acceptable values are 1 to 100, inclusive. (Default: 50)",
+                            "format": "int32",
+                            "location": "query",
+                            "maximum": "100",
+                            "minimum": "1",
+                            "type": "integer"
+                        },
+                        "pageToken": {
+                            "description": "Set this to the nextPageToken value returned by a previous list request to obtain the next page of results from the previous list request.",
+                            "location": "query",
+                            "type": "string"
+                        },
+                        "project": {
+                            "description": "Project ID for this request.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "zone": {
+                            "description": "Zone for the instance group manager.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/updates",
+                    "response": {
+                        "$ref": "UpdateList"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
+                        "https://www.googleapis.com/auth/replicapool",
+                        "https://www.googleapis.com/auth/replicapool.readonly"
+                    ]
+                },
+                "pause": {
+                    "description": "Called on the particular Update endpoint. Pauses the update in state from { ROLLING_FORWARD, ROLLING_BACK, PAUSED }. No-op if invoked in state PAUSED.",
+                    "httpMethod": "POST",
+                    "id": "replicapoolupdater.updates.pause",
+                    "parameterOrder": [
+                        "project",
+                        "zone",
+                        "instanceGroupManager",
+                        "update"
+                    ],
+                    "parameters": {
+                        "instanceGroupManager": {
+                            "description": "Name of the instance group manager for this request.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "project": {
+                            "description": "Project ID for this request.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "update": {
+                            "description": "Unique (in the context of a group) handle of an update.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "zone": {
+                            "description": "Zone for the instance group manager.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/updates/{update}/pause",
+                    "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
+                        "https://www.googleapis.com/auth/replicapool"
+                    ]
+                },
+                "rollback": {
+                    "description": "Called on the particular Update endpoint. Rolls back the update in state from { ROLLING_FORWARD, ROLLING_BACK, PAUSED }. No-op if invoked in state ROLLED_BACK.",
+                    "httpMethod": "POST",
+                    "id": "replicapoolupdater.updates.rollback",
+                    "parameterOrder": [
+                        "project",
+                        "zone",
+                        "instanceGroupManager",
+                        "update"
+                    ],
+                    "parameters": {
+                        "instanceGroupManager": {
+                            "description": "Name of the instance group manager for this request.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "project": {
+                            "description": "Project ID for this request.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "update": {
+                            "description": "Unique (in the context of a group) handle of an update.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "zone": {
+                            "description": "Zone for the instance group manager.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/updates/{update}/rollback",
+                    "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
+                        "https://www.googleapis.com/auth/replicapool"
+                    ]
+                },
+                "rollforward": {
+                    "description": "Called on the particular Update endpoint. Rolls forward the update in state from { ROLLING_FORWARD, ROLLING_BACK, PAUSED }. No-op if invoked in state ROLLED_OUT.",
+                    "httpMethod": "POST",
+                    "id": "replicapoolupdater.updates.rollforward",
+                    "parameterOrder": [
+                        "project",
+                        "zone",
+                        "instanceGroupManager",
+                        "update"
+                    ],
+                    "parameters": {
+                        "instanceGroupManager": {
+                            "description": "Name of the instance group manager for this request.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "project": {
+                            "description": "Project ID for this request.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "update": {
+                            "description": "Unique (in the context of a group) handle of an update.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "zone": {
+                            "description": "Zone for the instance group manager.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/updates/{update}/rollforward",
+                    "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
+                        "https://www.googleapis.com/auth/replicapool"
+                    ]
+                }
+            }
+        }
+    },
+    "revision": "20141016",
+    "rootUrl": "https://www.googleapis.com/",
+    "schemas": {
+        "InsertResponse": {
+            "description": "Response returned by Insert method.",
+            "id": "InsertResponse",
+            "properties": {
+                "update": {
+                    "description": "Unique (in the context of a group) handle of an update.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "InstanceUpdate": {
+            "description": "Update of a single instance.",
+            "id": "InstanceUpdate",
+            "properties": {
+                "instanceName": {
+                    "description": "Name of an instance.",
+                    "type": "string"
+                },
+                "state": {
+                    "description": "State of an instance update.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "Update": {
+            "description": "Resource describing a single update (rollout) of an instance group to the given template.",
+            "id": "Update",
+            "properties": {
+                "details": {
+                    "description": "[Output Only] Human-readable description of an update progress.",
+                    "type": "string"
+                },
+                "handle": {
+                    "description": "[Output Only] Unique (in the context of a group) handle assigned to this update.",
+                    "type": "string"
+                },
+                "instanceTemplate": {
+                    "description": "Url of an instance template to be applied.",
+                    "type": "string"
+                },
+                "instanceUpdates": {
+                    "description": "[Output Only] Collection of instance updates.",
+                    "items": {
+                        "$ref": "InstanceUpdate"
+                    },
+                    "type": "array"
+                },
+                "kind": {
+                    "default": "replicapoolupdater#update",
+                    "description": "[Output only] The resource type. Always replicapoolupdater#update.",
+                    "type": "string"
+                },
+                "policy": {
+                    "$ref": "UpdatePolicy",
+                    "description": "Parameters of an update process."
+                },
+                "selfLink": {
+                    "description": "[Output only] The fully qualified URL for this resource.",
+                    "type": "string"
+                },
+                "state": {
+                    "description": "[Output Only] Current state of an update.",
+                    "type": "string"
+                },
+                "targetState": {
+                    "description": "[Output Only] Requested state of an update. This is the state that the updater is moving towards. Acceptable values are:  \n- \"ROLLED_OUT\": The user has requested the update to go forward. \n- \"ROLLED_BACK\": The user has requested the update to be rolled back. \n- \"PAUSED\": The user has requested the update to be paused.\n \n- \"CANCELLED\": The user has requested the update to be cancelled. The updater service is in the process of canceling the update.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "UpdateList": {
+            "description": "Response returned by List method.",
+            "id": "UpdateList",
+            "properties": {
+                "items": {
+                    "description": "Collection of requested updates.",
+                    "items": {
+                        "$ref": "Update"
+                    },
+                    "type": "array"
+                },
+                "nextPageToken": {
+                    "description": "A token used to continue a truncated list request.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "UpdatePolicy": {
+            "description": "Parameters of an update process.",
+            "id": "UpdatePolicy",
+            "properties": {
+                "canary": {
+                    "$ref": "UpdatePolicyCanary",
+                    "description": "Parameters of a canary phase. If absent, canary will NOT be performed."
+                },
+                "maxNumConcurrentInstances": {
+                    "description": "Maximum number of instances that can be updated simultaneously (concurrently). An update of an instance starts when the instance is about to be restarted and finishes after the instance has been restarted and the sleep period (defined by sleep_after_instance_restart_sec) has passed.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "sleepAfterInstanceRestartSec": {
+                    "description": "Time period after the instance has been restarted but before marking the update of this instance as done.",
+                    "format": "int32",
+                    "type": "integer"
+                }
+            },
+            "type": "object"
+        },
+        "UpdatePolicyCanary": {
+            "description": "Parameters of a canary phase.",
+            "id": "UpdatePolicyCanary",
+            "properties": {
+                "numInstances": {
+                    "description": "Number of instances updated as a part of canary phase. If absent, the default number of instances will be used.",
+                    "format": "int32",
+                    "type": "integer"
+                }
+            },
+            "type": "object"
+        }
+    },
+    "servicePath": "replicapoolupdater/v1beta1/projects/",
+    "title": "Google Compute Engine Instance Group Updater API",
+    "version": "v1beta1"
+}
\ No newline at end of file
diff --git a/discovery/googleapis_beta/sqladmin__v1beta3.json b/discovery/googleapis_beta/sqladmin__v1beta3.json
index fe96414..6e1b695 100644
--- a/discovery/googleapis_beta/sqladmin__v1beta3.json
+++ b/discovery/googleapis_beta/sqladmin__v1beta3.json
@@ -18,7 +18,7 @@
     "description": "API for Cloud SQL database instance management.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/cloud-sql/docs/admin-api/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/9fwQA8H2k5NmzsvEUWIyM_KlxbQ\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/hSgBYRvTI2dDR9CzjHO6eIajaXc\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -95,7 +95,7 @@
                             "type": "string"
                         },
                         "dueTime": {
-                            "description": "The time when this run is due to start in RFC 3339 format, for example 2012-11-15T16:19:00.094Z.",
+                            "description": "The start time of the four-hour backup window. The backup can occur any time in the window. The time is in RFC 3339 format, for example 2012-11-15T16:19:00.094Z.",
                             "location": "query",
                             "required": true,
                             "type": "string"
@@ -542,7 +542,7 @@
                             "type": "string"
                         },
                         "dueTime": {
-                            "description": "The time when this run is due to start in RFC 3339 format, for example 2012-11-15T16:19:00.094Z.",
+                            "description": "The start time of the four-hour backup window. The backup can occur any time in the window. The time is in RFC 3339 format, for example 2012-11-15T16:19:00.094Z.",
                             "location": "query",
                             "required": true,
                             "type": "string"
@@ -888,7 +888,7 @@
             }
         }
     },
-    "revision": "20140827",
+    "revision": "20141020",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "BackupConfiguration": {
@@ -1088,6 +1088,10 @@
                     },
                     "type": "array"
                 },
+                "ipv6Address": {
+                    "description": "The IPv6 address assigned to the instance.",
+                    "type": "string"
+                },
                 "kind": {
                     "default": "sql#instance",
                     "description": "This is always sql#instance.",
@@ -1574,6 +1578,11 @@
                     "description": "Whether the instance should be assigned an IP address or not.",
                     "type": "boolean"
                 },
+                "kind": {
+                    "default": "sql#ipConfiguration",
+                    "description": "This is always sql#ipConfiguration.",
+                    "type": "string"
+                },
                 "requireSsl": {
                     "description": "Whether the mysqld should default to 'REQUIRE X509' for users connecting over IP.",
                     "type": "boolean"
diff --git a/generated/googleapis/CHANGELOG.md b/generated/googleapis/CHANGELOG.md
index 5aea4eb..6a934a1 100644
--- a/generated/googleapis/CHANGELOG.md
+++ b/generated/googleapis/CHANGELOG.md
@@ -1,3 +1,21 @@
+## 0.4.0
+
+* [apis-new] fitness:v1: API added
+* [apis-new] tagmanager:v1: API added
+* [apis] adexchangebuyer:v1.3: schema changes
+* [apis] calendar:v3: schema changes
+* [apis] civicinfo:us_v1: schema changes
+* [apis] civicinfo:v1: schema changes
+* [apis] civicinfo:v2: schema changes
+* [apis] compute:v1: schema changes
+* [apis] content:v2: schema/method changes
+* [apis] drive:v2: schema/method changes
+* [apis] games:v1: schema changes
+* [apis] gamesManagement:v1management: schema/method changes
+* [apis] gmail:v1: method changes
+* [apis] mapsengine:v1: schema changes
+* [apis-breaking] prediction:v1.6: String -> double change
+
 ## 0.3.1
 
 * [apis] admin_directory:v1: additional schema/methods
diff --git a/generated/googleapis/README.md b/generated/googleapis/README.md
index 835262b..a011b85 100644
--- a/generated/googleapis/README.md
+++ b/generated/googleapis/README.md
@@ -227,6 +227,10 @@
 
 Official API documentation: https://developers.google.com/drive/
 
+#### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Fitness - fitness v1
+
+Google Fit API
+
 #### ![Logo](http://www.google.com/images/icons/product/freebase-16.png) Freebase Search - freebase v1
 
 Find Freebase entities using textual queries and other constraints.
@@ -347,7 +351,13 @@
 
 Official API documentation: https://developers.google.com/storage/docs/json_api/
 
-#### ![Logo](http://www.google.com/images/icons/product/tasks-16.png) Tasks API - tasks v1
+#### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Tag Manager API - tagmanager v1
+
+API for accessing Tag Manager accounts and containers.
+
+Official API documentation: https://developers.google.com/tag-manager/api/v1/
+
+#### ![Logo](https://www.google.com/images/icons/product/tasks-16.png) Tasks API - tasks v1
 
 Lets you manage your tasks and task lists.
 
diff --git a/generated/googleapis/lib/adexchangebuyer/v1_3.dart b/generated/googleapis/lib/adexchangebuyer/v1_3.dart
index 12b5035..d88bc88 100644
--- a/generated/googleapis/lib/adexchangebuyer/v1_3.dart
+++ b/generated/googleapis/lib/adexchangebuyer/v1_3.dart
@@ -986,11 +986,24 @@
   core.String kind;
 
   /**
+   * The maximum number of active creatives that an account can have, where a
+   * creative is active if it was inserted or bid with in the last 30 days.
+   * Please contact your technical account manager if you need to change this.
+   */
+  core.int maximumActiveCreatives;
+
+  /**
    * The sum of all bidderLocation.maximumQps values cannot exceed this. Please
    * contact your technical account manager if you need to change this.
    */
   core.int maximumTotalQps;
 
+  /**
+   * The number of creatives that this account inserted or bid with in the last
+   * 30 days.
+   */
+  core.int numberActiveCreatives;
+
 
   Account();
 
@@ -1010,9 +1023,15 @@
     if (_json.containsKey("kind")) {
       kind = _json["kind"];
     }
+    if (_json.containsKey("maximumActiveCreatives")) {
+      maximumActiveCreatives = _json["maximumActiveCreatives"];
+    }
     if (_json.containsKey("maximumTotalQps")) {
       maximumTotalQps = _json["maximumTotalQps"];
     }
+    if (_json.containsKey("numberActiveCreatives")) {
+      numberActiveCreatives = _json["numberActiveCreatives"];
+    }
   }
 
   core.Map toJson() {
@@ -1032,9 +1051,15 @@
     if (kind != null) {
       _json["kind"] = kind;
     }
+    if (maximumActiveCreatives != null) {
+      _json["maximumActiveCreatives"] = maximumActiveCreatives;
+    }
     if (maximumTotalQps != null) {
       _json["maximumTotalQps"] = maximumTotalQps;
     }
+    if (numberActiveCreatives != null) {
+      _json["numberActiveCreatives"] = numberActiveCreatives;
+    }
     return _json;
   }
 }
diff --git a/generated/googleapis/lib/admin/reports_v1.dart b/generated/googleapis/lib/admin/reports_v1.dart
index 8814ae1..dea1bbf 100644
--- a/generated/googleapis/lib/admin/reports_v1.dart
+++ b/generated/googleapis/lib/admin/reports_v1.dart
@@ -324,7 +324,7 @@
    * [parameters] - Represents the application name, parameter name pairs to
    * fetch in csv as app_name1:param_name1, app_name2:param_name2.
    * Value must have pattern
-   * "(((accounts)|(gmail)|(calendar)|(docs)|(gplus)):.+,)*(((accounts)|(gmail)|(calendar)|(docs)|(gplus)):.+)".
+   * "(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)):.+,)*(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)):.+)".
    *
    * Completes with a [UsageReports].
    *
@@ -397,7 +397,7 @@
    * [filters] - Represents the set of filters including parameter operator
    * value.
    * Value must have pattern
-   * "(((accounts)|(gmail)|(calendar)|(docs)|(gplus)):.+[<,<=,==,>=,>,!=].+,)*(((accounts)|(gmail)|(calendar)|(docs)|(gplus)):.+[<,<=,==,>=,>,!=].+)".
+   * "(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)):.+[<,<=,==,>=,>,!=].+,)*(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)):.+[<,<=,==,>=,>,!=].+)".
    *
    * [maxResults] - Maximum number of results to return. Maximum allowed is 1000
    *
@@ -406,7 +406,7 @@
    * [parameters] - Represents the application name, parameter name pairs to
    * fetch in csv as app_name1:param_name1, app_name2:param_name2.
    * Value must have pattern
-   * "(((accounts)|(gmail)|(calendar)|(docs)|(gplus)):.+,)*(((accounts)|(gmail)|(calendar)|(docs)|(gplus)):.+)".
+   * "(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)):.+,)*(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)):.+)".
    *
    * Completes with a [UsageReports].
    *
diff --git a/generated/googleapis/lib/analytics/v3.dart b/generated/googleapis/lib/analytics/v3.dart
index ce44a1b..d2f7693 100644
--- a/generated/googleapis/lib/analytics/v3.dart
+++ b/generated/googleapis/lib/analytics/v3.dart
@@ -7401,6 +7401,7 @@
    * - Mobile device
    * - IS_MOBILE,
    * - IS_TABLET,
+   * - DEVICE_CATEGORY,
    * - MOBILE_HAS_QWERTY_KEYBOARD,
    * - MOBILE_HAS_NFC_SUPPORT,
    * - MOBILE_HAS_CELLULAR_RADIO,
@@ -9384,7 +9385,8 @@
 
   /**
    * Indicates whether enhanced ecommerce tracking is enabled for this view
-   * (profile).
+   * (profile). This property can only be enabled if ecommerce tracking is
+   * enabled.
    */
   core.bool enhancedECommerceTracking;
 
diff --git a/generated/googleapis/lib/androidpublisher/v2.dart b/generated/googleapis/lib/androidpublisher/v2.dart
index 9ec7205..e39a907 100644
--- a/generated/googleapis/lib/androidpublisher/v2.dart
+++ b/generated/googleapis/lib/androidpublisher/v2.dart
@@ -3441,10 +3441,9 @@
   core.String subscriptionPeriod;
 
   /**
-   * Trial duration (if any) of the subscription, defined as ISO 8601. i.e.
-   * "P10D" means an initial period of 10 days during which ownership is granted
-   * prior to any payment. Acceptable values are between "P7D" and "P999D".
-   * Seasonal subscriptions cannot have a trial period.
+   * Trial period, specified in ISO 8601 format. Acceptable values are anything
+   * between "P7D" (seven days) and "P999D" (999 days). Seasonal subscriptions
+   * cannot have a trial period.
    */
   core.String trialPeriod;
 
diff --git a/generated/googleapis/lib/bigquery/v2.dart b/generated/googleapis/lib/bigquery/v2.dart
index ad21da3..e540926 100644
--- a/generated/googleapis/lib/bigquery/v2.dart
+++ b/generated/googleapis/lib/bigquery/v2.dart
@@ -2167,8 +2167,9 @@
   core.String sourceFormat;
 
   /**
-   * [Required] The fully-qualified URIs that point to your data on Google Cloud
-   * Storage.
+   * [Required] The fully-qualified URIs that point to your data in Google Cloud
+   * Storage. Wildcard names are only supported when they appear at the end of
+   * the URI.
    */
   core.List<core.String> sourceUris;
 
@@ -2678,7 +2679,11 @@
 
 /** Not documented yet. */
 class JobReference {
-  /** [Required] ID of the job. */
+  /**
+   * [Required] The ID of the job. The ID must contain only letters (a-z, A-Z),
+   * numbers (0-9), underscores (_), or dashes (-). The maximum length is 1,024
+   * characters.
+   */
   core.String jobId;
 
   /** [Required] Project ID being billed for the job. */
@@ -3390,10 +3395,16 @@
    */
   core.String lastModifiedTime;
 
-  /** [Output-only] The size of the table in bytes. */
+  /**
+   * [Output-only] The size of the table in bytes. This property is unavailable
+   * for tables that are actively receiving streaming inserts.
+   */
   core.String numBytes;
 
-  /** [Output-only] The number of rows of data in this table. */
+  /**
+   * [Output-only] The number of rows of data in this table. This property is
+   * unavailable for tables that are actively receiving streaming inserts.
+   */
   core.String numRows;
 
   /** [Optional] Describes the schema of this table. */
@@ -3755,7 +3766,9 @@
 
 /** Not documented yet. */
 class TableFieldSchema {
-  /** [Optional] The field description. */
+  /**
+   * [Optional] The field description. The maximum length is 16K characters.
+   */
   core.String description;
 
   /**
@@ -3770,7 +3783,11 @@
    */
   core.String mode;
 
-  /** [Required] The field name. */
+  /**
+   * [Required] The field name. The name must contain only letters (a-z, A-Z),
+   * numbers (0-9), or underscores (_), and must start with a letter or
+   * underscore. The maximum length is 128 characters.
+   */
   core.String name;
 
   /**
diff --git a/generated/googleapis/lib/calendar/v3.dart b/generated/googleapis/lib/calendar/v3.dart
index fc0aefb..c8e4b33 100644
--- a/generated/googleapis/lib/calendar/v3.dart
+++ b/generated/googleapis/lib/calendar/v3.dart
@@ -4033,6 +4033,30 @@
 
 
 /** Not documented yet. */
+class EventAttachment {
+  /** File name. */
+  core.String title;
+
+
+  EventAttachment();
+
+  EventAttachment.fromJson(core.Map _json) {
+    if (_json.containsKey("title")) {
+      title = _json["title"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (title != null) {
+      _json["title"] = title;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
 class EventAttendee {
   /** Number of additional guests. Optional. The default is 0. */
   core.int additionalGuests;
diff --git a/generated/googleapis/lib/civicinfo/us_v1.dart b/generated/googleapis/lib/civicinfo/us_v1.dart
index a152242..8d07e46 100644
--- a/generated/googleapis/lib/civicinfo/us_v1.dart
+++ b/generated/googleapis/lib/civicinfo/us_v1.dart
@@ -1311,16 +1311,16 @@
 
 
 /**
- * A location where a voter can vote. This may be an early vote site or an
- * election day voting location.
+ * A location where a voter can vote. This may be an early vote site, an
+ * election day voting location, or a drop off location for a completed ballot.
  */
 class PollingLocation {
-  /** The address of the location */
+  /** The address of the location. */
   SimpleAddressType address;
 
   /**
-   * The last date that this early vote site may be used. This field is not
-   * populated for polling locations.
+   * The last date that this early vote site or drop off location may be used.
+   * This field is not populated for polling locations.
    */
   core.String endDate;
 
@@ -1332,12 +1332,14 @@
   core.String id;
 
   /**
-   * The name of the early vote site. This field is not populated for polling
-   * locations.
+   * The name of the early vote site or drop off location. This field is not
+   * populated for polling locations.
    */
   core.String name;
 
-  /** Notes about this location (e.g. accessibility ramp or entrance to use) */
+  /**
+   * Notes about this location (e.g. accessibility ramp or entrance to use).
+   */
   core.String notes;
 
   /** A description of when this location is open. */
@@ -1350,14 +1352,14 @@
   core.List<Source> sources;
 
   /**
-   * The first date that this early vote site may be used. This field is not
-   * populated for polling locations.
+   * The first date that this early vote site or drop off location may be used.
+   * This field is not populated for polling locations.
    */
   core.String startDate;
 
   /**
-   * The services provided by this early vote site. This field is not populated
-   * for polling locations.
+   * The services provided by this early vote site or drop off location. This
+   * field is not populated for polling locations.
    */
   core.String voterServices;
 
@@ -1680,11 +1682,20 @@
 
 /** The result of a voter info lookup query. */
 class VoterInfoResponse {
-  /** Contests that will appear on the voter's ballot */
+  /** Contests that will appear on the voter's ballot. */
   core.List<Contest> contests;
 
   /**
-   * Locations where the voter is eligible to vote early, prior to election day
+   * Locations where a voter is eligible to drop off a completed ballot. The
+   * voter must have received and completed a ballot prior to arriving at the
+   * location. The location may not have ballots available on the premises.
+   * These locations could be open on or before election day as indicated in the
+   * pollingHours field.
+   */
+  core.List<PollingLocation> dropOffLocations;
+
+  /**
+   * Locations where the voter is eligible to vote early, prior to election day.
    */
   core.List<PollingLocation> earlyVoteSites;
 
@@ -1700,12 +1711,7 @@
   /** The normalized version of the requested address */
   SimpleAddressType normalizedInput;
 
-  /**
-   * Locations where the voter is eligible to vote on election day. For states
-   * with mail-in voting only, these locations will be nearby drop box
-   * locations. Drop box locations are free to the voter and may be used instead
-   * of placing the ballot in the mail.
-   */
+  /** Locations where the voter is eligible to vote on election day. */
   core.List<PollingLocation> pollingLocations;
 
   /** Not documented yet. */
@@ -1731,6 +1737,9 @@
     if (_json.containsKey("contests")) {
       contests = _json["contests"].map((value) => new Contest.fromJson(value)).toList();
     }
+    if (_json.containsKey("dropOffLocations")) {
+      dropOffLocations = _json["dropOffLocations"].map((value) => new PollingLocation.fromJson(value)).toList();
+    }
     if (_json.containsKey("earlyVoteSites")) {
       earlyVoteSites = _json["earlyVoteSites"].map((value) => new PollingLocation.fromJson(value)).toList();
     }
@@ -1762,6 +1771,9 @@
     if (contests != null) {
       _json["contests"] = contests.map((value) => (value).toJson()).toList();
     }
+    if (dropOffLocations != null) {
+      _json["dropOffLocations"] = dropOffLocations.map((value) => (value).toJson()).toList();
+    }
     if (earlyVoteSites != null) {
       _json["earlyVoteSites"] = earlyVoteSites.map((value) => (value).toJson()).toList();
     }
diff --git a/generated/googleapis/lib/civicinfo/v1.dart b/generated/googleapis/lib/civicinfo/v1.dart
index 57288ae..023d282 100644
--- a/generated/googleapis/lib/civicinfo/v1.dart
+++ b/generated/googleapis/lib/civicinfo/v1.dart
@@ -1311,16 +1311,16 @@
 
 
 /**
- * A location where a voter can vote. This may be an early vote site or an
- * election day voting location.
+ * A location where a voter can vote. This may be an early vote site, an
+ * election day voting location, or a drop off location for a completed ballot.
  */
 class PollingLocation {
-  /** The address of the location */
+  /** The address of the location. */
   SimpleAddressType address;
 
   /**
-   * The last date that this early vote site may be used. This field is not
-   * populated for polling locations.
+   * The last date that this early vote site or drop off location may be used.
+   * This field is not populated for polling locations.
    */
   core.String endDate;
 
@@ -1332,12 +1332,14 @@
   core.String id;
 
   /**
-   * The name of the early vote site. This field is not populated for polling
-   * locations.
+   * The name of the early vote site or drop off location. This field is not
+   * populated for polling locations.
    */
   core.String name;
 
-  /** Notes about this location (e.g. accessibility ramp or entrance to use) */
+  /**
+   * Notes about this location (e.g. accessibility ramp or entrance to use).
+   */
   core.String notes;
 
   /** A description of when this location is open. */
@@ -1350,14 +1352,14 @@
   core.List<Source> sources;
 
   /**
-   * The first date that this early vote site may be used. This field is not
-   * populated for polling locations.
+   * The first date that this early vote site or drop off location may be used.
+   * This field is not populated for polling locations.
    */
   core.String startDate;
 
   /**
-   * The services provided by this early vote site. This field is not populated
-   * for polling locations.
+   * The services provided by this early vote site or drop off location. This
+   * field is not populated for polling locations.
    */
   core.String voterServices;
 
@@ -1680,11 +1682,20 @@
 
 /** The result of a voter info lookup query. */
 class VoterInfoResponse {
-  /** Contests that will appear on the voter's ballot */
+  /** Contests that will appear on the voter's ballot. */
   core.List<Contest> contests;
 
   /**
-   * Locations where the voter is eligible to vote early, prior to election day
+   * Locations where a voter is eligible to drop off a completed ballot. The
+   * voter must have received and completed a ballot prior to arriving at the
+   * location. The location may not have ballots available on the premises.
+   * These locations could be open on or before election day as indicated in the
+   * pollingHours field.
+   */
+  core.List<PollingLocation> dropOffLocations;
+
+  /**
+   * Locations where the voter is eligible to vote early, prior to election day.
    */
   core.List<PollingLocation> earlyVoteSites;
 
@@ -1700,12 +1711,7 @@
   /** The normalized version of the requested address */
   SimpleAddressType normalizedInput;
 
-  /**
-   * Locations where the voter is eligible to vote on election day. For states
-   * with mail-in voting only, these locations will be nearby drop box
-   * locations. Drop box locations are free to the voter and may be used instead
-   * of placing the ballot in the mail.
-   */
+  /** Locations where the voter is eligible to vote on election day. */
   core.List<PollingLocation> pollingLocations;
 
   /** Not documented yet. */
@@ -1731,6 +1737,9 @@
     if (_json.containsKey("contests")) {
       contests = _json["contests"].map((value) => new Contest.fromJson(value)).toList();
     }
+    if (_json.containsKey("dropOffLocations")) {
+      dropOffLocations = _json["dropOffLocations"].map((value) => new PollingLocation.fromJson(value)).toList();
+    }
     if (_json.containsKey("earlyVoteSites")) {
       earlyVoteSites = _json["earlyVoteSites"].map((value) => new PollingLocation.fromJson(value)).toList();
     }
@@ -1762,6 +1771,9 @@
     if (contests != null) {
       _json["contests"] = contests.map((value) => (value).toJson()).toList();
     }
+    if (dropOffLocations != null) {
+      _json["dropOffLocations"] = dropOffLocations.map((value) => (value).toJson()).toList();
+    }
     if (earlyVoteSites != null) {
       _json["earlyVoteSites"] = earlyVoteSites.map((value) => (value).toJson()).toList();
     }
diff --git a/generated/googleapis/lib/civicinfo/v2.dart b/generated/googleapis/lib/civicinfo/v2.dart
index c05e94d..019a58e 100644
--- a/generated/googleapis/lib/civicinfo/v2.dart
+++ b/generated/googleapis/lib/civicinfo/v2.dart
@@ -1379,16 +1379,16 @@
 
 
 /**
- * A location where a voter can vote. This may be an early vote site or an
- * election day voting location.
+ * A location where a voter can vote. This may be an early vote site, an
+ * election day voting location, or a drop off location for a completed ballot.
  */
 class PollingLocation {
-  /** The address of the location */
+  /** The address of the location. */
   SimpleAddressType address;
 
   /**
-   * The last date that this early vote site may be used. This field is not
-   * populated for polling locations.
+   * The last date that this early vote site or drop off location may be used.
+   * This field is not populated for polling locations.
    */
   core.String endDate;
 
@@ -1400,12 +1400,14 @@
   core.String id;
 
   /**
-   * The name of the early vote site. This field is not populated for polling
-   * locations.
+   * The name of the early vote site or drop off location. This field is not
+   * populated for polling locations.
    */
   core.String name;
 
-  /** Notes about this location (e.g. accessibility ramp or entrance to use) */
+  /**
+   * Notes about this location (e.g. accessibility ramp or entrance to use).
+   */
   core.String notes;
 
   /** A description of when this location is open. */
@@ -1418,14 +1420,14 @@
   core.List<Source> sources;
 
   /**
-   * The first date that this early vote site may be used. This field is not
-   * populated for polling locations.
+   * The first date that this early vote site or drop off location may be used.
+   * This field is not populated for polling locations.
    */
   core.String startDate;
 
   /**
-   * The services provided by this early vote site. This field is not populated
-   * for polling locations.
+   * The services provided by this early vote site or drop off location. This
+   * field is not populated for polling locations.
    */
   core.String voterServices;
 
@@ -1728,11 +1730,20 @@
 
 /** The result of a voter info lookup query. */
 class VoterInfoResponse {
-  /** Contests that will appear on the voter's ballot */
+  /** Contests that will appear on the voter's ballot. */
   core.List<Contest> contests;
 
   /**
-   * Locations where the voter is eligible to vote early, prior to election day
+   * Locations where a voter is eligible to drop off a completed ballot. The
+   * voter must have received and completed a ballot prior to arriving at the
+   * location. The location may not have ballots available on the premises.
+   * These locations could be open on or before election day as indicated in the
+   * pollingHours field.
+   */
+  core.List<PollingLocation> dropOffLocations;
+
+  /**
+   * Locations where the voter is eligible to vote early, prior to election day.
    */
   core.List<PollingLocation> earlyVoteSites;
 
@@ -1755,12 +1766,7 @@
    */
   core.List<Election> otherElections;
 
-  /**
-   * Locations where the voter is eligible to vote on election day. For states
-   * with mail-in voting only, these locations will be nearby drop box
-   * locations. Drop box locations are free to the voter and may be used instead
-   * of placing the ballot in the mail.
-   */
+  /** Locations where the voter is eligible to vote on election day. */
   core.List<PollingLocation> pollingLocations;
 
   /** Not documented yet. */
@@ -1779,6 +1785,9 @@
     if (_json.containsKey("contests")) {
       contests = _json["contests"].map((value) => new Contest.fromJson(value)).toList();
     }
+    if (_json.containsKey("dropOffLocations")) {
+      dropOffLocations = _json["dropOffLocations"].map((value) => new PollingLocation.fromJson(value)).toList();
+    }
     if (_json.containsKey("earlyVoteSites")) {
       earlyVoteSites = _json["earlyVoteSites"].map((value) => new PollingLocation.fromJson(value)).toList();
     }
@@ -1810,6 +1819,9 @@
     if (contests != null) {
       _json["contests"] = contests.map((value) => (value).toJson()).toList();
     }
+    if (dropOffLocations != null) {
+      _json["dropOffLocations"] = dropOffLocations.map((value) => (value).toJson()).toList();
+    }
     if (earlyVoteSites != null) {
       _json["earlyVoteSites"] = earlyVoteSites.map((value) => (value).toJson()).toList();
     }
diff --git a/generated/googleapis/lib/compute/v1.dart b/generated/googleapis/lib/compute/v1.dart
index 318bbd8..70f212f 100644
--- a/generated/googleapis/lib/compute/v1.dart
+++ b/generated/googleapis/lib/compute/v1.dart
@@ -8067,6 +8067,14 @@
   /** Initialization parameters. */
   AttachedDiskInitializeParams initializeParams;
 
+  /**
+   * Not documented yet.
+   * Possible string values are:
+   * - "NVME"
+   * - "SCSI"
+   */
+  core.String interface;
+
   /** Type of the resource. */
   core.String kind;
 
@@ -8112,6 +8120,9 @@
     if (_json.containsKey("initializeParams")) {
       initializeParams = new AttachedDiskInitializeParams.fromJson(_json["initializeParams"]);
     }
+    if (_json.containsKey("interface")) {
+      interface = _json["interface"];
+    }
     if (_json.containsKey("kind")) {
       kind = _json["kind"];
     }
@@ -8146,6 +8157,9 @@
     if (initializeParams != null) {
       _json["initializeParams"] = (initializeParams).toJson();
     }
+    if (interface != null) {
+      _json["interface"] = interface;
+    }
     if (kind != null) {
       _json["kind"] = kind;
     }
@@ -13284,6 +13298,7 @@
    * - "IN_USE_ADDRESSES"
    * - "KERNELS"
    * - "KERNELS_TOTAL_GB"
+   * - "LOCAL_SSD_TOTAL_GB"
    * - "NETWORKS"
    * - "OPERATIONS"
    * - "ROUTES"
diff --git a/generated/googleapis/lib/content/v2.dart b/generated/googleapis/lib/content/v2.dart
index 8c0e8d8..6feb985 100644
--- a/generated/googleapis/lib/content/v2.dart
+++ b/generated/googleapis/lib/content/v2.dart
@@ -705,7 +705,12 @@
    *
    * Request parameters:
    *
-   * [merchantId] - null
+   * [merchantId] - The ID of the managing account.
+   *
+   * [maxResults] - The maximum number of products to return in the response,
+   * used for paging.
+   *
+   * [pageToken] - The token returned by the previous request.
    *
    * Completes with a [DatafeedsListResponse].
    *
@@ -715,7 +720,7 @@
    * If the used [http.Client] completes with an error when making a REST call,
    * this method  will complete with the same error.
    */
-  async.Future<DatafeedsListResponse> list(core.String merchantId) {
+  async.Future<DatafeedsListResponse> list(core.String merchantId, {core.int maxResults, core.String pageToken}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -726,6 +731,12 @@
     if (merchantId == null) {
       throw new core.ArgumentError("Parameter merchantId is required.");
     }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
 
 
     _url = common_internal.Escaper.ecapeVariable('$merchantId') + '/datafeeds';
@@ -941,7 +952,12 @@
    *
    * Request parameters:
    *
-   * [merchantId] - null
+   * [merchantId] - The ID of the managing account.
+   *
+   * [maxResults] - The maximum number of products to return in the response,
+   * used for paging.
+   *
+   * [pageToken] - The token returned by the previous request.
    *
    * Completes with a [DatafeedstatusesListResponse].
    *
@@ -951,7 +967,7 @@
    * If the used [http.Client] completes with an error when making a REST call,
    * this method  will complete with the same error.
    */
-  async.Future<DatafeedstatusesListResponse> list(core.String merchantId) {
+  async.Future<DatafeedstatusesListResponse> list(core.String merchantId, {core.int maxResults, core.String pageToken}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -962,6 +978,12 @@
     if (merchantId == null) {
       throw new core.ArgumentError("Parameter merchantId is required.");
     }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
 
 
     _url = common_internal.Escaper.ecapeVariable('$merchantId') + '/datafeedstatuses';
@@ -1486,7 +1508,7 @@
 
 
 
-/** Not documented yet. */
+/** Account data. */
 class Account {
   /** Indicates whether the merchant sells adult content. */
   core.bool adultContent;
@@ -1859,7 +1881,7 @@
 
 /** Not documented yet. */
 class AccountsCustomBatchRequest {
-  /** Not documented yet. */
+  /** The request entries to be processed in the batch. */
   core.List<AccountsCustomBatchRequestEntry> entries;
 
 
@@ -1904,7 +1926,7 @@
   /** The ID of the managing account. */
   core.String merchantId;
 
-  /** The method (get, insert, update, or delete). */
+  /** Not documented yet. */
   core.String method;
 
 
@@ -1952,7 +1974,7 @@
 
 /** Not documented yet. */
 class AccountsCustomBatchResponse {
-  /** Not documented yet. */
+  /** The result of the execution of the batch requests. */
   core.List<AccountsCustomBatchResponseEntry> entries;
 
   /**
@@ -2054,7 +2076,7 @@
    */
   core.String kind;
 
-  /** Not documented yet. */
+  /** The token for the retrieval of the next page of accounts. */
   core.String nextPageToken;
 
   /** Not documented yet. */
@@ -2093,7 +2115,7 @@
 
 /** Not documented yet. */
 class AccountstatusesCustomBatchRequest {
-  /** Not documented yet. */
+  /** The request entries to be processed in the batch. */
   core.List<AccountstatusesCustomBatchRequestEntry> entries;
 
 
@@ -2171,7 +2193,7 @@
 
 /** Not documented yet. */
 class AccountstatusesCustomBatchResponse {
-  /** Not documented yet. */
+  /** The result of the execution of the batch requests. */
   core.List<AccountstatusesCustomBatchResponseEntry> entries;
 
   /**
@@ -2261,7 +2283,7 @@
    */
   core.String kind;
 
-  /** Not documented yet. */
+  /** The token for the retrieval of the next page of account statuses. */
   core.String nextPageToken;
 
   /** Not documented yet. */
@@ -2298,7 +2320,7 @@
 }
 
 
-/** Not documented yet. */
+/** Datafeed data. */
 class Datafeed {
   /**
    * The two-letter ISO 639-1 language in which the attributes are defined in
@@ -2566,7 +2588,10 @@
 }
 
 
-/** Not documented yet. */
+/**
+ * The status of a datafeed, i.e., the result of the last retrieval of the
+ * datafeed computed asynchronously when the feed processing is finished.
+ */
 class DatafeedStatus {
   /** The ID of the feed for which the status is reported. */
   core.String datafeedId;
@@ -2742,7 +2767,7 @@
 
 /** Not documented yet. */
 class DatafeedsCustomBatchRequest {
-  /** Not documented yet. */
+  /** The request entries to be processed in the batch. */
   core.List<DatafeedsCustomBatchRequestEntry> entries;
 
 
@@ -2781,7 +2806,7 @@
   /** The ID of the managing account. */
   core.String merchantId;
 
-  /** The method (get, insert, update, or delete). */
+  /** Not documented yet. */
   core.String method;
 
 
@@ -2829,7 +2854,7 @@
 
 /** Not documented yet. */
 class DatafeedsCustomBatchResponse {
-  /** Not documented yet. */
+  /** The result of the execution of the batch requests. */
   core.List<DatafeedsCustomBatchResponseEntry> entries;
 
   /**
@@ -2918,6 +2943,9 @@
    */
   core.String kind;
 
+  /** The token for the retrieval of the next page of datafeeds. */
+  core.String nextPageToken;
+
   /** Not documented yet. */
   core.List<Datafeed> resources;
 
@@ -2928,6 +2956,9 @@
     if (_json.containsKey("kind")) {
       kind = _json["kind"];
     }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
     if (_json.containsKey("resources")) {
       resources = _json["resources"].map((value) => new Datafeed.fromJson(value)).toList();
     }
@@ -2938,6 +2969,9 @@
     if (kind != null) {
       _json["kind"] = kind;
     }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
     if (resources != null) {
       _json["resources"] = resources.map((value) => (value).toJson()).toList();
     }
@@ -2948,7 +2982,7 @@
 
 /** Not documented yet. */
 class DatafeedstatusesCustomBatchRequest {
-  /** Not documented yet. */
+  /** The request entries to be processed in the batch. */
   core.List<DatafeedstatusesCustomBatchRequestEntry> entries;
 
 
@@ -2984,7 +3018,7 @@
   /** The ID of the managing account. */
   core.String merchantId;
 
-  /** The method (get). */
+  /** Not documented yet. */
   core.String method;
 
 
@@ -3026,7 +3060,7 @@
 
 /** Not documented yet. */
 class DatafeedstatusesCustomBatchResponse {
-  /** Not documented yet. */
+  /** The result of the execution of the batch requests. */
   core.List<DatafeedstatusesCustomBatchResponseEntry> entries;
 
   /**
@@ -3116,6 +3150,9 @@
    */
   core.String kind;
 
+  /** The token for the retrieval of the next page of datafeed statuses. */
+  core.String nextPageToken;
+
   /** Not documented yet. */
   core.List<DatafeedStatus> resources;
 
@@ -3126,6 +3163,9 @@
     if (_json.containsKey("kind")) {
       kind = _json["kind"];
     }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
     if (_json.containsKey("resources")) {
       resources = _json["resources"].map((value) => new DatafeedStatus.fromJson(value)).toList();
     }
@@ -3136,6 +3176,9 @@
     if (kind != null) {
       _json["kind"] = kind;
     }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
     if (resources != null) {
       _json["resources"] = resources.map((value) => (value).toJson()).toList();
     }
@@ -3311,7 +3354,7 @@
 
 /** Not documented yet. */
 class InventoryCustomBatchRequest {
-  /** Not documented yet. */
+  /** The request entries to be processed in the batch. */
   core.List<InventoryCustomBatchRequestEntry> entries;
 
 
@@ -3401,7 +3444,7 @@
 
 /** Not documented yet. */
 class InventoryCustomBatchResponse {
-  /** Not documented yet. */
+  /** The result of the execution of the batch requests. */
   core.List<InventoryCustomBatchResponseEntry> entries;
 
   /**
@@ -4865,7 +4908,7 @@
 
 /** Not documented yet. */
 class ProductsCustomBatchRequest {
-  /** Not documented yet. */
+  /** The request entries to be processed in the batch. */
   core.List<ProductsCustomBatchRequestEntry> entries;
 
 
@@ -4898,7 +4941,7 @@
   /** The ID of the managing account. */
   core.String merchantId;
 
-  /** The method (get, insert or delete). */
+  /** Not documented yet. */
   core.String method;
 
   /** The product to insert. Only required if the method is insert. */
@@ -4955,7 +4998,7 @@
 
 /** Not documented yet. */
 class ProductsCustomBatchResponse {
-  /** Not documented yet. */
+  /** The result of the execution of the batch requests. */
   core.List<ProductsCustomBatchResponseEntry> entries;
 
   /**
@@ -5057,7 +5100,7 @@
    */
   core.String kind;
 
-  /** Not documented yet. */
+  /** The token for the retrieval of the next page of products. */
   core.String nextPageToken;
 
   /** Not documented yet. */
@@ -5096,7 +5139,7 @@
 
 /** Not documented yet. */
 class ProductstatusesCustomBatchRequest {
-  /** Not documented yet. */
+  /** The request entries to be processed in the batch. */
   core.List<ProductstatusesCustomBatchRequestEntry> entries;
 
 
@@ -5129,7 +5172,7 @@
   /** The ID of the managing account. */
   core.String merchantId;
 
-  /** The method (get). */
+  /** Not documented yet. */
   core.String method;
 
   /** The ID of the product whose status to get. */
@@ -5174,7 +5217,7 @@
 
 /** Not documented yet. */
 class ProductstatusesCustomBatchResponse {
-  /** Not documented yet. */
+  /** The result of the execution of the batch requests. */
   core.List<ProductstatusesCustomBatchResponseEntry> entries;
 
   /**
@@ -5275,7 +5318,7 @@
    */
   core.String kind;
 
-  /** Not documented yet. */
+  /** The token for the retrieval of the next page of products statuses. */
   core.String nextPageToken;
 
   /** Not documented yet. */
diff --git a/generated/googleapis/lib/doubleclicksearch/v2.dart b/generated/googleapis/lib/doubleclicksearch/v2.dart
index 07bb356..2b6ef70 100644
--- a/generated/googleapis/lib/doubleclicksearch/v2.dart
+++ b/generated/googleapis/lib/doubleclicksearch/v2.dart
@@ -749,7 +749,10 @@
   /** The segmentation type of this conversion (for example, FLOODLIGHT). */
   core.String segmentationType;
 
-  /** The state of the conversion, that is, either ACTIVE or DELETED. */
+  /**
+   * The state of the conversion, that is, either ACTIVE or REMOVED. Note: state
+   * DELETED is deprecated.
+   */
   core.String state;
 
   /**
@@ -1186,8 +1189,8 @@
   core.String customDimensionName;
 
   /**
-   * Reports on the provided custom metric. The report must be scoped to an
-   * advertiser or lower, and the custom metric must already be set up in
+   * Name of a custom metric to include in the report. The report must be scoped
+   * to an advertiser or lower, and the custom metric must already be set up in
    * DoubleClick Search. The custom metric name, which appears in DoubleClick
    * Search, is case sensitive.
    */
diff --git a/generated/googleapis/lib/drive/v2.dart b/generated/googleapis/lib/drive/v2.dart
index 042f969..ca24a7d 100644
--- a/generated/googleapis/lib/drive/v2.dart
+++ b/generated/googleapis/lib/drive/v2.dart
@@ -1155,6 +1155,9 @@
    *
    * [fileId] - The ID for the file in question.
    *
+   * [acknowledgeAbuse] - Whether the user is acknowledging the risk of
+   * downloading known malware or other abusive files.
+   *
    * [projection] - This parameter is deprecated and has no function.
    * Possible string values are:
    * - "BASIC" : Deprecated
@@ -1163,7 +1166,15 @@
    * [updateViewedDate] - Whether to update the view date after successfully
    * retrieving the file.
    *
-   * Completes with a [File].
+   * [downloadOptions] - Options for downloading. A download can be either a
+   * Metadata (default) or Media download. Partial Media downloads are possible
+   * as well.
+   *
+   * Completes with a
+   *
+   * - [File] for Metadata downloads (see [downloadOptions]).
+   *
+   * - [common.Media] for Media downloads (see [downloadOptions]).
    *
    * Completes with a [common.ApiRequestError] if the API endpoint returned an
    * error.
@@ -1171,7 +1182,7 @@
    * If the used [http.Client] completes with an error when making a REST call,
    * this method  will complete with the same error.
    */
-  async.Future<File> get(core.String fileId, {core.String projection, core.bool updateViewedDate}) {
+  async.Future get(core.String fileId, {core.bool acknowledgeAbuse, core.String projection, core.bool updateViewedDate, common.DownloadOptions downloadOptions: common.DownloadOptions.Metadata}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1182,6 +1193,9 @@
     if (fileId == null) {
       throw new core.ArgumentError("Parameter fileId is required.");
     }
+    if (acknowledgeAbuse != null) {
+      _queryParams["acknowledgeAbuse"] = ["${acknowledgeAbuse}"];
+    }
     if (projection != null) {
       _queryParams["projection"] = [projection];
     }
@@ -1189,6 +1203,7 @@
       _queryParams["updateViewedDate"] = ["${updateViewedDate}"];
     }
 
+    _downloadOptions = downloadOptions;
 
     _url = 'files/' + common_internal.Escaper.ecapeVariable('$fileId');
 
@@ -1199,7 +1214,12 @@
                                        uploadOptions: _uploadOptions,
                                        uploadMedia: _uploadMedia,
                                        downloadOptions: _downloadOptions);
-    return _response.then((data) => new File.fromJson(data));
+    if (_downloadOptions == null ||
+        _downloadOptions == common.DownloadOptions.Metadata) {
+      return _response.then((data) => new File.fromJson(data));
+    } else {
+      return _response;
+    }
   }
 
   /**
@@ -1739,6 +1759,9 @@
    *
    * [fileId] - The ID for the file in question.
    *
+   * [acknowledgeAbuse] - Whether the user is acknowledging the risk of
+   * downloading known malware or other abusive files.
+   *
    * [projection] - This parameter is deprecated and has no function.
    * Possible string values are:
    * - "BASIC" : Deprecated
@@ -1747,7 +1770,15 @@
    * [updateViewedDate] - Whether to update the view date after successfully
    * retrieving the file.
    *
-   * Completes with a [Channel].
+   * [downloadOptions] - Options for downloading. A download can be either a
+   * Metadata (default) or Media download. Partial Media downloads are possible
+   * as well.
+   *
+   * Completes with a
+   *
+   * - [Channel] for Metadata downloads (see [downloadOptions]).
+   *
+   * - [common.Media] for Media downloads (see [downloadOptions]).
    *
    * Completes with a [common.ApiRequestError] if the API endpoint returned an
    * error.
@@ -1755,7 +1786,7 @@
    * If the used [http.Client] completes with an error when making a REST call,
    * this method  will complete with the same error.
    */
-  async.Future<Channel> watch(Channel request, core.String fileId, {core.String projection, core.bool updateViewedDate}) {
+  async.Future watch(Channel request, core.String fileId, {core.bool acknowledgeAbuse, core.String projection, core.bool updateViewedDate, common.DownloadOptions downloadOptions: common.DownloadOptions.Metadata}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1769,6 +1800,9 @@
     if (fileId == null) {
       throw new core.ArgumentError("Parameter fileId is required.");
     }
+    if (acknowledgeAbuse != null) {
+      _queryParams["acknowledgeAbuse"] = ["${acknowledgeAbuse}"];
+    }
     if (projection != null) {
       _queryParams["projection"] = [projection];
     }
@@ -1776,6 +1810,7 @@
       _queryParams["updateViewedDate"] = ["${updateViewedDate}"];
     }
 
+    _downloadOptions = downloadOptions;
 
     _url = 'files/' + common_internal.Escaper.ecapeVariable('$fileId') + '/watch';
 
@@ -1786,7 +1821,12 @@
                                        uploadOptions: _uploadOptions,
                                        uploadMedia: _uploadMedia,
                                        downloadOptions: _downloadOptions);
-    return _response.then((data) => new Channel.fromJson(data));
+    if (_downloadOptions == null ||
+        _downloadOptions == common.DownloadOptions.Metadata) {
+      return _response.then((data) => new Channel.fromJson(data));
+    } else {
+      return _response;
+    }
   }
 
 }
diff --git a/generated/googleapis/lib/fitness/v1.dart b/generated/googleapis/lib/fitness/v1.dart
new file mode 100644
index 0000000..c4c63dc
--- /dev/null
+++ b/generated/googleapis/lib/fitness/v1.dart
@@ -0,0 +1,1514 @@
+library googleapis.fitness.v1;
+
+import "dart:core" as core;
+import "dart:collection" as collection;
+import "dart:async" as async;
+import "dart:convert" as convert;
+
+import "package:crypto/crypto.dart" as crypto;
+import 'package:http/http.dart' as http;
+import '../src/common_internal.dart' as common_internal;
+import '../common/common.dart' as common;
+
+export '../common/common.dart' show ApiRequestError;
+export '../common/common.dart' show DetailedApiRequestError;
+
+/** Google Fit API */
+class FitnessApi {
+  /** View your activity information in Google Fit */
+  static const FitnessActivityReadScope = "https://www.googleapis.com/auth/fitness.activity.read";
+
+  /** View and store your activity information in Google Fit */
+  static const FitnessActivityWriteScope = "https://www.googleapis.com/auth/fitness.activity.write";
+
+  /** View body sensor information in Google Fit */
+  static const FitnessBodyReadScope = "https://www.googleapis.com/auth/fitness.body.read";
+
+  /** View and store body sensor data in Google Fit */
+  static const FitnessBodyWriteScope = "https://www.googleapis.com/auth/fitness.body.write";
+
+  /** View your stored location data in Google Fit */
+  static const FitnessLocationReadScope = "https://www.googleapis.com/auth/fitness.location.read";
+
+  /** View and store your location data in Google Fit */
+  static const FitnessLocationWriteScope = "https://www.googleapis.com/auth/fitness.location.write";
+
+
+  final common_internal.ApiRequester _requester;
+
+  UsersResourceApi get users => new UsersResourceApi(_requester);
+
+  FitnessApi(http.Client client) : 
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "fitness/v1/users/");
+}
+
+
+/** Not documented yet. */
+class UsersResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  UsersDataSourcesResourceApi get dataSources => new UsersDataSourcesResourceApi(_requester);
+  UsersSessionsResourceApi get sessions => new UsersSessionsResourceApi(_requester);
+
+  UsersResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+}
+
+
+/** Not documented yet. */
+class UsersDataSourcesResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  UsersDataSourcesDatasetsResourceApi get datasets => new UsersDataSourcesDatasetsResourceApi(_requester);
+
+  UsersDataSourcesResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Creates a new data source that is unique across all data sources belonging
+   * to this user. The data stream ID field can be omitted and will be generated
+   * by the server with the correct format. The data stream ID is an ordered
+   * combination of some fields from the data source. In addition to the data
+   * source fields reflected into the data source ID, the developer project
+   * number that is authenticated when creating the data source is included.
+   * This developer project number is obfuscated when read by any other
+   * developer reading public data types.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [userId] - Create the data source for the person identified. Use me to
+   * indicate the authenticated user. Only me is supported at this time.
+   *
+   * Completes with a [DataSource].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<DataSource> create(DataSource request, core.String userId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (userId == null) {
+      throw new core.ArgumentError("Parameter userId is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$userId') + '/dataSources';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new DataSource.fromJson(data));
+  }
+
+  /**
+   * Returns a data source identified by a data stream ID.
+   *
+   * Request parameters:
+   *
+   * [userId] - Retrieve a data source for the person identified. Use me to
+   * indicate the authenticated user. Only me is supported at this time.
+   *
+   * [dataSourceId] - The data stream ID of the data source to retrieve.
+   *
+   * Completes with a [DataSource].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<DataSource> get(core.String userId, core.String dataSourceId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (userId == null) {
+      throw new core.ArgumentError("Parameter userId is required.");
+    }
+    if (dataSourceId == null) {
+      throw new core.ArgumentError("Parameter dataSourceId is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$userId') + '/dataSources/' + common_internal.Escaper.ecapeVariable('$dataSourceId');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new DataSource.fromJson(data));
+  }
+
+  /**
+   * Lists all data sources that are visible to the developer, using the OAuth
+   * scopes provided. The list is not exhaustive: the user may have private data
+   * sources that are only visible to other developers or calls using other
+   * scopes.
+   *
+   * Request parameters:
+   *
+   * [userId] - List data sources for the person identified. Use me to indicate
+   * the authenticated user. Only me is supported at this time.
+   *
+   * [dataTypeName] - The names of data types to include in the list. If not
+   * specified, all data sources will be returned.
+   *
+   * Completes with a [ListDataSourcesResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ListDataSourcesResponse> list(core.String userId, {core.List<core.String> dataTypeName}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (userId == null) {
+      throw new core.ArgumentError("Parameter userId is required.");
+    }
+    if (dataTypeName != null) {
+      _queryParams["dataTypeName"] = dataTypeName;
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$userId') + '/dataSources';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListDataSourcesResponse.fromJson(data));
+  }
+
+  /**
+   * Updates a given data source. It is an error to modify the data source's
+   * data stream ID, data type, type, stream name or device information apart
+   * from the device version. Changing these fields would require a new unique
+   * data stream ID and separate data source.
+   *
+   * Data sources are identified by their data stream ID. This method supports
+   * patch semantics.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [userId] - Update the data source for the person identified. Use me to
+   * indicate the authenticated user. Only me is supported at this time.
+   *
+   * [dataSourceId] - The data stream ID of the data source to update.
+   *
+   * Completes with a [DataSource].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<DataSource> patch(DataSource request, core.String userId, core.String dataSourceId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (userId == null) {
+      throw new core.ArgumentError("Parameter userId is required.");
+    }
+    if (dataSourceId == null) {
+      throw new core.ArgumentError("Parameter dataSourceId is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$userId') + '/dataSources/' + common_internal.Escaper.ecapeVariable('$dataSourceId');
+
+    var _response = _requester.request(_url,
+                                       "PATCH",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new DataSource.fromJson(data));
+  }
+
+  /**
+   * Updates a given data source. It is an error to modify the data source's
+   * data stream ID, data type, type, stream name or device information apart
+   * from the device version. Changing these fields would require a new unique
+   * data stream ID and separate data source.
+   *
+   * Data sources are identified by their data stream ID.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [userId] - Update the data source for the person identified. Use me to
+   * indicate the authenticated user. Only me is supported at this time.
+   *
+   * [dataSourceId] - The data stream ID of the data source to update.
+   *
+   * Completes with a [DataSource].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<DataSource> update(DataSource request, core.String userId, core.String dataSourceId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (userId == null) {
+      throw new core.ArgumentError("Parameter userId is required.");
+    }
+    if (dataSourceId == null) {
+      throw new core.ArgumentError("Parameter dataSourceId is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$userId') + '/dataSources/' + common_internal.Escaper.ecapeVariable('$dataSourceId');
+
+    var _response = _requester.request(_url,
+                                       "PUT",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new DataSource.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class UsersDataSourcesDatasetsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  UsersDataSourcesDatasetsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Performs an inclusive delete of all data points whose start and end times
+   * have any overlap with the time range specified by the dataset ID. For most
+   * data types, the entire data point will be deleted. For data types where the
+   * time span represents a consistent value (such as
+   * com.google.activity.segment), and a data point straddles either end point
+   * of the dataset, only the overlapping portion of the data point will be
+   * deleted.
+   *
+   * Request parameters:
+   *
+   * [userId] - Delete a dataset for the person identified. Use me to indicate
+   * the authenticated user. Only me is supported at this time.
+   *
+   * [dataSourceId] - The data stream ID of the data source that created the
+   * dataset.
+   *
+   * [datasetId] - Dataset identifier that is a composite of the minimum data
+   * point start time and maximum data point end time represented as nanoseconds
+   * from the epoch. The ID is formatted like: "startTime-endTime" where
+   * startTime and endTime are 64 bit integers.
+   *
+   * [currentTimeMillis] - The client's current time in milliseconds since
+   * epoch.
+   *
+   * [modifiedTimeMillis] - When the operation was performed on the client.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future delete(core.String userId, core.String dataSourceId, core.String datasetId, {core.String currentTimeMillis, core.String modifiedTimeMillis}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (userId == null) {
+      throw new core.ArgumentError("Parameter userId is required.");
+    }
+    if (dataSourceId == null) {
+      throw new core.ArgumentError("Parameter dataSourceId is required.");
+    }
+    if (datasetId == null) {
+      throw new core.ArgumentError("Parameter datasetId is required.");
+    }
+    if (currentTimeMillis != null) {
+      _queryParams["currentTimeMillis"] = [currentTimeMillis];
+    }
+    if (modifiedTimeMillis != null) {
+      _queryParams["modifiedTimeMillis"] = [modifiedTimeMillis];
+    }
+
+    _downloadOptions = null;
+
+    _url = common_internal.Escaper.ecapeVariable('$userId') + '/dataSources/' + common_internal.Escaper.ecapeVariable('$dataSourceId') + '/datasets/' + common_internal.Escaper.ecapeVariable('$datasetId');
+
+    var _response = _requester.request(_url,
+                                       "DELETE",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Returns a dataset containing all data points whose start and end times
+   * overlap with the specified range of the dataset minimum start time and
+   * maximum end time. Specifically, any data point whose start time is less
+   * than or equal to the dataset end time and whose end time is greater than or
+   * equal to the dataset start time.
+   *
+   * Request parameters:
+   *
+   * [userId] - Retrieve a dataset for the person identified. Use me to indicate
+   * the authenticated user. Only me is supported at this time.
+   *
+   * [dataSourceId] - The data stream ID of the data source that created the
+   * dataset.
+   *
+   * [datasetId] - Dataset identifier that is a composite of the minimum data
+   * point start time and maximum data point end time represented as nanoseconds
+   * from the epoch. The ID is formatted like: "startTime-endTime" where
+   * startTime and endTime are 64 bit integers.
+   *
+   * Completes with a [Dataset].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Dataset> get(core.String userId, core.String dataSourceId, core.String datasetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (userId == null) {
+      throw new core.ArgumentError("Parameter userId is required.");
+    }
+    if (dataSourceId == null) {
+      throw new core.ArgumentError("Parameter dataSourceId is required.");
+    }
+    if (datasetId == null) {
+      throw new core.ArgumentError("Parameter datasetId is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$userId') + '/dataSources/' + common_internal.Escaper.ecapeVariable('$dataSourceId') + '/datasets/' + common_internal.Escaper.ecapeVariable('$datasetId');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Dataset.fromJson(data));
+  }
+
+  /**
+   * Adds data points to a dataset. The dataset need not be previously created.
+   * All points within the given dataset will be returned with subsquent calls
+   * to retrieve this dataset. Data points can belong to more than one dataset.
+   * This method does not use patch semantics.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [userId] - Patch a dataset for the person identified. Use me to indicate
+   * the authenticated user. Only me is supported at this time.
+   *
+   * [dataSourceId] - The data stream ID of the data source that created the
+   * dataset.
+   *
+   * [datasetId] - Dataset identifier that is a composite of the minimum data
+   * point start time and maximum data point end time represented as nanoseconds
+   * from the epoch. The ID is formatted like: "startTime-endTime" where
+   * startTime and endTime are 64 bit integers.
+   *
+   * [currentTimeMillis] - The client's current time in milliseconds since
+   * epoch. Note that the minStartTimeNs and maxEndTimeNs properties in the
+   * request body are in nanoseconds instead of milliseconds.
+   *
+   * Completes with a [Dataset].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Dataset> patch(Dataset request, core.String userId, core.String dataSourceId, core.String datasetId, {core.String currentTimeMillis}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (userId == null) {
+      throw new core.ArgumentError("Parameter userId is required.");
+    }
+    if (dataSourceId == null) {
+      throw new core.ArgumentError("Parameter dataSourceId is required.");
+    }
+    if (datasetId == null) {
+      throw new core.ArgumentError("Parameter datasetId is required.");
+    }
+    if (currentTimeMillis != null) {
+      _queryParams["currentTimeMillis"] = [currentTimeMillis];
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$userId') + '/dataSources/' + common_internal.Escaper.ecapeVariable('$dataSourceId') + '/datasets/' + common_internal.Escaper.ecapeVariable('$datasetId');
+
+    var _response = _requester.request(_url,
+                                       "PATCH",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Dataset.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class UsersSessionsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  UsersSessionsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Deletes a session specified by the given session ID.
+   *
+   * Request parameters:
+   *
+   * [userId] - Delete a session for the person identified. Use me to indicate
+   * the authenticated user. Only me is supported at this time.
+   *
+   * [sessionId] - The ID of the session to be deleted.
+   *
+   * [currentTimeMillis] - The client's current time in milliseconds since
+   * epoch.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future delete(core.String userId, core.String sessionId, {core.String currentTimeMillis}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (userId == null) {
+      throw new core.ArgumentError("Parameter userId is required.");
+    }
+    if (sessionId == null) {
+      throw new core.ArgumentError("Parameter sessionId is required.");
+    }
+    if (currentTimeMillis != null) {
+      _queryParams["currentTimeMillis"] = [currentTimeMillis];
+    }
+
+    _downloadOptions = null;
+
+    _url = common_internal.Escaper.ecapeVariable('$userId') + '/sessions/' + common_internal.Escaper.ecapeVariable('$sessionId');
+
+    var _response = _requester.request(_url,
+                                       "DELETE",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Lists sessions previously created.
+   *
+   * Request parameters:
+   *
+   * [userId] - List sessions for the person identified. Use me to indicate the
+   * authenticated user. Only me is supported at this time.
+   *
+   * [endTime] - An RFC3339 timestamp. Only sessions ending between the start
+   * and end times will be included in the response.
+   *
+   * [includeDeleted] - If true, deleted sessions will be returned. When set to
+   * true, sessions returned in this response will only have an ID and will not
+   * have any other fields.
+   *
+   * [pageToken] - The continuation token, which is used to page through large
+   * result sets. To get the next page of results, set this parameter to the
+   * value of nextPageToken from the previous response.
+   *
+   * [startTime] - An RFC3339 timestamp. Only sessions ending between the start
+   * and end times will be included in the response.
+   *
+   * Completes with a [ListSessionsResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ListSessionsResponse> list(core.String userId, {core.String endTime, core.bool includeDeleted, core.String pageToken, core.String startTime}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (userId == null) {
+      throw new core.ArgumentError("Parameter userId is required.");
+    }
+    if (endTime != null) {
+      _queryParams["endTime"] = [endTime];
+    }
+    if (includeDeleted != null) {
+      _queryParams["includeDeleted"] = ["${includeDeleted}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (startTime != null) {
+      _queryParams["startTime"] = [startTime];
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$userId') + '/sessions';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListSessionsResponse.fromJson(data));
+  }
+
+  /**
+   * Updates or insert a given session.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [userId] - Create sessions for the person identified. Use me to indicate
+   * the authenticated user. Only me is supported at this time.
+   *
+   * [sessionId] - The ID of the session to be created.
+   *
+   * [currentTimeMillis] - The client's current time in milliseconds since
+   * epoch.
+   *
+   * Completes with a [Session].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Session> update(Session request, core.String userId, core.String sessionId, {core.String currentTimeMillis}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (userId == null) {
+      throw new core.ArgumentError("Parameter userId is required.");
+    }
+    if (sessionId == null) {
+      throw new core.ArgumentError("Parameter sessionId is required.");
+    }
+    if (currentTimeMillis != null) {
+      _queryParams["currentTimeMillis"] = [currentTimeMillis];
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$userId') + '/sessions/' + common_internal.Escaper.ecapeVariable('$sessionId');
+
+    var _response = _requester.request(_url,
+                                       "PUT",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Session.fromJson(data));
+  }
+
+}
+
+
+
+/**
+ * See: google3/java/com/google/android/apps/heart/platform/api/Application.java
+ */
+class Application {
+  /** An optional URI that can be used to link back to the application. */
+  core.String detailsUrl;
+
+  /**
+   * The name of this application. This is required for REST clients, but we do
+   * not enforce uniqueness of this name. It is provided as a matter of
+   * convenience for other developers who would like to identify which REST
+   * created an Application or Data Source.
+   */
+  core.String name;
+
+  /**
+   * Package name for this application. This is used as a unique identifier when
+   * creaed by Android applications, but cannot be specified by REST clients.
+   * REST clients will have their developer project number reflected into the
+   * Data Source data stream IDs, instead of the packageName.
+   */
+  core.String packageName;
+
+  /**
+   * Version of the application. You should update this field whenever the
+   * application changes in a way that affects the computation of the data.
+   */
+  core.String version;
+
+
+  Application();
+
+  Application.fromJson(core.Map _json) {
+    if (_json.containsKey("detailsUrl")) {
+      detailsUrl = _json["detailsUrl"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("packageName")) {
+      packageName = _json["packageName"];
+    }
+    if (_json.containsKey("version")) {
+      version = _json["version"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (detailsUrl != null) {
+      _json["detailsUrl"] = detailsUrl;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (packageName != null) {
+      _json["packageName"] = packageName;
+    }
+    if (version != null) {
+      _json["version"] = version;
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * Represents a single data point, generated by a particular data source. A data
+ * point holds a value for each field, an end timestamp and an optional start
+ * time. The exact semantics of each of these attributes are specified in the
+ * documentation for the particular data type.
+ *
+ * A data point can represent an instantaneous measurement, reading or input
+ * observation, as well as averages or aggregates over a time interval. Check
+ * the data type documentation to determine which is the case for a particular
+ * data type.
+ *
+ * Data points always contain one value for each field of the data type.
+ */
+class DataPoint {
+  /**
+   * Used for version checking during transformation; that is, a datapoint can
+   * only replace another datapoint that has an older computation time stamp.
+   */
+  core.String computationTimeMillis;
+
+  /** The data type defining the format of the values in this data point. */
+  core.String dataTypeName;
+
+  /**
+   * The end time of the interval represented by this data point, in nanoseconds
+   * since epoch.
+   */
+  core.String endTimeNanos;
+
+  /**
+   * Indicates the last time this data point was modified. Useful only in
+   * contexts where we are listing the data changes, rather than representing
+   * the current state of the data.
+   */
+  core.String modifiedTimeMillis;
+
+  /**
+   * If the data point is contained in a dataset for a derived data source, this
+   * field will be populated with the data source stream ID that created the
+   * data point originally.
+   */
+  core.String originDataSourceId;
+
+  /** The raw timestamp from the original SensorEvent. */
+  core.String rawTimestampNanos;
+
+  /**
+   * The start time of the interval represented by this data point, in
+   * nanoseconds since epoch.
+   */
+  core.String startTimeNanos;
+
+  /**
+   * Values of each data type field for the data point. It is expected that each
+   * value corresponding to a data type field will occur in the same order that
+   * the field is listed with in the data type specified in a data source.
+   *
+   * Only one of integer and floating point fields will be populated, depending
+   * on the format enum value within data source's type field.
+   */
+  core.List<Value> value;
+
+
+  DataPoint();
+
+  DataPoint.fromJson(core.Map _json) {
+    if (_json.containsKey("computationTimeMillis")) {
+      computationTimeMillis = _json["computationTimeMillis"];
+    }
+    if (_json.containsKey("dataTypeName")) {
+      dataTypeName = _json["dataTypeName"];
+    }
+    if (_json.containsKey("endTimeNanos")) {
+      endTimeNanos = _json["endTimeNanos"];
+    }
+    if (_json.containsKey("modifiedTimeMillis")) {
+      modifiedTimeMillis = _json["modifiedTimeMillis"];
+    }
+    if (_json.containsKey("originDataSourceId")) {
+      originDataSourceId = _json["originDataSourceId"];
+    }
+    if (_json.containsKey("rawTimestampNanos")) {
+      rawTimestampNanos = _json["rawTimestampNanos"];
+    }
+    if (_json.containsKey("startTimeNanos")) {
+      startTimeNanos = _json["startTimeNanos"];
+    }
+    if (_json.containsKey("value")) {
+      value = _json["value"].map((value) => new Value.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (computationTimeMillis != null) {
+      _json["computationTimeMillis"] = computationTimeMillis;
+    }
+    if (dataTypeName != null) {
+      _json["dataTypeName"] = dataTypeName;
+    }
+    if (endTimeNanos != null) {
+      _json["endTimeNanos"] = endTimeNanos;
+    }
+    if (modifiedTimeMillis != null) {
+      _json["modifiedTimeMillis"] = modifiedTimeMillis;
+    }
+    if (originDataSourceId != null) {
+      _json["originDataSourceId"] = originDataSourceId;
+    }
+    if (rawTimestampNanos != null) {
+      _json["rawTimestampNanos"] = rawTimestampNanos;
+    }
+    if (startTimeNanos != null) {
+      _json["startTimeNanos"] = startTimeNanos;
+    }
+    if (value != null) {
+      _json["value"] = value.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * Definition of a unique source of sensor data. Data sources can expose raw
+ * data coming from hardware sensors on local or companion devices. They can
+ * also expose derived data, created by transforming or merging other data
+ * sources. Multiple data sources can exist for the same data type. Every data
+ * point inserted into or read from this service has an associated data source.
+ *
+ * The data source contains enough information to uniquely identify its data,
+ * including the hardware device and the application that collected and/or
+ * transformed the data. It also holds useful metadata, such as the hardware and
+ * application versions, and the device type.
+ *
+ * Each data source produces a unique stream of data, with a unique identifier.
+ * Not all changes to data source affect the stream identifier, so that data
+ * collected by updated versions of the same application/device can still be
+ * considered to belong to the same data stream.
+ */
+class DataSource {
+  /**
+   * Information about an application which feeds sensor data into the platform.
+   */
+  Application application;
+
+  /**
+   * A unique identifier for the data stream produced by this data source. The
+   * identifier includes:
+   *
+   *
+   * - The physical device's manufacturer, model, and serial number (UID).
+   * - The application's package name or name. Package name is used when the
+   * data source was created by an Android application. The developer project
+   * number is used when the data source was created by a REST client.
+   * - The data source's type.
+   * - The data source's stream name.  Note that not all attributes of the data
+   * source are used as part of the stream identifier. In particular, the
+   * version of the hardware/the application isn't used. This allows us to
+   * preserve the same stream through version updates. This also means that two
+   * DataSource objects may represent the same data stream even if they're not
+   * equal.
+   *
+   * The exact format of the data stream ID created by an Android application
+   * is:
+   * type:dataType.name:application.packageName:device.manufacturer:device.model:device.uid:dataStreamName
+   *
+   * The exact format of the data stream ID created by a REST client is:
+   * type:dataType.name:developer project
+   * number:device.manufacturer:device.model:device.uid:dataStreamName
+   *
+   * When any of the optional fields that comprise of the data stream ID are
+   * blank, they will be omitted from the data stream ID. The minnimum viable
+   * data stream ID would be: type:dataType.name:developer project number
+   *
+   * Finally, the developer project number is obfuscated when read by any REST
+   * or Android client that did not create the data source. Only the data source
+   * creator will see the developer project number in clear and normal form.
+   */
+  core.String dataStreamId;
+
+  /**
+   * The stream name uniquely identifies this particular data source among other
+   * data sources of the same type from the same underlying producer. Setting
+   * the stream name is optional, but should be done whenever an application
+   * exposes two streams for the same data type, or when a device has two
+   * equivalent sensors.
+   */
+  core.String dataStreamName;
+
+  /**
+   * The data type defines the schema for a stream of data being collected by,
+   * inserted into, or queried from the Fitness API.
+   */
+  DataType dataType;
+
+  /**
+   * Representation of an integrated device (such as a phone or a wearable) that
+   * can hold sensors.
+   */
+  Device device;
+
+  /** An end-user visible name for this data source. */
+  core.String name;
+
+  /**
+   * A constant describing the type of this data source. Indicates whether this
+   * data source produces raw or derived data.
+   * Possible string values are:
+   * - "derived"
+   * - "raw"
+   */
+  core.String type;
+
+
+  DataSource();
+
+  DataSource.fromJson(core.Map _json) {
+    if (_json.containsKey("application")) {
+      application = new Application.fromJson(_json["application"]);
+    }
+    if (_json.containsKey("dataStreamId")) {
+      dataStreamId = _json["dataStreamId"];
+    }
+    if (_json.containsKey("dataStreamName")) {
+      dataStreamName = _json["dataStreamName"];
+    }
+    if (_json.containsKey("dataType")) {
+      dataType = new DataType.fromJson(_json["dataType"]);
+    }
+    if (_json.containsKey("device")) {
+      device = new Device.fromJson(_json["device"]);
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (application != null) {
+      _json["application"] = (application).toJson();
+    }
+    if (dataStreamId != null) {
+      _json["dataStreamId"] = dataStreamId;
+    }
+    if (dataStreamName != null) {
+      _json["dataStreamName"] = dataStreamName;
+    }
+    if (dataType != null) {
+      _json["dataType"] = (dataType).toJson();
+    }
+    if (device != null) {
+      _json["device"] = (device).toJson();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * See: google3/java/com/google/android/apps/heart/platform/api/DataType.java
+ */
+class DataType {
+  /** A field represents one dimension of a data type. */
+  core.List<DataTypeField> field;
+
+  /**
+   * Each data type has a unique, namespaced, name. All data types in the
+   * com.google namespace are shared as part of the platform.
+   */
+  core.String name;
+
+
+  DataType();
+
+  DataType.fromJson(core.Map _json) {
+    if (_json.containsKey("field")) {
+      field = _json["field"].map((value) => new DataTypeField.fromJson(value)).toList();
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (field != null) {
+      _json["field"] = field.map((value) => (value).toJson()).toList();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * In case of multi-dimensional data (such as an accelerometer with x, y, and z
+ * axes) each field represents one dimension. Each data type field has a unique
+ * name which identifies it. The field also defines the format of the data (int,
+ * float, etc.).
+ *
+ * This message is only instantiated in code and not used for wire comms or
+ * stored in any way.
+ */
+class DataTypeField {
+  /**
+   * The different supported formats for each field in a data type.
+   * Possible string values are:
+   * - "floatPoint"
+   * - "integer"
+   */
+  core.String format;
+
+  /**
+   * Defines the name and format of data. Unlike data type names, field names
+   * are not namespaced, and only need to be unique within the data type.
+   */
+  core.String name;
+
+
+  DataTypeField();
+
+  DataTypeField.fromJson(core.Map _json) {
+    if (_json.containsKey("format")) {
+      format = _json["format"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (format != null) {
+      _json["format"] = format;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * A dataset represents a projection container for data points. They do not
+ * carry any info of their own. Datasets represent a set of data points from a
+ * particular data source. A data point can be found in more than one dataset.
+ */
+class Dataset {
+  /**
+   * The data stream ID of the data source that created the points in this
+   * dataset.
+   */
+  core.String dataSourceId;
+
+  /**
+   * The largest end time of all data points in this possibly partial
+   * representation of the dataset. Time is in nanoseconds from epoch. This
+   * should also match the first part of the dataset identifier.
+   */
+  core.String maxEndTimeNs;
+
+  /**
+   * The smallest start time of all data points in this possibly partial
+   * representation of the dataset. Time is in nanoseconds from epoch. This
+   * should also match the first part of the dataset identifier.
+   */
+  core.String minStartTimeNs;
+
+  /**
+   * A partial list of data points contained in the dataset. This list is
+   * considered complete when retrieving a dataset and partial when patching a
+   * dataset.
+   */
+  core.List<DataPoint> point;
+
+
+  Dataset();
+
+  Dataset.fromJson(core.Map _json) {
+    if (_json.containsKey("dataSourceId")) {
+      dataSourceId = _json["dataSourceId"];
+    }
+    if (_json.containsKey("maxEndTimeNs")) {
+      maxEndTimeNs = _json["maxEndTimeNs"];
+    }
+    if (_json.containsKey("minStartTimeNs")) {
+      minStartTimeNs = _json["minStartTimeNs"];
+    }
+    if (_json.containsKey("point")) {
+      point = _json["point"].map((value) => new DataPoint.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (dataSourceId != null) {
+      _json["dataSourceId"] = dataSourceId;
+    }
+    if (maxEndTimeNs != null) {
+      _json["maxEndTimeNs"] = maxEndTimeNs;
+    }
+    if (minStartTimeNs != null) {
+      _json["minStartTimeNs"] = minStartTimeNs;
+    }
+    if (point != null) {
+      _json["point"] = point.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * Representation of an integrated device (such as a phone or a wearable) that
+ * can hold sensors. Each sensor is exposed as a data source.
+ *
+ * The main purpose of the device information contained in this class is to
+ * identify the hardware of a particular data source. This can be useful in
+ * different ways, including:
+ * - Distinguishing two similar sensors on different devices (the step counter
+ * on two nexus 5 phones, for instance)
+ * - Display the source of data to the user (by using the device make / model)
+ * - Treat data differently depending on sensor type (accelerometers on a watch
+ * may give different patterns than those on a phone)
+ * - Build different analysis models for each device/version.
+ */
+class Device {
+  /** Manufacturer of the product/hardware. */
+  core.String manufacturer;
+
+  /** End-user visible model name for the device. */
+  core.String model;
+
+  /**
+   * A constant representing the type of the device.
+   * Possible string values are:
+   * - "chestStrap"
+   * - "phone"
+   * - "scale"
+   * - "tablet"
+   * - "unknown"
+   * - "watch"
+   */
+  core.String type;
+
+  /**
+   * The serial number or other unique ID for the hardware. This field is
+   * obfuscated when read by any REST or Android client that did not create the
+   * data source. Only the data source creator will see the uid field in clear
+   * and normal form.
+   */
+  core.String uid;
+
+  /** Version string for the device hardware/software. */
+  core.String version;
+
+
+  Device();
+
+  Device.fromJson(core.Map _json) {
+    if (_json.containsKey("manufacturer")) {
+      manufacturer = _json["manufacturer"];
+    }
+    if (_json.containsKey("model")) {
+      model = _json["model"];
+    }
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+    if (_json.containsKey("uid")) {
+      uid = _json["uid"];
+    }
+    if (_json.containsKey("version")) {
+      version = _json["version"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (manufacturer != null) {
+      _json["manufacturer"] = manufacturer;
+    }
+    if (model != null) {
+      _json["model"] = model;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    if (uid != null) {
+      _json["uid"] = uid;
+    }
+    if (version != null) {
+      _json["version"] = version;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class ListDataSourcesResponse {
+  /** A previously created data source. */
+  core.List<DataSource> dataSource;
+
+
+  ListDataSourcesResponse();
+
+  ListDataSourcesResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("dataSource")) {
+      dataSource = _json["dataSource"].map((value) => new DataSource.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (dataSource != null) {
+      _json["dataSource"] = dataSource.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class ListSessionsResponse {
+  /**
+   * If includeDeleted is set to true in the request, this list will contain
+   * sessions deleted with original end times that are within the startTime and
+   * endTime frame.
+   */
+  core.List<Session> deletedSession;
+
+  /**
+   * The continuation token, which is used to page through large result sets.
+   * Provide this value in a subsequent request to return the next page of
+   * results.
+   */
+  core.String nextPageToken;
+
+  /**
+   * Sessions with an end time that is between startTime and endTime of the
+   * request.
+   */
+  core.List<Session> session;
+
+
+  ListSessionsResponse();
+
+  ListSessionsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("deletedSession")) {
+      deletedSession = _json["deletedSession"].map((value) => new Session.fromJson(value)).toList();
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("session")) {
+      session = _json["session"].map((value) => new Session.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (deletedSession != null) {
+      _json["deletedSession"] = deletedSession.map((value) => (value).toJson()).toList();
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (session != null) {
+      _json["session"] = session.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * Sessions contain metadata, such as a user-friendly name and time interval
+ * information.
+ */
+class Session {
+  /** The type of activity this session represents. */
+  core.int activityType;
+
+  /** The application that created the session. */
+  Application application;
+
+  /** A description for this session. */
+  core.String description;
+
+  /** An end time, in milliseconds since epoch, inclusive. */
+  core.String endTimeMillis;
+
+  /**
+   * A client-generated identifier that is unique across all sessions owned by
+   * this particular user.
+   */
+  core.String id;
+
+  /** A timestamp that indicates when the session was last modified. */
+  core.String modifiedTimeMillis;
+
+  /** A human readable name of the session. */
+  core.String name;
+
+  /** A start time, in milliseconds since epoch, inclusive. */
+  core.String startTimeMillis;
+
+
+  Session();
+
+  Session.fromJson(core.Map _json) {
+    if (_json.containsKey("activityType")) {
+      activityType = _json["activityType"];
+    }
+    if (_json.containsKey("application")) {
+      application = new Application.fromJson(_json["application"]);
+    }
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("endTimeMillis")) {
+      endTimeMillis = _json["endTimeMillis"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("modifiedTimeMillis")) {
+      modifiedTimeMillis = _json["modifiedTimeMillis"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("startTimeMillis")) {
+      startTimeMillis = _json["startTimeMillis"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (activityType != null) {
+      _json["activityType"] = activityType;
+    }
+    if (application != null) {
+      _json["application"] = (application).toJson();
+    }
+    if (description != null) {
+      _json["description"] = description;
+    }
+    if (endTimeMillis != null) {
+      _json["endTimeMillis"] = endTimeMillis;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (modifiedTimeMillis != null) {
+      _json["modifiedTimeMillis"] = modifiedTimeMillis;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (startTimeMillis != null) {
+      _json["startTimeMillis"] = startTimeMillis;
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * Holder object for the value of a single field in a data point.
+ *
+ * A field value has a particular format and is only ever set to one of an
+ * integer or a floating point value.
+ */
+class Value {
+  /** Floating point value. */
+  core.double fpVal;
+
+  /** Integer value. */
+  core.int intVal;
+
+
+  Value();
+
+  Value.fromJson(core.Map _json) {
+    if (_json.containsKey("fpVal")) {
+      fpVal = _json["fpVal"];
+    }
+    if (_json.containsKey("intVal")) {
+      intVal = _json["intVal"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (fpVal != null) {
+      _json["fpVal"] = fpVal;
+    }
+    if (intVal != null) {
+      _json["intVal"] = intVal;
+    }
+    return _json;
+  }
+}
+
+
diff --git a/generated/googleapis/lib/games/v1.dart b/generated/googleapis/lib/games/v1.dart
index b58e0b9..0f694a9 100644
--- a/generated/googleapis/lib/games/v1.dart
+++ b/generated/googleapis/lib/games/v1.dart
@@ -435,7 +435,8 @@
    *
    * Request parameters:
    *
-   * [applicationId] - The application being requested.
+   * [applicationId] - The application ID from the Google Play developer
+   * console.
    *
    * [language] - The preferred language to use for strings returned by this
    * method.
@@ -8549,6 +8550,12 @@
    */
   core.String lastModifiedMillis;
 
+  /**
+   * The progress value (64-bit integer set by developer) associated with this
+   * snapshot.
+   */
+  core.String progressValue;
+
   /** The title of this snapshot. */
   core.String title;
 
@@ -8587,6 +8594,9 @@
     if (_json.containsKey("lastModifiedMillis")) {
       lastModifiedMillis = _json["lastModifiedMillis"];
     }
+    if (_json.containsKey("progressValue")) {
+      progressValue = _json["progressValue"];
+    }
     if (_json.containsKey("title")) {
       title = _json["title"];
     }
@@ -8621,6 +8631,9 @@
     if (lastModifiedMillis != null) {
       _json["lastModifiedMillis"] = lastModifiedMillis;
     }
+    if (progressValue != null) {
+      _json["progressValue"] = progressValue;
+    }
     if (title != null) {
       _json["title"] = title;
     }
diff --git a/generated/googleapis/lib/gamesmanagement/v1management.dart b/generated/googleapis/lib/gamesmanagement/v1management.dart
index a863fa6..607b411 100644
--- a/generated/googleapis/lib/gamesmanagement/v1management.dart
+++ b/generated/googleapis/lib/gamesmanagement/v1management.dart
@@ -204,8 +204,8 @@
   }
 
   /**
-   * Resets the achievement with the given IDs for all players. This method is
-   * only available to user accounts for your developer console. Only draft
+   * Resets achievements with the given IDs for all players. This method is only
+   * available to user accounts for your developer console. Only draft
    * achievements may be reset.
    *
    * [request] - The metadata request object.
@@ -260,7 +260,8 @@
    *
    * Request parameters:
    *
-   * [applicationId] - The application being requested.
+   * [applicationId] - The application ID from the Google Play developer
+   * console.
    *
    * [maxResults] - The maximum number of player resources to return in the
    * response, used for paging. For any response, the actual number of player
@@ -319,9 +320,10 @@
       _requester = client;
 
   /**
-   * Reset all player progress on the event for the currently authenticated
-   * player. This method is only accessible to whitelisted tester accounts for
-   * your application. All resources that use the event will also be reset.
+   * Resets all player progress on the event with the given ID for the currently
+   * authenticated player. This method is only accessible to whitelisted tester
+   * accounts for your application. All quests for this player that use the
+   * event will also be reset.
    *
    * Request parameters:
    *
@@ -360,10 +362,9 @@
   }
 
   /**
-   * Reset all player progress on all unpublished events for the currently
-   * authenticated player. This method is only accessible to whitelisted tester
-   * accounts for your application. All resources that use the events will also
-   * be reset.
+   * Resets all player progress on all events for the currently authenticated
+   * player. This method is only accessible to whitelisted tester accounts for
+   * your application. All quests for this player will also be reset.
    *
    * Request parameters:
    *
@@ -397,9 +398,45 @@
   }
 
   /**
-   * Reset all player progress on the event for all players. This method is only
+   * Resets all draft events for all players. This method is only available to
+   * user accounts for your developer console. All quests that use any of these
+   * events will also be reset.
+   *
+   * Request parameters:
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future resetAllForAllPlayers() {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+
+    _downloadOptions = null;
+
+    _url = 'events/resetAllForAllPlayers';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Resets the event with the given ID for all players. This method is only
    * available to user accounts for your developer console. Only draft events
-   * can be reset. All resources that use the event will also be reset.
+   * can be reset. All quests that use the event will also be reset.
    *
    * Request parameters:
    *
@@ -437,6 +474,47 @@
     return _response.then((data) => null);
   }
 
+  /**
+   * Resets events with the given IDs for all players. This method is only
+   * available to user accounts for your developer console. Only draft events
+   * may be reset. All quests that use any of the events will also be reset.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future resetMultipleForAllPlayers(EventsResetMultipleForAllRequest request) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+
+    _downloadOptions = null;
+
+    _url = 'events/resetMultipleForAllPlayers';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
 }
 
 
@@ -453,7 +531,8 @@
    *
    * Request parameters:
    *
-   * [applicationId] - The application being requested.
+   * [applicationId] - The application ID from the Google Play developer
+   * console.
    *
    * [playerId] - A player ID. A value of me may be used in place of the
    * authenticated player's ID.
@@ -499,7 +578,8 @@
    *
    * Request parameters:
    *
-   * [applicationId] - The application being requested.
+   * [applicationId] - The application ID from the Google Play developer
+   * console.
    *
    * [playerId] - A player ID. A value of me may be used in place of the
    * authenticated player's ID.
@@ -550,9 +630,9 @@
       _requester = client;
 
   /**
-   * Reset all player progress on the quest for the currently authenticated
-   * player. This method is only accessible to whitelisted tester accounts for
-   * your application.
+   * Resets all player progress on the quest with the given ID for the currently
+   * authenticated player. This method is only accessible to whitelisted tester
+   * accounts for your application.
    *
    * Request parameters:
    *
@@ -590,6 +670,159 @@
     return _response.then((data) => null);
   }
 
+  /**
+   * Resets all player progress on all quests for the currently authenticated
+   * player. This method is only accessible to whitelisted tester accounts for
+   * your application.
+   *
+   * Request parameters:
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future resetAll() {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+
+    _downloadOptions = null;
+
+    _url = 'quests/reset';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Resets all draft quests for all players. This method is only available to
+   * user accounts for your developer console.
+   *
+   * Request parameters:
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future resetAllForAllPlayers() {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+
+    _downloadOptions = null;
+
+    _url = 'quests/resetAllForAllPlayers';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Resets all player progress on the quest with the given ID for all players.
+   * This method is only available to user accounts for your developer console.
+   * Only draft quests can be reset.
+   *
+   * Request parameters:
+   *
+   * [questId] - The ID of the quest.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future resetForAllPlayers(core.String questId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (questId == null) {
+      throw new core.ArgumentError("Parameter questId is required.");
+    }
+
+    _downloadOptions = null;
+
+    _url = 'quests/' + common_internal.Escaper.ecapeVariable('$questId') + '/resetForAllPlayers';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Resets quests with the given IDs for all players. This method is only
+   * available to user accounts for your developer console. Only draft quests
+   * may be reset.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future resetMultipleForAllPlayers(QuestsResetMultipleForAllRequest request) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+
+    _downloadOptions = null;
+
+    _url = 'quests/resetMultipleForAllPlayers';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
 }
 
 
@@ -636,6 +869,42 @@
     return _response.then((data) => null);
   }
 
+  /**
+   * Deletes rooms where the only room participants are from whitelisted tester
+   * accounts for your application. This method is only available to user
+   * accounts for your developer console.
+   *
+   * Request parameters:
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future resetForAllPlayers() {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+
+    _downloadOptions = null;
+
+    _url = 'rooms/resetForAllPlayers';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
 }
 
 
@@ -647,9 +916,9 @@
       _requester = client;
 
   /**
-   * Reset scores for the specified leaderboard for the currently authenticated
-   * player. This method is only accessible to whitelisted tester accounts for
-   * your application.
+   * Resets scores for the leaderboard with the given ID for the currently
+   * authenticated player. This method is only accessible to whitelisted tester
+   * accounts for your application.
    *
    * Request parameters:
    *
@@ -689,9 +958,81 @@
   }
 
   /**
-   * Reset scores for the specified leaderboard for all players. This method is
-   * only available to user accounts for your developer console. Only draft
-   * leaderboards can be reset.
+   * Resets all scores for all leaderboards for the currently authenticated
+   * players. This method is only accessible to whitelisted tester accounts for
+   * your application.
+   *
+   * Request parameters:
+   *
+   * Completes with a [PlayerScoreResetAllResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<PlayerScoreResetAllResponse> resetAll() {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+
+
+    _url = 'scores/reset';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new PlayerScoreResetAllResponse.fromJson(data));
+  }
+
+  /**
+   * Resets scores for all draft leaderboards for all players. This method is
+   * only available to user accounts for your developer console.
+   *
+   * Request parameters:
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future resetAllForAllPlayers() {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+
+    _downloadOptions = null;
+
+    _url = 'scores/resetAllForAllPlayers';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Resets scores for the leaderboard with the given ID for all players. This
+   * method is only available to user accounts for your developer console. Only
+   * draft leaderboards can be reset.
    *
    * Request parameters:
    *
@@ -729,6 +1070,47 @@
     return _response.then((data) => null);
   }
 
+  /**
+   * Resets scores for the leaderboards with the given IDs for all players. This
+   * method is only available to user accounts for your developer console. Only
+   * draft leaderboards may be reset.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future resetMultipleForAllPlayers(ScoresResetMultipleForAllRequest request) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+
+    _downloadOptions = null;
+
+    _url = 'scores/resetMultipleForAllPlayers';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
 }
 
 
@@ -774,6 +1156,42 @@
     return _response.then((data) => null);
   }
 
+  /**
+   * Deletes turn-based matches where the only match participants are from
+   * whitelisted tester accounts for your application. This method is only
+   * available to user accounts for your developer console.
+   *
+   * Request parameters:
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future resetForAllPlayers() {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+
+    _downloadOptions = null;
+
+    _url = 'turnbasedmatches/resetForAllPlayers';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
 }
 
 
@@ -911,6 +1329,42 @@
 }
 
 
+/** This is a JSON template for multiple events reset all request. */
+class EventsResetMultipleForAllRequest {
+  /** The IDs of events to reset. */
+  core.List<core.String> eventIds;
+
+  /**
+   * Uniquely identifies the type of this resource. Value is always the fixed
+   * string gamesManagement#eventsResetMultipleForAllRequest.
+   */
+  core.String kind;
+
+
+  EventsResetMultipleForAllRequest();
+
+  EventsResetMultipleForAllRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("event_ids")) {
+      eventIds = _json["event_ids"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (eventIds != null) {
+      _json["event_ids"] = eventIds;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+
 /**
  * This is a JSON template for metadata about a player playing a game with the
  * currently authenticated user.
@@ -1284,8 +1738,47 @@
 }
 
 
+/** This is a JSON template for a list of leaderboard reset resources. */
+class PlayerScoreResetAllResponse {
+  /**
+   * Uniquely identifies the type of this resource. Value is always the fixed
+   * string gamesManagement#playerScoreResetResponse.
+   */
+  core.String kind;
+
+  /** The leaderboard reset results. */
+  core.List<PlayerScoreResetResponse> results;
+
+
+  PlayerScoreResetAllResponse();
+
+  PlayerScoreResetAllResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("results")) {
+      results = _json["results"].map((value) => new PlayerScoreResetResponse.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (results != null) {
+      _json["results"] = results.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
 /** This is a JSON template for a list of reset leaderboard entry resources. */
 class PlayerScoreResetResponse {
+  /** The ID of an leaderboard for which player state has been updated. */
+  core.String definitionId;
+
   /**
    * Uniquely identifies the type of this resource. Value is always the fixed
    * string gamesManagement#playerScoreResetResponse.
@@ -1305,6 +1798,9 @@
   PlayerScoreResetResponse();
 
   PlayerScoreResetResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("definitionId")) {
+      definitionId = _json["definitionId"];
+    }
     if (_json.containsKey("kind")) {
       kind = _json["kind"];
     }
@@ -1315,6 +1811,9 @@
 
   core.Map toJson() {
     var _json = new core.Map();
+    if (definitionId != null) {
+      _json["definitionId"] = definitionId;
+    }
     if (kind != null) {
       _json["kind"] = kind;
     }
@@ -1326,3 +1825,75 @@
 }
 
 
+/** This is a JSON template for multiple quests reset all request. */
+class QuestsResetMultipleForAllRequest {
+  /**
+   * Uniquely identifies the type of this resource. Value is always the fixed
+   * string gamesManagement#questsResetMultipleForAllRequest.
+   */
+  core.String kind;
+
+  /** The IDs of quests to reset. */
+  core.List<core.String> questIds;
+
+
+  QuestsResetMultipleForAllRequest();
+
+  QuestsResetMultipleForAllRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("quest_ids")) {
+      questIds = _json["quest_ids"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (questIds != null) {
+      _json["quest_ids"] = questIds;
+    }
+    return _json;
+  }
+}
+
+
+/** This is a JSON template for multiple scores reset all request. */
+class ScoresResetMultipleForAllRequest {
+  /**
+   * Uniquely identifies the type of this resource. Value is always the fixed
+   * string gamesManagement#scoresResetMultipleForAllRequest.
+   */
+  core.String kind;
+
+  /** The IDs of leaderboards to reset. */
+  core.List<core.String> leaderboardIds;
+
+
+  ScoresResetMultipleForAllRequest();
+
+  ScoresResetMultipleForAllRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("leaderboard_ids")) {
+      leaderboardIds = _json["leaderboard_ids"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (leaderboardIds != null) {
+      _json["leaderboard_ids"] = leaderboardIds;
+    }
+    return _json;
+  }
+}
+
+
diff --git a/generated/googleapis/lib/gmail/v1.dart b/generated/googleapis/lib/gmail/v1.dart
index 777f81a..1041eeb 100644
--- a/generated/googleapis/lib/gmail/v1.dart
+++ b/generated/googleapis/lib/gmail/v1.dart
@@ -1475,6 +1475,15 @@
    *
    * [id] - The ID of the thread to retrieve.
    *
+   * [format] - The format to return the messages in.
+   * Possible string values are:
+   * - "full"
+   * - "metadata"
+   * - "minimal"
+   *
+   * [metadataHeaders] - When given and format is METADATA, only include headers
+   * specified.
+   *
    * Completes with a [Thread].
    *
    * Completes with a [common.ApiRequestError] if the API endpoint returned an
@@ -1483,7 +1492,7 @@
    * If the used [http.Client] completes with an error when making a REST call,
    * this method  will complete with the same error.
    */
-  async.Future<Thread> get(core.String userId, core.String id) {
+  async.Future<Thread> get(core.String userId, core.String id, {core.String format, core.List<core.String> metadataHeaders}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1497,6 +1506,12 @@
     if (id == null) {
       throw new core.ArgumentError("Parameter id is required.");
     }
+    if (format != null) {
+      _queryParams["format"] = [format];
+    }
+    if (metadataHeaders != null) {
+      _queryParams["metadataHeaders"] = metadataHeaders;
+    }
 
 
     _url = common_internal.Escaper.ecapeVariable('$userId') + '/threads/' + common_internal.Escaper.ecapeVariable('$id');
diff --git a/generated/googleapis/lib/mapsengine/v1.dart b/generated/googleapis/lib/mapsengine/v1.dart
index 9ed63aa..a0cf268 100644
--- a/generated/googleapis/lib/mapsengine/v1.dart
+++ b/generated/googleapis/lib/mapsengine/v1.dart
@@ -7160,6 +7160,9 @@
    */
   Color fill;
 
+  /** Label style for the polygon. */
+  LabelStyle label;
+
   /** Border of the polygon. 0 < border.width <= 10. */
   Border stroke;
 
@@ -7170,6 +7173,9 @@
     if (_json.containsKey("fill")) {
       fill = new Color.fromJson(_json["fill"]);
     }
+    if (_json.containsKey("label")) {
+      label = new LabelStyle.fromJson(_json["label"]);
+    }
     if (_json.containsKey("stroke")) {
       stroke = new Border.fromJson(_json["stroke"]);
     }
@@ -7180,6 +7186,9 @@
     if (fill != null) {
       _json["fill"] = (fill).toJson();
     }
+    if (label != null) {
+      _json["label"] = (label).toJson();
+    }
     if (stroke != null) {
       _json["stroke"] = (stroke).toJson();
     }
diff --git a/generated/googleapis/lib/prediction/v1_6.dart b/generated/googleapis/lib/prediction/v1_6.dart
index f53d16e..8bf7971 100644
--- a/generated/googleapis/lib/prediction/v1_6.dart
+++ b/generated/googleapis/lib/prediction/v1_6.dart
@@ -1365,7 +1365,7 @@
   core.List<OutputOutputMulti> outputMulti;
 
   /** The estimated regression value (Regression models only). */
-  core.String outputValue;
+  core.double outputValue;
 
   /** A URL to re-request this resource. */
   core.String selfLink;
diff --git a/generated/googleapis/lib/src/common_internal.dart b/generated/googleapis/lib/src/common_internal.dart
index 829b364..a236634 100644
--- a/generated/googleapis/lib/src/common_internal.dart
+++ b/generated/googleapis/lib/src/common_internal.dart
@@ -9,7 +9,7 @@
 import "package:http/http.dart" as http;
 
 const String USER_AGENT_STRING =
-    'google-api-dart-client googleapis/0.3.1';
+    'google-api-dart-client googleapis/0.4.0';
 
 const CONTENT_TYPE_JSON_UTF8 = 'application/json; charset=utf-8';
 
@@ -482,8 +482,8 @@
                   'Received less bytes than indicated by [Media.length].'));
               return;
             } else if (end > _uploadMedia.length) {
-              completer.completeError(
-                  'Received more bytes than indicated by [Media.length].');
+              completer.completeError(new common_external.ApiRequestError(
+                  'Received more bytes than indicated by [Media.length].'));
               return;
             }
           }
diff --git a/generated/googleapis/lib/tagmanager/v1.dart b/generated/googleapis/lib/tagmanager/v1.dart
new file mode 100644
index 0000000..3a7bad0
--- /dev/null
+++ b/generated/googleapis/lib/tagmanager/v1.dart
@@ -0,0 +1,4207 @@
+library googleapis.tagmanager.v1;
+
+import "dart:core" as core;
+import "dart:collection" as collection;
+import "dart:async" as async;
+import "dart:convert" as convert;
+
+import "package:crypto/crypto.dart" as crypto;
+import 'package:http/http.dart' as http;
+import '../src/common_internal.dart' as common_internal;
+import '../common/common.dart' as common;
+
+export '../common/common.dart' show ApiRequestError;
+export '../common/common.dart' show DetailedApiRequestError;
+
+/** API for accessing Tag Manager accounts and containers. */
+class TagmanagerApi {
+  /** Delete your Google Tag Manager containers */
+  static const TagmanagerDeleteContainersScope = "https://www.googleapis.com/auth/tagmanager.delete.containers";
+
+  /** Manage your Google Tag Manager containers */
+  static const TagmanagerEditContainersScope = "https://www.googleapis.com/auth/tagmanager.edit.containers";
+
+  /** Manage your Google Tag Manager container versions */
+  static const TagmanagerEditContainerversionsScope = "https://www.googleapis.com/auth/tagmanager.edit.containerversions";
+
+  /** Manage your Google Tag Manager accounts */
+  static const TagmanagerManageAccountsScope = "https://www.googleapis.com/auth/tagmanager.manage.accounts";
+
+  /** Manage user permissions of your Google Tag Manager data */
+  static const TagmanagerManageUsersScope = "https://www.googleapis.com/auth/tagmanager.manage.users";
+
+  /** Publish your Google Tag Manager containers */
+  static const TagmanagerPublishScope = "https://www.googleapis.com/auth/tagmanager.publish";
+
+  /** View your Google Tag Manager containers */
+  static const TagmanagerReadonlyScope = "https://www.googleapis.com/auth/tagmanager.readonly";
+
+
+  final common_internal.ApiRequester _requester;
+
+  AccountsResourceApi get accounts => new AccountsResourceApi(_requester);
+
+  TagmanagerApi(http.Client client) : 
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "tagmanager/v1/");
+}
+
+
+/** Not documented yet. */
+class AccountsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  AccountsContainersResourceApi get containers => new AccountsContainersResourceApi(_requester);
+  AccountsPermissionsResourceApi get permissions => new AccountsPermissionsResourceApi(_requester);
+
+  AccountsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Gets a GTM Account.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * Completes with a [Account].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Account> get(core.String accountId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Account.fromJson(data));
+  }
+
+  /**
+   * Lists all GTM Accounts that a user has access to.
+   *
+   * Request parameters:
+   *
+   * Completes with a [ListAccountsResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ListAccountsResponse> list() {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+
+
+    _url = 'accounts';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListAccountsResponse.fromJson(data));
+  }
+
+  /**
+   * Updates a GTM Account.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [fingerprint] - When provided, this fingerprint must match the fingerprint
+   * of the account in storage.
+   *
+   * Completes with a [Account].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Account> update(Account request, core.String accountId, {core.String fingerprint}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (fingerprint != null) {
+      _queryParams["fingerprint"] = [fingerprint];
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId');
+
+    var _response = _requester.request(_url,
+                                       "PUT",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Account.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class AccountsContainersResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  AccountsContainersMacrosResourceApi get macros => new AccountsContainersMacrosResourceApi(_requester);
+  AccountsContainersRulesResourceApi get rules => new AccountsContainersRulesResourceApi(_requester);
+  AccountsContainersTagsResourceApi get tags => new AccountsContainersTagsResourceApi(_requester);
+  AccountsContainersTriggersResourceApi get triggers => new AccountsContainersTriggersResourceApi(_requester);
+  AccountsContainersVariablesResourceApi get variables => new AccountsContainersVariablesResourceApi(_requester);
+  AccountsContainersVersionsResourceApi get versions => new AccountsContainersVersionsResourceApi(_requester);
+
+  AccountsContainersResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Creates a Container.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * Completes with a [Container].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Container> create(Container request, core.String accountId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Container.fromJson(data));
+  }
+
+  /**
+   * Deletes a Container.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future delete(core.String accountId, core.String containerId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+
+    _downloadOptions = null;
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId');
+
+    var _response = _requester.request(_url,
+                                       "DELETE",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Gets a Container.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * Completes with a [Container].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Container> get(core.String accountId, core.String containerId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Container.fromJson(data));
+  }
+
+  /**
+   * Lists all Containers that belongs to a GTM Account.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * Completes with a [ListContainersResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ListContainersResponse> list(core.String accountId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListContainersResponse.fromJson(data));
+  }
+
+  /**
+   * Updates a Container.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * [fingerprint] - When provided, this fingerprint must match the fingerprint
+   * of the container in storage.
+   *
+   * Completes with a [Container].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Container> update(Container request, core.String accountId, core.String containerId, {core.String fingerprint}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+    if (fingerprint != null) {
+      _queryParams["fingerprint"] = [fingerprint];
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId');
+
+    var _response = _requester.request(_url,
+                                       "PUT",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Container.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class AccountsContainersMacrosResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  AccountsContainersMacrosResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Creates a GTM Macro.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * Completes with a [Macro].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Macro> create(Macro request, core.String accountId, core.String containerId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/macros';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Macro.fromJson(data));
+  }
+
+  /**
+   * Deletes a GTM Macro.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * [macroId] - The GTM Macro ID.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future delete(core.String accountId, core.String containerId, core.String macroId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+    if (macroId == null) {
+      throw new core.ArgumentError("Parameter macroId is required.");
+    }
+
+    _downloadOptions = null;
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/macros/' + common_internal.Escaper.ecapeVariable('$macroId');
+
+    var _response = _requester.request(_url,
+                                       "DELETE",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Gets a GTM Macro.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * [macroId] - The GTM Macro ID.
+   *
+   * Completes with a [Macro].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Macro> get(core.String accountId, core.String containerId, core.String macroId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+    if (macroId == null) {
+      throw new core.ArgumentError("Parameter macroId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/macros/' + common_internal.Escaper.ecapeVariable('$macroId');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Macro.fromJson(data));
+  }
+
+  /**
+   * Lists all GTM Macros of a Container.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * Completes with a [ListMacrosResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ListMacrosResponse> list(core.String accountId, core.String containerId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/macros';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListMacrosResponse.fromJson(data));
+  }
+
+  /**
+   * Updates a GTM Macro.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * [macroId] - The GTM Macro ID.
+   *
+   * [fingerprint] - When provided, this fingerprint must match the fingerprint
+   * of the macro in storage.
+   *
+   * Completes with a [Macro].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Macro> update(Macro request, core.String accountId, core.String containerId, core.String macroId, {core.String fingerprint}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+    if (macroId == null) {
+      throw new core.ArgumentError("Parameter macroId is required.");
+    }
+    if (fingerprint != null) {
+      _queryParams["fingerprint"] = [fingerprint];
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/macros/' + common_internal.Escaper.ecapeVariable('$macroId');
+
+    var _response = _requester.request(_url,
+                                       "PUT",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Macro.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class AccountsContainersRulesResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  AccountsContainersRulesResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Creates a GTM Rule.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * Completes with a [Rule].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Rule> create(Rule request, core.String accountId, core.String containerId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/rules';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Rule.fromJson(data));
+  }
+
+  /**
+   * Deletes a GTM Rule.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * [ruleId] - The GTM Rule ID.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future delete(core.String accountId, core.String containerId, core.String ruleId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+    if (ruleId == null) {
+      throw new core.ArgumentError("Parameter ruleId is required.");
+    }
+
+    _downloadOptions = null;
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/rules/' + common_internal.Escaper.ecapeVariable('$ruleId');
+
+    var _response = _requester.request(_url,
+                                       "DELETE",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Gets a GTM Rule.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * [ruleId] - The GTM Rule ID.
+   *
+   * Completes with a [Rule].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Rule> get(core.String accountId, core.String containerId, core.String ruleId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+    if (ruleId == null) {
+      throw new core.ArgumentError("Parameter ruleId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/rules/' + common_internal.Escaper.ecapeVariable('$ruleId');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Rule.fromJson(data));
+  }
+
+  /**
+   * Lists all GTM Rules of a Container.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * Completes with a [ListRulesResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ListRulesResponse> list(core.String accountId, core.String containerId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/rules';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListRulesResponse.fromJson(data));
+  }
+
+  /**
+   * Updates a GTM Rule.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * [ruleId] - The GTM Rule ID.
+   *
+   * [fingerprint] - When provided, this fingerprint must match the fingerprint
+   * of the rule in storage.
+   *
+   * Completes with a [Rule].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Rule> update(Rule request, core.String accountId, core.String containerId, core.String ruleId, {core.String fingerprint}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+    if (ruleId == null) {
+      throw new core.ArgumentError("Parameter ruleId is required.");
+    }
+    if (fingerprint != null) {
+      _queryParams["fingerprint"] = [fingerprint];
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/rules/' + common_internal.Escaper.ecapeVariable('$ruleId');
+
+    var _response = _requester.request(_url,
+                                       "PUT",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Rule.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class AccountsContainersTagsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  AccountsContainersTagsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Creates a GTM Tag.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * Completes with a [Tag].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Tag> create(Tag request, core.String accountId, core.String containerId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/tags';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Tag.fromJson(data));
+  }
+
+  /**
+   * Deletes a GTM Tag.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * [tagId] - The GTM Tag ID.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future delete(core.String accountId, core.String containerId, core.String tagId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+    if (tagId == null) {
+      throw new core.ArgumentError("Parameter tagId is required.");
+    }
+
+    _downloadOptions = null;
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/tags/' + common_internal.Escaper.ecapeVariable('$tagId');
+
+    var _response = _requester.request(_url,
+                                       "DELETE",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Gets a GTM Tag.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * [tagId] - The GTM Tag ID.
+   *
+   * Completes with a [Tag].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Tag> get(core.String accountId, core.String containerId, core.String tagId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+    if (tagId == null) {
+      throw new core.ArgumentError("Parameter tagId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/tags/' + common_internal.Escaper.ecapeVariable('$tagId');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Tag.fromJson(data));
+  }
+
+  /**
+   * Lists all GTM Tags of a Container.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * Completes with a [ListTagsResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ListTagsResponse> list(core.String accountId, core.String containerId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/tags';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListTagsResponse.fromJson(data));
+  }
+
+  /**
+   * Updates a GTM Tag.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * [tagId] - The GTM Tag ID.
+   *
+   * [fingerprint] - When provided, this fingerprint must match the fingerprint
+   * of the tag in storage.
+   *
+   * Completes with a [Tag].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Tag> update(Tag request, core.String accountId, core.String containerId, core.String tagId, {core.String fingerprint}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+    if (tagId == null) {
+      throw new core.ArgumentError("Parameter tagId is required.");
+    }
+    if (fingerprint != null) {
+      _queryParams["fingerprint"] = [fingerprint];
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/tags/' + common_internal.Escaper.ecapeVariable('$tagId');
+
+    var _response = _requester.request(_url,
+                                       "PUT",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Tag.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class AccountsContainersTriggersResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  AccountsContainersTriggersResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Creates a GTM Trigger.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * Completes with a [Trigger].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Trigger> create(Trigger request, core.String accountId, core.String containerId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/triggers';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Trigger.fromJson(data));
+  }
+
+  /**
+   * Deletes a GTM Trigger.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * [triggerId] - The GTM Trigger ID.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future delete(core.String accountId, core.String containerId, core.String triggerId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+    if (triggerId == null) {
+      throw new core.ArgumentError("Parameter triggerId is required.");
+    }
+
+    _downloadOptions = null;
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/triggers/' + common_internal.Escaper.ecapeVariable('$triggerId');
+
+    var _response = _requester.request(_url,
+                                       "DELETE",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Gets a GTM Trigger.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * [triggerId] - The GTM Trigger ID.
+   *
+   * Completes with a [Trigger].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Trigger> get(core.String accountId, core.String containerId, core.String triggerId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+    if (triggerId == null) {
+      throw new core.ArgumentError("Parameter triggerId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/triggers/' + common_internal.Escaper.ecapeVariable('$triggerId');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Trigger.fromJson(data));
+  }
+
+  /**
+   * Lists all GTM Triggers of a Container.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * Completes with a [ListTriggersResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ListTriggersResponse> list(core.String accountId, core.String containerId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/triggers';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListTriggersResponse.fromJson(data));
+  }
+
+  /**
+   * Updates a GTM Trigger.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * [triggerId] - The GTM Trigger ID.
+   *
+   * [fingerprint] - When provided, this fingerprint must match the fingerprint
+   * of the trigger in storage.
+   *
+   * Completes with a [Trigger].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Trigger> update(Trigger request, core.String accountId, core.String containerId, core.String triggerId, {core.String fingerprint}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+    if (triggerId == null) {
+      throw new core.ArgumentError("Parameter triggerId is required.");
+    }
+    if (fingerprint != null) {
+      _queryParams["fingerprint"] = [fingerprint];
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/triggers/' + common_internal.Escaper.ecapeVariable('$triggerId');
+
+    var _response = _requester.request(_url,
+                                       "PUT",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Trigger.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class AccountsContainersVariablesResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  AccountsContainersVariablesResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Creates a GTM Variable.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * Completes with a [Variable].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Variable> create(Variable request, core.String accountId, core.String containerId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/variables';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Variable.fromJson(data));
+  }
+
+  /**
+   * Deletes a GTM Variable.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * [variableId] - The GTM Variable ID.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future delete(core.String accountId, core.String containerId, core.String variableId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+    if (variableId == null) {
+      throw new core.ArgumentError("Parameter variableId is required.");
+    }
+
+    _downloadOptions = null;
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/variables/' + common_internal.Escaper.ecapeVariable('$variableId');
+
+    var _response = _requester.request(_url,
+                                       "DELETE",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Gets a GTM Variable.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * [variableId] - The GTM Variable ID.
+   *
+   * Completes with a [Variable].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Variable> get(core.String accountId, core.String containerId, core.String variableId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+    if (variableId == null) {
+      throw new core.ArgumentError("Parameter variableId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/variables/' + common_internal.Escaper.ecapeVariable('$variableId');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Variable.fromJson(data));
+  }
+
+  /**
+   * Lists all GTM Variables of a Container.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * Completes with a [ListVariablesResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ListVariablesResponse> list(core.String accountId, core.String containerId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/variables';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListVariablesResponse.fromJson(data));
+  }
+
+  /**
+   * Updates a GTM Variable.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * [variableId] - The GTM Variable ID.
+   *
+   * [fingerprint] - When provided, this fingerprint must match the fingerprint
+   * of the variable in storage.
+   *
+   * Completes with a [Variable].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Variable> update(Variable request, core.String accountId, core.String containerId, core.String variableId, {core.String fingerprint}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+    if (variableId == null) {
+      throw new core.ArgumentError("Parameter variableId is required.");
+    }
+    if (fingerprint != null) {
+      _queryParams["fingerprint"] = [fingerprint];
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/variables/' + common_internal.Escaper.ecapeVariable('$variableId');
+
+    var _response = _requester.request(_url,
+                                       "PUT",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Variable.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class AccountsContainersVersionsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  AccountsContainersVersionsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Creates a Container Version.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * Completes with a [CreateContainerVersionResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<CreateContainerVersionResponse> create(CreateContainerVersionRequestVersionOptions request, core.String accountId, core.String containerId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/versions';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new CreateContainerVersionResponse.fromJson(data));
+  }
+
+  /**
+   * Deletes a Container Version.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * [containerVersionId] - The GTM Container Version ID.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future delete(core.String accountId, core.String containerId, core.String containerVersionId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+    if (containerVersionId == null) {
+      throw new core.ArgumentError("Parameter containerVersionId is required.");
+    }
+
+    _downloadOptions = null;
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/versions/' + common_internal.Escaper.ecapeVariable('$containerVersionId');
+
+    var _response = _requester.request(_url,
+                                       "DELETE",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Gets a Container Version.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * [containerVersionId] - The GTM Container Version ID. Specify published to
+   * retrieve the currently published version.
+   *
+   * Completes with a [ContainerVersion].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ContainerVersion> get(core.String accountId, core.String containerId, core.String containerVersionId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+    if (containerVersionId == null) {
+      throw new core.ArgumentError("Parameter containerVersionId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/versions/' + common_internal.Escaper.ecapeVariable('$containerVersionId');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ContainerVersion.fromJson(data));
+  }
+
+  /**
+   * Lists all Container Versions of a GTM Container.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * [headers] - Retrieve headers only when true.
+   *
+   * Completes with a [ListContainerVersionsResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ListContainerVersionsResponse> list(core.String accountId, core.String containerId, {core.bool headers}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+    if (headers != null) {
+      _queryParams["headers"] = ["${headers}"];
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/versions';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListContainerVersionsResponse.fromJson(data));
+  }
+
+  /**
+   * Publishes a Container Version.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * [containerVersionId] - The GTM Container Version ID.
+   *
+   * [fingerprint] - When provided, this fingerprint must match the fingerprint
+   * of the container version in storage.
+   *
+   * Completes with a [PublishContainerVersionResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<PublishContainerVersionResponse> publish(core.String accountId, core.String containerId, core.String containerVersionId, {core.String fingerprint}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+    if (containerVersionId == null) {
+      throw new core.ArgumentError("Parameter containerVersionId is required.");
+    }
+    if (fingerprint != null) {
+      _queryParams["fingerprint"] = [fingerprint];
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/versions/' + common_internal.Escaper.ecapeVariable('$containerVersionId') + '/publish';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new PublishContainerVersionResponse.fromJson(data));
+  }
+
+  /**
+   * Restores a Container Version. This will overwrite the container's current
+   * configuration (including its macros, rules and tags). The operation will
+   * not have any effect on the version that is being served (i.e. the published
+   * version).
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * [containerVersionId] - The GTM Container Version ID.
+   *
+   * Completes with a [ContainerVersion].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ContainerVersion> restore(core.String accountId, core.String containerId, core.String containerVersionId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+    if (containerVersionId == null) {
+      throw new core.ArgumentError("Parameter containerVersionId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/versions/' + common_internal.Escaper.ecapeVariable('$containerVersionId') + '/restore';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ContainerVersion.fromJson(data));
+  }
+
+  /**
+   * Undeletes a Container Version.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * [containerVersionId] - The GTM Container Version ID.
+   *
+   * Completes with a [ContainerVersion].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ContainerVersion> undelete(core.String accountId, core.String containerId, core.String containerVersionId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+    if (containerVersionId == null) {
+      throw new core.ArgumentError("Parameter containerVersionId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/versions/' + common_internal.Escaper.ecapeVariable('$containerVersionId') + '/undelete';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ContainerVersion.fromJson(data));
+  }
+
+  /**
+   * Updates a Container Version.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [containerId] - The GTM Container ID.
+   *
+   * [containerVersionId] - The GTM Container Version ID.
+   *
+   * [fingerprint] - When provided, this fingerprint must match the fingerprint
+   * of the container version in storage.
+   *
+   * Completes with a [ContainerVersion].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ContainerVersion> update(ContainerVersion request, core.String accountId, core.String containerId, core.String containerVersionId, {core.String fingerprint}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (containerId == null) {
+      throw new core.ArgumentError("Parameter containerId is required.");
+    }
+    if (containerVersionId == null) {
+      throw new core.ArgumentError("Parameter containerVersionId is required.");
+    }
+    if (fingerprint != null) {
+      _queryParams["fingerprint"] = [fingerprint];
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/containers/' + common_internal.Escaper.ecapeVariable('$containerId') + '/versions/' + common_internal.Escaper.ecapeVariable('$containerVersionId');
+
+    var _response = _requester.request(_url,
+                                       "PUT",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ContainerVersion.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class AccountsPermissionsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  AccountsPermissionsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Creates a user's Account & Container Permissions.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * Completes with a [UserAccess].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<UserAccess> create(UserAccess request, core.String accountId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/permissions';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new UserAccess.fromJson(data));
+  }
+
+  /**
+   * Removes a user from the account, revoking access to it and all of its
+   * containers.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [permissionId] - The GTM User ID.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future delete(core.String accountId, core.String permissionId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (permissionId == null) {
+      throw new core.ArgumentError("Parameter permissionId is required.");
+    }
+
+    _downloadOptions = null;
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/permissions/' + common_internal.Escaper.ecapeVariable('$permissionId');
+
+    var _response = _requester.request(_url,
+                                       "DELETE",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Gets a user's Account & Container Permissions.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [permissionId] - The GTM User ID.
+   *
+   * Completes with a [UserAccess].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<UserAccess> get(core.String accountId, core.String permissionId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (permissionId == null) {
+      throw new core.ArgumentError("Parameter permissionId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/permissions/' + common_internal.Escaper.ecapeVariable('$permissionId');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new UserAccess.fromJson(data));
+  }
+
+  /**
+   * List all users that have access to the account along with Account and
+   * Container Permissions granted to each of them.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID. @required
+   * tagmanager.accounts.permissions.list
+   *
+   * Completes with a [ListAccountUsersResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ListAccountUsersResponse> list(core.String accountId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/permissions';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListAccountUsersResponse.fromJson(data));
+  }
+
+  /**
+   * Updates a user's Account & Container Permissions.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [accountId] - The GTM Account ID.
+   *
+   * [permissionId] - The GTM User ID.
+   *
+   * Completes with a [UserAccess].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<UserAccess> update(UserAccess request, core.String accountId, core.String permissionId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (accountId == null) {
+      throw new core.ArgumentError("Parameter accountId is required.");
+    }
+    if (permissionId == null) {
+      throw new core.ArgumentError("Parameter permissionId is required.");
+    }
+
+
+    _url = 'accounts/' + common_internal.Escaper.ecapeVariable('$accountId') + '/permissions/' + common_internal.Escaper.ecapeVariable('$permissionId');
+
+    var _response = _requester.request(_url,
+                                       "PUT",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new UserAccess.fromJson(data));
+  }
+
+}
+
+
+
+/** Represents a Google Tag Manager Account. */
+class Account {
+  /** The Account ID uniquely identifies the GTM Account. */
+  core.String accountId;
+
+  /**
+   * The fingerprint of the GTM Account as computed at storage time. This value
+   * is recomputed whenever the account is modified.
+   */
+  core.String fingerprint;
+
+  /** Account display name. */
+  core.String name;
+
+  /** Whether the account shares data anonymously with Google and others. */
+  core.bool shareData;
+
+
+  Account();
+
+  Account.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("fingerprint")) {
+      fingerprint = _json["fingerprint"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("shareData")) {
+      shareData = _json["shareData"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (fingerprint != null) {
+      _json["fingerprint"] = fingerprint;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (shareData != null) {
+      _json["shareData"] = shareData;
+    }
+    return _json;
+  }
+}
+
+
+/** Defines the Google Tag Manager Account access permissions. */
+class AccountAccess {
+  /**
+   * List of Account permissions. Valid account permissions are read and manage.
+   */
+  core.List<core.String> permission;
+
+
+  AccountAccess();
+
+  AccountAccess.fromJson(core.Map _json) {
+    if (_json.containsKey("permission")) {
+      permission = _json["permission"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (permission != null) {
+      _json["permission"] = permission;
+    }
+    return _json;
+  }
+}
+
+
+/** Represents a predicate. */
+class Condition {
+  /**
+   * A list of named parameters (key/value), depending on the condition's type.
+   * Notes:
+   * - For binary operators, include parameters named arg0 and arg1 for
+   * specifying the left and right operands, respectively.
+   * - At this time, the left operand (arg0) must be a reference to a macro.
+   * - For case-insensitive Regex matching, include a boolean parameter named
+   * ignore_case that is set to true. If not specified or set to any other
+   * value, the matching will be case sensitive.
+   * - To negate an operator, include a boolean parameter named negate boolean
+   * parameter that is set to true.
+   */
+  core.List<Parameter> parameter;
+
+  /**
+   * The type of operator for this condition.
+   * Possible string values are:
+   * - "contains"
+   * - "endsWith"
+   * - "equals"
+   * - "greater"
+   * - "greaterOrEquals"
+   * - "less"
+   * - "lessOrEquals"
+   * - "matchRegex"
+   * - "startsWith"
+   */
+  core.String type;
+
+
+  Condition();
+
+  Condition.fromJson(core.Map _json) {
+    if (_json.containsKey("parameter")) {
+      parameter = _json["parameter"].map((value) => new Parameter.fromJson(value)).toList();
+    }
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (parameter != null) {
+      _json["parameter"] = parameter.map((value) => (value).toJson()).toList();
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    return _json;
+  }
+}
+
+
+/** Represents a Google Tag Manager Container. */
+class Container {
+  /** GTM Account ID. */
+  core.String accountId;
+
+  /** The Container ID uniquely identifies the GTM Container. */
+  core.String containerId;
+
+  /** Optional list of domain names associated with the Container. */
+  core.List<core.String> domainName;
+
+  /**
+   * The fingerprint of the GTM Container as computed at storage time. This
+   * value is recomputed whenever the account is modified.
+   */
+  core.String fingerprint;
+
+  /** Container display name. */
+  core.String name;
+
+  /** Container Notes. */
+  core.String notes;
+
+  /** Container Public ID. */
+  core.String publicId;
+
+  /** Container Country ID. */
+  core.String timeZoneCountryId;
+
+  /** Container Time Zone ID. */
+  core.String timeZoneId;
+
+  /**
+   * List of Usage Contexts for the Container. Valid values include: web,
+   * android, ios.
+   */
+  core.List<core.String> usageContext;
+
+
+  Container();
+
+  Container.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("containerId")) {
+      containerId = _json["containerId"];
+    }
+    if (_json.containsKey("domainName")) {
+      domainName = _json["domainName"];
+    }
+    if (_json.containsKey("fingerprint")) {
+      fingerprint = _json["fingerprint"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("notes")) {
+      notes = _json["notes"];
+    }
+    if (_json.containsKey("publicId")) {
+      publicId = _json["publicId"];
+    }
+    if (_json.containsKey("timeZoneCountryId")) {
+      timeZoneCountryId = _json["timeZoneCountryId"];
+    }
+    if (_json.containsKey("timeZoneId")) {
+      timeZoneId = _json["timeZoneId"];
+    }
+    if (_json.containsKey("usageContext")) {
+      usageContext = _json["usageContext"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (containerId != null) {
+      _json["containerId"] = containerId;
+    }
+    if (domainName != null) {
+      _json["domainName"] = domainName;
+    }
+    if (fingerprint != null) {
+      _json["fingerprint"] = fingerprint;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (notes != null) {
+      _json["notes"] = notes;
+    }
+    if (publicId != null) {
+      _json["publicId"] = publicId;
+    }
+    if (timeZoneCountryId != null) {
+      _json["timeZoneCountryId"] = timeZoneCountryId;
+    }
+    if (timeZoneId != null) {
+      _json["timeZoneId"] = timeZoneId;
+    }
+    if (usageContext != null) {
+      _json["usageContext"] = usageContext;
+    }
+    return _json;
+  }
+}
+
+
+/** Defines the Google Tag Manager Container access permissions. */
+class ContainerAccess {
+  /** GTM Container ID. */
+  core.String containerId;
+
+  /**
+   * List of Container permissions. Valid container permissions are: read, edit,
+   * delete, publish.
+   */
+  core.List<core.String> permission;
+
+
+  ContainerAccess();
+
+  ContainerAccess.fromJson(core.Map _json) {
+    if (_json.containsKey("containerId")) {
+      containerId = _json["containerId"];
+    }
+    if (_json.containsKey("permission")) {
+      permission = _json["permission"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (containerId != null) {
+      _json["containerId"] = containerId;
+    }
+    if (permission != null) {
+      _json["permission"] = permission;
+    }
+    return _json;
+  }
+}
+
+
+/** Represents a Google Tag Manager Container Version. */
+class ContainerVersion {
+  /** GTM Account ID. */
+  core.String accountId;
+
+  /** The container that this version was taken from. */
+  Container container;
+
+  /** GTM Container ID. */
+  core.String containerId;
+
+  /**
+   * The Container Version ID uniquely identifies the GTM Container Version.
+   */
+  core.String containerVersionId;
+
+  /** A value of true indicates this container version has been deleted. */
+  core.bool deleted;
+
+  /**
+   * The fingerprint of the GTM Container Version as computed at storage time.
+   * This value is recomputed whenever the container version is modified.
+   */
+  core.String fingerprint;
+
+  /** The macros in the container that this version was taken from. */
+  core.List<Macro> macro;
+
+  /** Container version display name. */
+  core.String name;
+
+  /** User notes on how to apply this container version in the container. */
+  core.String notes;
+
+  /** The rules in the container that this version was taken from. */
+  core.List<Rule> rule;
+
+  /** The tags in the container that this version was taken from. */
+  core.List<Tag> tag;
+
+  /** The triggers in the container that this version was taken from. */
+  core.List<Trigger> trigger;
+
+  /** The variables in the container that this version was taken from. */
+  core.List<Variable> variable;
+
+
+  ContainerVersion();
+
+  ContainerVersion.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("container")) {
+      container = new Container.fromJson(_json["container"]);
+    }
+    if (_json.containsKey("containerId")) {
+      containerId = _json["containerId"];
+    }
+    if (_json.containsKey("containerVersionId")) {
+      containerVersionId = _json["containerVersionId"];
+    }
+    if (_json.containsKey("deleted")) {
+      deleted = _json["deleted"];
+    }
+    if (_json.containsKey("fingerprint")) {
+      fingerprint = _json["fingerprint"];
+    }
+    if (_json.containsKey("macro")) {
+      macro = _json["macro"].map((value) => new Macro.fromJson(value)).toList();
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("notes")) {
+      notes = _json["notes"];
+    }
+    if (_json.containsKey("rule")) {
+      rule = _json["rule"].map((value) => new Rule.fromJson(value)).toList();
+    }
+    if (_json.containsKey("tag")) {
+      tag = _json["tag"].map((value) => new Tag.fromJson(value)).toList();
+    }
+    if (_json.containsKey("trigger")) {
+      trigger = _json["trigger"].map((value) => new Trigger.fromJson(value)).toList();
+    }
+    if (_json.containsKey("variable")) {
+      variable = _json["variable"].map((value) => new Variable.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (container != null) {
+      _json["container"] = (container).toJson();
+    }
+    if (containerId != null) {
+      _json["containerId"] = containerId;
+    }
+    if (containerVersionId != null) {
+      _json["containerVersionId"] = containerVersionId;
+    }
+    if (deleted != null) {
+      _json["deleted"] = deleted;
+    }
+    if (fingerprint != null) {
+      _json["fingerprint"] = fingerprint;
+    }
+    if (macro != null) {
+      _json["macro"] = macro.map((value) => (value).toJson()).toList();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (notes != null) {
+      _json["notes"] = notes;
+    }
+    if (rule != null) {
+      _json["rule"] = rule.map((value) => (value).toJson()).toList();
+    }
+    if (tag != null) {
+      _json["tag"] = tag.map((value) => (value).toJson()).toList();
+    }
+    if (trigger != null) {
+      _json["trigger"] = trigger.map((value) => (value).toJson()).toList();
+    }
+    if (variable != null) {
+      _json["variable"] = variable.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/** Represents a Google Tag Manager Container Version Header. */
+class ContainerVersionHeader {
+  /** GTM Account ID. */
+  core.String accountId;
+
+  /** GTM Container ID. */
+  core.String containerId;
+
+  /**
+   * The Container Version ID uniquely identifies the GTM Container Version.
+   */
+  core.String containerVersionId;
+
+  /** A value of true indicates this container version has been deleted. */
+  core.bool deleted;
+
+  /** Container version display name. */
+  core.String name;
+
+  /** Number of macros in the container version. */
+  core.String numMacros;
+
+  /** Number of rules in the container version. */
+  core.String numRules;
+
+  /** Number of tags in the container version. */
+  core.String numTags;
+
+  /** Number of triggers in the container version. */
+  core.String numTriggers;
+
+  /** Number of variables in the container version. */
+  core.String numVariables;
+
+
+  ContainerVersionHeader();
+
+  ContainerVersionHeader.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("containerId")) {
+      containerId = _json["containerId"];
+    }
+    if (_json.containsKey("containerVersionId")) {
+      containerVersionId = _json["containerVersionId"];
+    }
+    if (_json.containsKey("deleted")) {
+      deleted = _json["deleted"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("numMacros")) {
+      numMacros = _json["numMacros"];
+    }
+    if (_json.containsKey("numRules")) {
+      numRules = _json["numRules"];
+    }
+    if (_json.containsKey("numTags")) {
+      numTags = _json["numTags"];
+    }
+    if (_json.containsKey("numTriggers")) {
+      numTriggers = _json["numTriggers"];
+    }
+    if (_json.containsKey("numVariables")) {
+      numVariables = _json["numVariables"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (containerId != null) {
+      _json["containerId"] = containerId;
+    }
+    if (containerVersionId != null) {
+      _json["containerVersionId"] = containerVersionId;
+    }
+    if (deleted != null) {
+      _json["deleted"] = deleted;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (numMacros != null) {
+      _json["numMacros"] = numMacros;
+    }
+    if (numRules != null) {
+      _json["numRules"] = numRules;
+    }
+    if (numTags != null) {
+      _json["numTags"] = numTags;
+    }
+    if (numTriggers != null) {
+      _json["numTriggers"] = numTriggers;
+    }
+    if (numVariables != null) {
+      _json["numVariables"] = numVariables;
+    }
+    return _json;
+  }
+}
+
+
+/** Options for new container versions. */
+class CreateContainerVersionRequestVersionOptions {
+  /** The name of the container version to be created. */
+  core.String name;
+
+  /** The notes of the container version to be created. */
+  core.String notes;
+
+  /**
+   * The creation of this version may be for quick preview and shouldn't be
+   * saved.
+   */
+  core.bool quickPreview;
+
+
+  CreateContainerVersionRequestVersionOptions();
+
+  CreateContainerVersionRequestVersionOptions.fromJson(core.Map _json) {
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("notes")) {
+      notes = _json["notes"];
+    }
+    if (_json.containsKey("quickPreview")) {
+      quickPreview = _json["quickPreview"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (notes != null) {
+      _json["notes"] = notes;
+    }
+    if (quickPreview != null) {
+      _json["quickPreview"] = quickPreview;
+    }
+    return _json;
+  }
+}
+
+
+/** Create container versions response. */
+class CreateContainerVersionResponse {
+  /** Compiler errors or not. */
+  core.bool compilerError;
+
+  /** The container version created. */
+  ContainerVersion containerVersion;
+
+
+  CreateContainerVersionResponse();
+
+  CreateContainerVersionResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("compilerError")) {
+      compilerError = _json["compilerError"];
+    }
+    if (_json.containsKey("containerVersion")) {
+      containerVersion = new ContainerVersion.fromJson(_json["containerVersion"]);
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (compilerError != null) {
+      _json["compilerError"] = compilerError;
+    }
+    if (containerVersion != null) {
+      _json["containerVersion"] = (containerVersion).toJson();
+    }
+    return _json;
+  }
+}
+
+
+/** List AccountUsers Response. */
+class ListAccountUsersResponse {
+  /** All GTM AccountUsers of a GTM Account. */
+  core.List<UserAccess> userAccess;
+
+
+  ListAccountUsersResponse();
+
+  ListAccountUsersResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("userAccess")) {
+      userAccess = _json["userAccess"].map((value) => new UserAccess.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (userAccess != null) {
+      _json["userAccess"] = userAccess.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/** List Accounts Response. */
+class ListAccountsResponse {
+  /** List of GTM Accounts that a user has access to. */
+  core.List<Account> accounts;
+
+
+  ListAccountsResponse();
+
+  ListAccountsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("accounts")) {
+      accounts = _json["accounts"].map((value) => new Account.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (accounts != null) {
+      _json["accounts"] = accounts.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/** List container versions response. */
+class ListContainerVersionsResponse {
+  /** All versions of a GTM Container. */
+  core.List<ContainerVersion> containerVersion;
+
+  /** All container version headers of a GTM Container. */
+  core.List<ContainerVersionHeader> containerVersionHeader;
+
+
+  ListContainerVersionsResponse();
+
+  ListContainerVersionsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("containerVersion")) {
+      containerVersion = _json["containerVersion"].map((value) => new ContainerVersion.fromJson(value)).toList();
+    }
+    if (_json.containsKey("containerVersionHeader")) {
+      containerVersionHeader = _json["containerVersionHeader"].map((value) => new ContainerVersionHeader.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (containerVersion != null) {
+      _json["containerVersion"] = containerVersion.map((value) => (value).toJson()).toList();
+    }
+    if (containerVersionHeader != null) {
+      _json["containerVersionHeader"] = containerVersionHeader.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/** List Containers Response. */
+class ListContainersResponse {
+  /** All Containers of a GTM Account. */
+  core.List<Container> containers;
+
+
+  ListContainersResponse();
+
+  ListContainersResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("containers")) {
+      containers = _json["containers"].map((value) => new Container.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (containers != null) {
+      _json["containers"] = containers.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/** List Macros Response. */
+class ListMacrosResponse {
+  /** All GTM Macros of a GTM Container. */
+  core.List<Macro> macros;
+
+
+  ListMacrosResponse();
+
+  ListMacrosResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("macros")) {
+      macros = _json["macros"].map((value) => new Macro.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (macros != null) {
+      _json["macros"] = macros.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/** List Rules Response. */
+class ListRulesResponse {
+  /** All GTM Rules of a GTM Container. */
+  core.List<Rule> rules;
+
+
+  ListRulesResponse();
+
+  ListRulesResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("rules")) {
+      rules = _json["rules"].map((value) => new Rule.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (rules != null) {
+      _json["rules"] = rules.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/** List Tags Response. */
+class ListTagsResponse {
+  /** All GTM Tags of a GTM Container. */
+  core.List<Tag> tags;
+
+
+  ListTagsResponse();
+
+  ListTagsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("tags")) {
+      tags = _json["tags"].map((value) => new Tag.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (tags != null) {
+      _json["tags"] = tags.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/** List triggers response. */
+class ListTriggersResponse {
+  /** All GTM Triggers of a GTM Container. */
+  core.List<Trigger> triggers;
+
+
+  ListTriggersResponse();
+
+  ListTriggersResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("triggers")) {
+      triggers = _json["triggers"].map((value) => new Trigger.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (triggers != null) {
+      _json["triggers"] = triggers.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/** List Variables Response. */
+class ListVariablesResponse {
+  /** All GTM Variables of a GTM Container. */
+  core.List<Variable> variables;
+
+
+  ListVariablesResponse();
+
+  ListVariablesResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("variables")) {
+      variables = _json["variables"].map((value) => new Variable.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (variables != null) {
+      _json["variables"] = variables.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/** Represents a Google Tag Manager Macro. */
+class Macro {
+  /** GTM Account ID. */
+  core.String accountId;
+
+  /** GTM Container ID. */
+  core.String containerId;
+
+  /**
+   * For mobile containers only: A list of rule IDs for disabling conditional
+   * macros; the macro is enabled if one of the enabling rules is true while all
+   * the disabling rules are false. Treated as an unordered set.
+   */
+  core.List<core.String> disablingRuleId;
+
+  /**
+   * For mobile containers only: A list of rule IDs for enabling conditional
+   * macros; the macro is enabled if one of the enabling rules is true while all
+   * the disabling rules are false. Treated as an unordered set.
+   */
+  core.List<core.String> enablingRuleId;
+
+  /**
+   * The fingerprint of the GTM Macro as computed at storage time. This value is
+   * recomputed whenever the macro is modified.
+   */
+  core.String fingerprint;
+
+  /** The Macro ID uniquely identifies the GTM Macro. */
+  core.String macroId;
+
+  /** Macro display name. */
+  core.String name;
+
+  /** User notes on how to apply this macro in the container. */
+  core.String notes;
+
+  /** The macro's parameters. */
+  core.List<Parameter> parameter;
+
+  /** The end timestamp in milliseconds to schedule a macro. */
+  core.String scheduleEndMs;
+
+  /** The start timestamp in milliseconds to schedule a macro. */
+  core.String scheduleStartMs;
+
+  /** GTM Macro Type. */
+  core.String type;
+
+
+  Macro();
+
+  Macro.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("containerId")) {
+      containerId = _json["containerId"];
+    }
+    if (_json.containsKey("disablingRuleId")) {
+      disablingRuleId = _json["disablingRuleId"];
+    }
+    if (_json.containsKey("enablingRuleId")) {
+      enablingRuleId = _json["enablingRuleId"];
+    }
+    if (_json.containsKey("fingerprint")) {
+      fingerprint = _json["fingerprint"];
+    }
+    if (_json.containsKey("macroId")) {
+      macroId = _json["macroId"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("notes")) {
+      notes = _json["notes"];
+    }
+    if (_json.containsKey("parameter")) {
+      parameter = _json["parameter"].map((value) => new Parameter.fromJson(value)).toList();
+    }
+    if (_json.containsKey("scheduleEndMs")) {
+      scheduleEndMs = _json["scheduleEndMs"];
+    }
+    if (_json.containsKey("scheduleStartMs")) {
+      scheduleStartMs = _json["scheduleStartMs"];
+    }
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (containerId != null) {
+      _json["containerId"] = containerId;
+    }
+    if (disablingRuleId != null) {
+      _json["disablingRuleId"] = disablingRuleId;
+    }
+    if (enablingRuleId != null) {
+      _json["enablingRuleId"] = enablingRuleId;
+    }
+    if (fingerprint != null) {
+      _json["fingerprint"] = fingerprint;
+    }
+    if (macroId != null) {
+      _json["macroId"] = macroId;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (notes != null) {
+      _json["notes"] = notes;
+    }
+    if (parameter != null) {
+      _json["parameter"] = parameter.map((value) => (value).toJson()).toList();
+    }
+    if (scheduleEndMs != null) {
+      _json["scheduleEndMs"] = scheduleEndMs;
+    }
+    if (scheduleStartMs != null) {
+      _json["scheduleStartMs"] = scheduleStartMs;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    return _json;
+  }
+}
+
+
+/** Represents a Google Tag Manager Parameter. */
+class Parameter {
+  /**
+   * The named key that uniquely identifies a parameter. Required for top-level
+   * parameters, as well as map values. Ignored for list values.
+   */
+  core.String key;
+
+  /** This list parameter's parameters (keys will be ignored). */
+  core.List<Parameter> list;
+
+  /** This map parameter's parameters (must have keys; keys must be unique). */
+  core.List<Parameter> map;
+
+  /**
+   * The parameter type. Valid values are:
+   * - boolean: The value represents a boolean, represented as 'true' or 'false'
+   * - integer: The value represents a 64-bit signed integer value, in base 10
+   * - list: A list of parameters should be specified
+   * - map: A map of parameters should be specified
+   * - template: The value represents any text; this can include macro
+   * references (even macro references that might return non-string types)
+   * Possible string values are:
+   * - "boolean"
+   * - "integer"
+   * - "list"
+   * - "map"
+   * - "template"
+   */
+  core.String type;
+
+  /**
+   * A parameter's value (may contain macro references such as "{{myMacro}}") as
+   * appropriate to the specified type.
+   */
+  core.String value;
+
+
+  Parameter();
+
+  Parameter.fromJson(core.Map _json) {
+    if (_json.containsKey("key")) {
+      key = _json["key"];
+    }
+    if (_json.containsKey("list")) {
+      list = _json["list"].map((value) => new Parameter.fromJson(value)).toList();
+    }
+    if (_json.containsKey("map")) {
+      map = _json["map"].map((value) => new Parameter.fromJson(value)).toList();
+    }
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+    if (_json.containsKey("value")) {
+      value = _json["value"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (key != null) {
+      _json["key"] = key;
+    }
+    if (list != null) {
+      _json["list"] = list.map((value) => (value).toJson()).toList();
+    }
+    if (map != null) {
+      _json["map"] = map.map((value) => (value).toJson()).toList();
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    if (value != null) {
+      _json["value"] = value;
+    }
+    return _json;
+  }
+}
+
+
+/** Publish container version response. */
+class PublishContainerVersionResponse {
+  /** Compiler errors or not. */
+  core.bool compilerError;
+
+  /** The container version created. */
+  ContainerVersion containerVersion;
+
+
+  PublishContainerVersionResponse();
+
+  PublishContainerVersionResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("compilerError")) {
+      compilerError = _json["compilerError"];
+    }
+    if (_json.containsKey("containerVersion")) {
+      containerVersion = new ContainerVersion.fromJson(_json["containerVersion"]);
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (compilerError != null) {
+      _json["compilerError"] = compilerError;
+    }
+    if (containerVersion != null) {
+      _json["containerVersion"] = (containerVersion).toJson();
+    }
+    return _json;
+  }
+}
+
+
+/** Represents a Google Tag Manager Rule. */
+class Rule {
+  /** GTM Account ID. */
+  core.String accountId;
+
+  /**
+   * The list of conditions that make up this rule (implicit AND between them).
+   */
+  core.List<Condition> condition;
+
+  /** GTM Container ID. */
+  core.String containerId;
+
+  /**
+   * The fingerprint of the GTM Rule as computed at storage time. This value is
+   * recomputed whenever the rule is modified.
+   */
+  core.String fingerprint;
+
+  /** Rule display name. */
+  core.String name;
+
+  /** User notes on how to apply this rule in the container. */
+  core.String notes;
+
+  /** The Rule ID uniquely identifies the GTM Rule. */
+  core.String ruleId;
+
+
+  Rule();
+
+  Rule.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("condition")) {
+      condition = _json["condition"].map((value) => new Condition.fromJson(value)).toList();
+    }
+    if (_json.containsKey("containerId")) {
+      containerId = _json["containerId"];
+    }
+    if (_json.containsKey("fingerprint")) {
+      fingerprint = _json["fingerprint"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("notes")) {
+      notes = _json["notes"];
+    }
+    if (_json.containsKey("ruleId")) {
+      ruleId = _json["ruleId"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (condition != null) {
+      _json["condition"] = condition.map((value) => (value).toJson()).toList();
+    }
+    if (containerId != null) {
+      _json["containerId"] = containerId;
+    }
+    if (fingerprint != null) {
+      _json["fingerprint"] = fingerprint;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (notes != null) {
+      _json["notes"] = notes;
+    }
+    if (ruleId != null) {
+      _json["ruleId"] = ruleId;
+    }
+    return _json;
+  }
+}
+
+
+/** Represents a Google Tag Manager Tag. */
+class Tag {
+  /** GTM Account ID. */
+  core.String accountId;
+
+  /**
+   * Blocking rule IDs. If any of the listed rules evaluate to true, the tag
+   * will not fire.
+   */
+  core.List<core.String> blockingRuleId;
+
+  /**
+   * Blocking trigger IDs. If any of the listed triggers evaluate to true, the
+   * tag will not fire.
+   */
+  core.List<core.String> blockingTriggerId;
+
+  /** GTM Container ID. */
+  core.String containerId;
+
+  /**
+   * An optional list of tag names that this tag depends on to fire. Execution
+   * of this tag will be prevented until the tags with the given names complete
+   * their execution.
+   */
+  Parameter dependencies;
+
+  /**
+   * The fingerprint of the GTM Tag as computed at storage time. This value is
+   * recomputed whenever the tag is modified.
+   */
+  core.String fingerprint;
+
+  /**
+   * Firing rule IDs. A tag will fire when any of the listed rules are true and
+   * all of its blockingRuleIds (if any specified) are false.
+   */
+  core.List<core.String> firingRuleId;
+
+  /**
+   * Firing trigger IDs. A tag will fire when any of the listed triggers are
+   * true and all of its blockingTriggerIds (if any specified) are false.
+   */
+  core.List<core.String> firingTriggerId;
+
+  /**
+   * If set to true, this tag will only fire in the live environment (e.g. not
+   * in preview or debug mode).
+   */
+  core.bool liveOnly;
+
+  /** Tag display name. */
+  core.String name;
+
+  /** User notes on how to apply this tag in the container. */
+  core.String notes;
+
+  /** The tag's parameters. */
+  core.List<Parameter> parameter;
+
+  /**
+   * User defined numeric priority of the tag. Tags are fired asynchronously in
+   * order of priority. Tags with higher numeric value fire first. A tag's
+   * priority can be a positive or negative value. The default value is 0.
+   */
+  Parameter priority;
+
+  /** The end timestamp in milliseconds to schedule a tag. */
+  core.String scheduleEndMs;
+
+  /** The start timestamp in milliseconds to schedule a tag. */
+  core.String scheduleStartMs;
+
+  /** The Tag ID uniquely identifies the GTM Tag. */
+  core.String tagId;
+
+  /** GTM Tag Type. */
+  core.String type;
+
+
+  Tag();
+
+  Tag.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("blockingRuleId")) {
+      blockingRuleId = _json["blockingRuleId"];
+    }
+    if (_json.containsKey("blockingTriggerId")) {
+      blockingTriggerId = _json["blockingTriggerId"];
+    }
+    if (_json.containsKey("containerId")) {
+      containerId = _json["containerId"];
+    }
+    if (_json.containsKey("dependencies")) {
+      dependencies = new Parameter.fromJson(_json["dependencies"]);
+    }
+    if (_json.containsKey("fingerprint")) {
+      fingerprint = _json["fingerprint"];
+    }
+    if (_json.containsKey("firingRuleId")) {
+      firingRuleId = _json["firingRuleId"];
+    }
+    if (_json.containsKey("firingTriggerId")) {
+      firingTriggerId = _json["firingTriggerId"];
+    }
+    if (_json.containsKey("liveOnly")) {
+      liveOnly = _json["liveOnly"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("notes")) {
+      notes = _json["notes"];
+    }
+    if (_json.containsKey("parameter")) {
+      parameter = _json["parameter"].map((value) => new Parameter.fromJson(value)).toList();
+    }
+    if (_json.containsKey("priority")) {
+      priority = new Parameter.fromJson(_json["priority"]);
+    }
+    if (_json.containsKey("scheduleEndMs")) {
+      scheduleEndMs = _json["scheduleEndMs"];
+    }
+    if (_json.containsKey("scheduleStartMs")) {
+      scheduleStartMs = _json["scheduleStartMs"];
+    }
+    if (_json.containsKey("tagId")) {
+      tagId = _json["tagId"];
+    }
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (blockingRuleId != null) {
+      _json["blockingRuleId"] = blockingRuleId;
+    }
+    if (blockingTriggerId != null) {
+      _json["blockingTriggerId"] = blockingTriggerId;
+    }
+    if (containerId != null) {
+      _json["containerId"] = containerId;
+    }
+    if (dependencies != null) {
+      _json["dependencies"] = (dependencies).toJson();
+    }
+    if (fingerprint != null) {
+      _json["fingerprint"] = fingerprint;
+    }
+    if (firingRuleId != null) {
+      _json["firingRuleId"] = firingRuleId;
+    }
+    if (firingTriggerId != null) {
+      _json["firingTriggerId"] = firingTriggerId;
+    }
+    if (liveOnly != null) {
+      _json["liveOnly"] = liveOnly;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (notes != null) {
+      _json["notes"] = notes;
+    }
+    if (parameter != null) {
+      _json["parameter"] = parameter.map((value) => (value).toJson()).toList();
+    }
+    if (priority != null) {
+      _json["priority"] = (priority).toJson();
+    }
+    if (scheduleEndMs != null) {
+      _json["scheduleEndMs"] = scheduleEndMs;
+    }
+    if (scheduleStartMs != null) {
+      _json["scheduleStartMs"] = scheduleStartMs;
+    }
+    if (tagId != null) {
+      _json["tagId"] = tagId;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    return _json;
+  }
+}
+
+
+/** Represents a Google Tag Manager Trigger */
+class Trigger {
+  /** GTM Account ID. */
+  core.String accountId;
+
+  /** Used in the case of auto event tracking. */
+  core.List<Condition> autoEventFilter;
+
+  /**
+   * Whether or not we should only fire tags if the form submit or link click
+   * event is not cancelled by some other event handler (e.g. because of
+   * validation). Only valid for Form Submission and Link Click triggers.
+   */
+  Parameter checkValidation;
+
+  /** GTM Container ID. */
+  core.String containerId;
+
+  /**
+   * Used in the case of custom event, which is fired iff all Conditions are
+   * true.
+   */
+  core.List<Condition> customEventFilter;
+
+  /**
+   * Reloads the videos in the page that don't already have the YT API enabled.
+   * If false, only capture events from videos that already have the API
+   * enabled. Only valid for YouTube triggers.
+   */
+  Parameter enableAllVideos;
+
+  /** Name of the GTM event that is fired. Only valid for Timer triggers. */
+  Parameter eventName;
+
+  /** The trigger will only fire iff all Conditions are true. */
+  core.List<Condition> filter;
+
+  /**
+   * The fingerprint of the GTM Trigger as computed at storage time. This value
+   * is recomputed whenever the trigger is modified.
+   */
+  core.String fingerprint;
+
+  /**
+   * Time between triggering recurring Timer Events (in milliseconds). Only
+   * valid for Timer triggers.
+   */
+  Parameter interval;
+
+  /**
+   * Limit of the number of GTM events this Timer Trigger will fire. If no limit
+   * is set, we will continue to fire GTM events until the user leaves the page.
+   * Only valid for Timer triggers.
+   */
+  Parameter limit;
+
+  /** Trigger display name. */
+  core.String name;
+
+  /** The Trigger ID uniquely identifies the GTM Trigger. */
+  core.String triggerId;
+
+  /**
+   * Defines the data layer event that causes this trigger.
+   * Possible string values are:
+   * - "ajaxSubmission"
+   * - "always"
+   * - "click"
+   * - "customEvent"
+   * - "domReady"
+   * - "formSubmission"
+   * - "historyChange"
+   * - "jsError"
+   * - "linkClick"
+   * - "pageview"
+   * - "timer"
+   * - "windowLoaded"
+   * - "youTube"
+   */
+  core.String type;
+
+  /**
+   * Globally unique id of the trigger that auto-generates this Form Submit or
+   * Link Click listeners if any. Used to make incompatible auto-events work
+   * together with trigger filtering based on trigger ids. This value is
+   * populated during output generation since the tags implied by triggers don't
+   * exist until then. Only valid for Form Submission and Link Click triggers.
+   */
+  Parameter uniqueTriggerId;
+
+  /**
+   * List of integer percentage values. The trigger will fire as each percentage
+   * is reached in any instrumented videos. Only valid for YouTube triggers.
+   */
+  Parameter videoPercentageList;
+
+  /**
+   * Whether or not we should delay the form submissions or link opening until
+   * all of the tags have fired (by preventing the default action and later
+   * simulating the default action). Only valid for Form Submission and Link
+   * Click triggers.
+   */
+  Parameter waitForTags;
+
+  /**
+   * How long to wait (in milliseconds) for tags to fire when 'waits_for_tags'
+   * above evaluates to true. Only valid for Form Submission and Link Click
+   * triggers.
+   */
+  Parameter waitForTagsTimeout;
+
+
+  Trigger();
+
+  Trigger.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("autoEventFilter")) {
+      autoEventFilter = _json["autoEventFilter"].map((value) => new Condition.fromJson(value)).toList();
+    }
+    if (_json.containsKey("checkValidation")) {
+      checkValidation = new Parameter.fromJson(_json["checkValidation"]);
+    }
+    if (_json.containsKey("containerId")) {
+      containerId = _json["containerId"];
+    }
+    if (_json.containsKey("customEventFilter")) {
+      customEventFilter = _json["customEventFilter"].map((value) => new Condition.fromJson(value)).toList();
+    }
+    if (_json.containsKey("enableAllVideos")) {
+      enableAllVideos = new Parameter.fromJson(_json["enableAllVideos"]);
+    }
+    if (_json.containsKey("eventName")) {
+      eventName = new Parameter.fromJson(_json["eventName"]);
+    }
+    if (_json.containsKey("filter")) {
+      filter = _json["filter"].map((value) => new Condition.fromJson(value)).toList();
+    }
+    if (_json.containsKey("fingerprint")) {
+      fingerprint = _json["fingerprint"];
+    }
+    if (_json.containsKey("interval")) {
+      interval = new Parameter.fromJson(_json["interval"]);
+    }
+    if (_json.containsKey("limit")) {
+      limit = new Parameter.fromJson(_json["limit"]);
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("triggerId")) {
+      triggerId = _json["triggerId"];
+    }
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+    if (_json.containsKey("uniqueTriggerId")) {
+      uniqueTriggerId = new Parameter.fromJson(_json["uniqueTriggerId"]);
+    }
+    if (_json.containsKey("videoPercentageList")) {
+      videoPercentageList = new Parameter.fromJson(_json["videoPercentageList"]);
+    }
+    if (_json.containsKey("waitForTags")) {
+      waitForTags = new Parameter.fromJson(_json["waitForTags"]);
+    }
+    if (_json.containsKey("waitForTagsTimeout")) {
+      waitForTagsTimeout = new Parameter.fromJson(_json["waitForTagsTimeout"]);
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (autoEventFilter != null) {
+      _json["autoEventFilter"] = autoEventFilter.map((value) => (value).toJson()).toList();
+    }
+    if (checkValidation != null) {
+      _json["checkValidation"] = (checkValidation).toJson();
+    }
+    if (containerId != null) {
+      _json["containerId"] = containerId;
+    }
+    if (customEventFilter != null) {
+      _json["customEventFilter"] = customEventFilter.map((value) => (value).toJson()).toList();
+    }
+    if (enableAllVideos != null) {
+      _json["enableAllVideos"] = (enableAllVideos).toJson();
+    }
+    if (eventName != null) {
+      _json["eventName"] = (eventName).toJson();
+    }
+    if (filter != null) {
+      _json["filter"] = filter.map((value) => (value).toJson()).toList();
+    }
+    if (fingerprint != null) {
+      _json["fingerprint"] = fingerprint;
+    }
+    if (interval != null) {
+      _json["interval"] = (interval).toJson();
+    }
+    if (limit != null) {
+      _json["limit"] = (limit).toJson();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (triggerId != null) {
+      _json["triggerId"] = triggerId;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    if (uniqueTriggerId != null) {
+      _json["uniqueTriggerId"] = (uniqueTriggerId).toJson();
+    }
+    if (videoPercentageList != null) {
+      _json["videoPercentageList"] = (videoPercentageList).toJson();
+    }
+    if (waitForTags != null) {
+      _json["waitForTags"] = (waitForTags).toJson();
+    }
+    if (waitForTagsTimeout != null) {
+      _json["waitForTagsTimeout"] = (waitForTagsTimeout).toJson();
+    }
+    return _json;
+  }
+}
+
+
+/** Represents a user's permissions to an account and its container. */
+class UserAccess {
+  /** GTM Account access permissions. */
+  AccountAccess accountAccess;
+
+  /** GTM Account ID. */
+  core.String accountId;
+
+  /** GTM Container access permissions. */
+  core.List<ContainerAccess> containerAccess;
+
+  /** User's email address. */
+  core.String emailAddress;
+
+  /** Account Permission ID. */
+  core.String permissionId;
+
+
+  UserAccess();
+
+  UserAccess.fromJson(core.Map _json) {
+    if (_json.containsKey("accountAccess")) {
+      accountAccess = new AccountAccess.fromJson(_json["accountAccess"]);
+    }
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("containerAccess")) {
+      containerAccess = _json["containerAccess"].map((value) => new ContainerAccess.fromJson(value)).toList();
+    }
+    if (_json.containsKey("emailAddress")) {
+      emailAddress = _json["emailAddress"];
+    }
+    if (_json.containsKey("permissionId")) {
+      permissionId = _json["permissionId"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (accountAccess != null) {
+      _json["accountAccess"] = (accountAccess).toJson();
+    }
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (containerAccess != null) {
+      _json["containerAccess"] = containerAccess.map((value) => (value).toJson()).toList();
+    }
+    if (emailAddress != null) {
+      _json["emailAddress"] = emailAddress;
+    }
+    if (permissionId != null) {
+      _json["permissionId"] = permissionId;
+    }
+    return _json;
+  }
+}
+
+
+/** Represents a Google Tag Manager Variable. */
+class Variable {
+  /** GTM Account ID. */
+  core.String accountId;
+
+  /** GTM Container ID. */
+  core.String containerId;
+
+  /**
+   * For mobile containers only: A list of trigger IDs for disabling conditional
+   * variables; the variable is enabled if one of the enabling trigger is true
+   * while all the disabling trigger are false. Treated as an unordered set.
+   */
+  core.List<core.String> disablingTriggerId;
+
+  /**
+   * For mobile containers only: A list of trigger IDs for enabling conditional
+   * variables; the variable is enabled if one of the enabling triggers is true
+   * while all the disabling triggers are false. Treated as an unordered set.
+   */
+  core.List<core.String> enablingTriggerId;
+
+  /**
+   * The fingerprint of the GTM Variable as computed at storage time. This value
+   * is recomputed whenever the variable is modified.
+   */
+  core.String fingerprint;
+
+  /** Variable display name. */
+  core.String name;
+
+  /** User notes on how to apply this variable in the container. */
+  core.String notes;
+
+  /** The variable's parameters. */
+  core.List<Parameter> parameter;
+
+  /** The end timestamp in milliseconds to schedule a variable. */
+  core.String scheduleEndMs;
+
+  /** The start timestamp in milliseconds to schedule a variable. */
+  core.String scheduleStartMs;
+
+  /** GTM Variable Type. */
+  core.String type;
+
+  /** The Variable ID uniquely identifies the GTM Variable. */
+  core.String variableId;
+
+
+  Variable();
+
+  Variable.fromJson(core.Map _json) {
+    if (_json.containsKey("accountId")) {
+      accountId = _json["accountId"];
+    }
+    if (_json.containsKey("containerId")) {
+      containerId = _json["containerId"];
+    }
+    if (_json.containsKey("disablingTriggerId")) {
+      disablingTriggerId = _json["disablingTriggerId"];
+    }
+    if (_json.containsKey("enablingTriggerId")) {
+      enablingTriggerId = _json["enablingTriggerId"];
+    }
+    if (_json.containsKey("fingerprint")) {
+      fingerprint = _json["fingerprint"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("notes")) {
+      notes = _json["notes"];
+    }
+    if (_json.containsKey("parameter")) {
+      parameter = _json["parameter"].map((value) => new Parameter.fromJson(value)).toList();
+    }
+    if (_json.containsKey("scheduleEndMs")) {
+      scheduleEndMs = _json["scheduleEndMs"];
+    }
+    if (_json.containsKey("scheduleStartMs")) {
+      scheduleStartMs = _json["scheduleStartMs"];
+    }
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+    if (_json.containsKey("variableId")) {
+      variableId = _json["variableId"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (accountId != null) {
+      _json["accountId"] = accountId;
+    }
+    if (containerId != null) {
+      _json["containerId"] = containerId;
+    }
+    if (disablingTriggerId != null) {
+      _json["disablingTriggerId"] = disablingTriggerId;
+    }
+    if (enablingTriggerId != null) {
+      _json["enablingTriggerId"] = enablingTriggerId;
+    }
+    if (fingerprint != null) {
+      _json["fingerprint"] = fingerprint;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (notes != null) {
+      _json["notes"] = notes;
+    }
+    if (parameter != null) {
+      _json["parameter"] = parameter.map((value) => (value).toJson()).toList();
+    }
+    if (scheduleEndMs != null) {
+      _json["scheduleEndMs"] = scheduleEndMs;
+    }
+    if (scheduleStartMs != null) {
+      _json["scheduleStartMs"] = scheduleStartMs;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    if (variableId != null) {
+      _json["variableId"] = variableId;
+    }
+    return _json;
+  }
+}
+
+
diff --git a/generated/googleapis/pubspec.yaml b/generated/googleapis/pubspec.yaml
index 5690b44..d522941 100644
--- a/generated/googleapis/pubspec.yaml
+++ b/generated/googleapis/pubspec.yaml
@@ -1,7 +1,7 @@
 name: googleapis
-version: 0.3.1
+version: 0.4.0
 author: Dart Team <misc@dartlang.org>
-description: "Auto-generated client libraries for accessing the following APIs:adexchangebuyer:v1.3, adexchangeseller:v1.1, adexchangeseller:v2.0, admin:directory_v1, admin:email_migration_v2, admin:reports_v1, adsense:v1.4, adsensehost:v4.1, analytics:v3, androidpublisher:v2, appsactivity:v1, appstate:v1, bigquery:v2, blogger:v3, books:v1, calendar:v3, civicinfo:us_v1, civicinfo:v1, civicinfo:v2, compute:v1, content:v2, coordinate:v1, customsearch:v1, dfareporting:v1.3, discovery:v1, doubleclickbidmanager:v1, doubleclicksearch:v2, drive:v2, freebase:v1, fusiontables:v1, games:v1, gamesManagement:v1management, gmail:v1, groupsmigration:v1, groupssettings:v1, identitytoolkit:v3, licensing:v1, mapsengine:v1, mirror:v1, oauth2:v2, pagespeedonline:v1, plus:v1, plusDomains:v1, prediction:v1.6, qpxExpress:v1, reseller:v1, siteVerification:v1, storage:v1, tasks:v1, translate:v2, urlshortener:v1, webfonts:v1, webmasters:v3, youtube:v3, youtubeAnalytics:v1"
+description: "Auto-generated client libraries for accessing the following APIs:adexchangebuyer:v1.3, adexchangeseller:v1.1, adexchangeseller:v2.0, admin:directory_v1, admin:email_migration_v2, admin:reports_v1, adsense:v1.4, adsensehost:v4.1, analytics:v3, androidpublisher:v2, appsactivity:v1, appstate:v1, bigquery:v2, blogger:v3, books:v1, calendar:v3, civicinfo:us_v1, civicinfo:v1, civicinfo:v2, compute:v1, content:v2, coordinate:v1, customsearch:v1, dfareporting:v1.3, discovery:v1, doubleclickbidmanager:v1, doubleclicksearch:v2, drive:v2, fitness:v1, freebase:v1, fusiontables:v1, games:v1, gamesManagement:v1management, gmail:v1, groupsmigration:v1, groupssettings:v1, identitytoolkit:v3, licensing:v1, mapsengine:v1, mirror:v1, oauth2:v2, pagespeedonline:v1, plus:v1, plusDomains:v1, prediction:v1.6, qpxExpress:v1, reseller:v1, siteVerification:v1, storage:v1, tagmanager:v1, tasks:v1, translate:v2, urlshortener:v1, webfonts:v1, webmasters:v3, youtube:v3, youtubeAnalytics:v1"
 homepage: http://www.dartlang.org/googleapis/
 environment:
   sdk: '>=1.0.0 <2.0.0'
diff --git a/generated/googleapis/test/adexchangebuyer/v1_3_test.dart b/generated/googleapis/test/adexchangebuyer/v1_3_test.dart
index b28a287..0bb3ffb 100644
--- a/generated/googleapis/test/adexchangebuyer/v1_3_test.dart
+++ b/generated/googleapis/test/adexchangebuyer/v1_3_test.dart
@@ -39,14 +39,14 @@
   buildCounterAccountBidderLocation--;
 }
 
-buildUnnamed548() {
+buildUnnamed0() {
   var o = new core.List<api.AccountBidderLocation>();
   o.add(buildAccountBidderLocation());
   o.add(buildAccountBidderLocation());
   return o;
 }
 
-checkUnnamed548(core.List<api.AccountBidderLocation> o) {
+checkUnnamed0(core.List<api.AccountBidderLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountBidderLocation(o[0]);
   checkAccountBidderLocation(o[1]);
@@ -57,12 +57,14 @@
   var o = new api.Account();
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    o.bidderLocation = buildUnnamed548();
+    o.bidderLocation = buildUnnamed0();
     o.cookieMatchingNid = "foo";
     o.cookieMatchingUrl = "foo";
     o.id = 42;
     o.kind = "foo";
+    o.maximumActiveCreatives = 42;
     o.maximumTotalQps = 42;
+    o.numberActiveCreatives = 42;
   }
   buildCounterAccount--;
   return o;
@@ -71,24 +73,26 @@
 checkAccount(api.Account o) {
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    checkUnnamed548(o.bidderLocation);
+    checkUnnamed0(o.bidderLocation);
     unittest.expect(o.cookieMatchingNid, unittest.equals('foo'));
     unittest.expect(o.cookieMatchingUrl, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
+    unittest.expect(o.maximumActiveCreatives, unittest.equals(42));
     unittest.expect(o.maximumTotalQps, unittest.equals(42));
+    unittest.expect(o.numberActiveCreatives, unittest.equals(42));
   }
   buildCounterAccount--;
 }
 
-buildUnnamed549() {
+buildUnnamed1() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed549(core.List<api.Account> o) {
+checkUnnamed1(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -99,7 +103,7 @@
   var o = new api.AccountsList();
   buildCounterAccountsList++;
   if (buildCounterAccountsList < 3) {
-    o.items = buildUnnamed549();
+    o.items = buildUnnamed1();
     o.kind = "foo";
   }
   buildCounterAccountsList--;
@@ -109,20 +113,20 @@
 checkAccountsList(api.AccountsList o) {
   buildCounterAccountsList++;
   if (buildCounterAccountsList < 3) {
-    checkUnnamed549(o.items);
+    checkUnnamed1(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountsList--;
 }
 
-buildUnnamed550() {
+buildUnnamed2() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed550(core.List<core.String> o) {
+checkUnnamed2(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -135,7 +139,7 @@
   if (buildCounterBillingInfo < 3) {
     o.accountId = 42;
     o.accountName = "foo";
-    o.billingId = buildUnnamed550();
+    o.billingId = buildUnnamed2();
     o.kind = "foo";
   }
   buildCounterBillingInfo--;
@@ -147,20 +151,20 @@
   if (buildCounterBillingInfo < 3) {
     unittest.expect(o.accountId, unittest.equals(42));
     unittest.expect(o.accountName, unittest.equals('foo'));
-    checkUnnamed550(o.billingId);
+    checkUnnamed2(o.billingId);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBillingInfo--;
 }
 
-buildUnnamed551() {
+buildUnnamed3() {
   var o = new core.List<api.BillingInfo>();
   o.add(buildBillingInfo());
   o.add(buildBillingInfo());
   return o;
 }
 
-checkUnnamed551(core.List<api.BillingInfo> o) {
+checkUnnamed3(core.List<api.BillingInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBillingInfo(o[0]);
   checkBillingInfo(o[1]);
@@ -171,7 +175,7 @@
   var o = new api.BillingInfoList();
   buildCounterBillingInfoList++;
   if (buildCounterBillingInfoList < 3) {
-    o.items = buildUnnamed551();
+    o.items = buildUnnamed3();
     o.kind = "foo";
   }
   buildCounterBillingInfoList--;
@@ -181,59 +185,59 @@
 checkBillingInfoList(api.BillingInfoList o) {
   buildCounterBillingInfoList++;
   if (buildCounterBillingInfoList < 3) {
-    checkUnnamed551(o.items);
+    checkUnnamed3(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBillingInfoList--;
 }
 
-buildUnnamed552() {
+buildUnnamed4() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed552(core.List<core.String> o) {
+checkUnnamed4(core.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() {
+buildUnnamed5() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed553(core.List<core.int> o) {
+checkUnnamed5(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));
 }
 
-buildUnnamed554() {
+buildUnnamed6() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed554(core.List<core.String> o) {
+checkUnnamed6(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed555() {
+buildUnnamed7() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed555(core.List<core.String> o) {
+checkUnnamed7(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -244,7 +248,7 @@
   var o = new api.CreativeCorrections();
   buildCounterCreativeCorrections++;
   if (buildCounterCreativeCorrections < 3) {
-    o.details = buildUnnamed555();
+    o.details = buildUnnamed7();
     o.reason = "foo";
   }
   buildCounterCreativeCorrections--;
@@ -254,33 +258,33 @@
 checkCreativeCorrections(api.CreativeCorrections o) {
   buildCounterCreativeCorrections++;
   if (buildCounterCreativeCorrections < 3) {
-    checkUnnamed555(o.details);
+    checkUnnamed7(o.details);
     unittest.expect(o.reason, unittest.equals('foo'));
   }
   buildCounterCreativeCorrections--;
 }
 
-buildUnnamed556() {
+buildUnnamed8() {
   var o = new core.List<api.CreativeCorrections>();
   o.add(buildCreativeCorrections());
   o.add(buildCreativeCorrections());
   return o;
 }
 
-checkUnnamed556(core.List<api.CreativeCorrections> o) {
+checkUnnamed8(core.List<api.CreativeCorrections> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeCorrections(o[0]);
   checkCreativeCorrections(o[1]);
 }
 
-buildUnnamed557() {
+buildUnnamed9() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed557(core.List<core.String> o) {
+checkUnnamed9(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -291,7 +295,7 @@
   var o = new api.CreativeDisapprovalReasons();
   buildCounterCreativeDisapprovalReasons++;
   if (buildCounterCreativeDisapprovalReasons < 3) {
-    o.details = buildUnnamed557();
+    o.details = buildUnnamed9();
     o.reason = "foo";
   }
   buildCounterCreativeDisapprovalReasons--;
@@ -301,20 +305,20 @@
 checkCreativeDisapprovalReasons(api.CreativeDisapprovalReasons o) {
   buildCounterCreativeDisapprovalReasons++;
   if (buildCounterCreativeDisapprovalReasons < 3) {
-    checkUnnamed557(o.details);
+    checkUnnamed9(o.details);
     unittest.expect(o.reason, unittest.equals('foo'));
   }
   buildCounterCreativeDisapprovalReasons--;
 }
 
-buildUnnamed558() {
+buildUnnamed10() {
   var o = new core.List<api.CreativeDisapprovalReasons>();
   o.add(buildCreativeDisapprovalReasons());
   o.add(buildCreativeDisapprovalReasons());
   return o;
 }
 
-checkUnnamed558(core.List<api.CreativeDisapprovalReasons> o) {
+checkUnnamed10(core.List<api.CreativeDisapprovalReasons> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeDisapprovalReasons(o[0]);
   checkCreativeDisapprovalReasons(o[1]);
@@ -341,14 +345,14 @@
   buildCounterCreativeFilteringReasonsReasons--;
 }
 
-buildUnnamed559() {
+buildUnnamed11() {
   var o = new core.List<api.CreativeFilteringReasonsReasons>();
   o.add(buildCreativeFilteringReasonsReasons());
   o.add(buildCreativeFilteringReasonsReasons());
   return o;
 }
 
-checkUnnamed559(core.List<api.CreativeFilteringReasonsReasons> o) {
+checkUnnamed11(core.List<api.CreativeFilteringReasonsReasons> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeFilteringReasonsReasons(o[0]);
   checkCreativeFilteringReasonsReasons(o[1]);
@@ -360,7 +364,7 @@
   buildCounterCreativeFilteringReasons++;
   if (buildCounterCreativeFilteringReasons < 3) {
     o.date = "foo";
-    o.reasons = buildUnnamed559();
+    o.reasons = buildUnnamed11();
   }
   buildCounterCreativeFilteringReasons--;
   return o;
@@ -370,58 +374,58 @@
   buildCounterCreativeFilteringReasons++;
   if (buildCounterCreativeFilteringReasons < 3) {
     unittest.expect(o.date, unittest.equals('foo'));
-    checkUnnamed559(o.reasons);
+    checkUnnamed11(o.reasons);
   }
   buildCounterCreativeFilteringReasons--;
 }
 
-buildUnnamed560() {
+buildUnnamed12() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed560(core.List<core.int> o) {
+checkUnnamed12(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));
 }
 
-buildUnnamed561() {
+buildUnnamed13() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed561(core.List<core.int> o) {
+checkUnnamed13(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));
 }
 
-buildUnnamed562() {
+buildUnnamed14() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed562(core.List<core.int> o) {
+checkUnnamed14(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));
 }
 
-buildUnnamed563() {
+buildUnnamed15() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed563(core.List<core.int> o) {
+checkUnnamed15(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));
@@ -434,22 +438,22 @@
   if (buildCounterCreative < 3) {
     o.HTMLSnippet = "foo";
     o.accountId = 42;
-    o.advertiserId = buildUnnamed552();
+    o.advertiserId = buildUnnamed4();
     o.advertiserName = "foo";
     o.agencyId = "foo";
-    o.attribute = buildUnnamed553();
+    o.attribute = buildUnnamed5();
     o.buyerCreativeId = "foo";
-    o.clickThroughUrl = buildUnnamed554();
-    o.corrections = buildUnnamed556();
-    o.disapprovalReasons = buildUnnamed558();
+    o.clickThroughUrl = buildUnnamed6();
+    o.corrections = buildUnnamed8();
+    o.disapprovalReasons = buildUnnamed10();
     o.filteringReasons = buildCreativeFilteringReasons();
     o.height = 42;
     o.kind = "foo";
-    o.productCategories = buildUnnamed560();
-    o.restrictedCategories = buildUnnamed561();
-    o.sensitiveCategories = buildUnnamed562();
+    o.productCategories = buildUnnamed12();
+    o.restrictedCategories = buildUnnamed13();
+    o.sensitiveCategories = buildUnnamed14();
     o.status = "foo";
-    o.vendorType = buildUnnamed563();
+    o.vendorType = buildUnnamed15();
     o.videoURL = "foo";
     o.width = 42;
   }
@@ -462,36 +466,36 @@
   if (buildCounterCreative < 3) {
     unittest.expect(o.HTMLSnippet, unittest.equals('foo'));
     unittest.expect(o.accountId, unittest.equals(42));
-    checkUnnamed552(o.advertiserId);
+    checkUnnamed4(o.advertiserId);
     unittest.expect(o.advertiserName, unittest.equals('foo'));
     unittest.expect(o.agencyId, unittest.equals('foo'));
-    checkUnnamed553(o.attribute);
+    checkUnnamed5(o.attribute);
     unittest.expect(o.buyerCreativeId, unittest.equals('foo'));
-    checkUnnamed554(o.clickThroughUrl);
-    checkUnnamed556(o.corrections);
-    checkUnnamed558(o.disapprovalReasons);
+    checkUnnamed6(o.clickThroughUrl);
+    checkUnnamed8(o.corrections);
+    checkUnnamed10(o.disapprovalReasons);
     checkCreativeFilteringReasons(o.filteringReasons);
     unittest.expect(o.height, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed560(o.productCategories);
-    checkUnnamed561(o.restrictedCategories);
-    checkUnnamed562(o.sensitiveCategories);
+    checkUnnamed12(o.productCategories);
+    checkUnnamed13(o.restrictedCategories);
+    checkUnnamed14(o.sensitiveCategories);
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed563(o.vendorType);
+    checkUnnamed15(o.vendorType);
     unittest.expect(o.videoURL, unittest.equals('foo'));
     unittest.expect(o.width, unittest.equals(42));
   }
   buildCounterCreative--;
 }
 
-buildUnnamed564() {
+buildUnnamed16() {
   var o = new core.List<api.Creative>();
   o.add(buildCreative());
   o.add(buildCreative());
   return o;
 }
 
-checkUnnamed564(core.List<api.Creative> o) {
+checkUnnamed16(core.List<api.Creative> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreative(o[0]);
   checkCreative(o[1]);
@@ -502,7 +506,7 @@
   var o = new api.CreativesList();
   buildCounterCreativesList++;
   if (buildCounterCreativesList < 3) {
-    o.items = buildUnnamed564();
+    o.items = buildUnnamed16();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -513,7 +517,7 @@
 checkCreativesList(api.CreativesList o) {
   buildCounterCreativesList++;
   if (buildCounterCreativesList < 3) {
-    checkUnnamed564(o.items);
+    checkUnnamed16(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -561,14 +565,14 @@
   buildCounterDirectDeal--;
 }
 
-buildUnnamed565() {
+buildUnnamed17() {
   var o = new core.List<api.DirectDeal>();
   o.add(buildDirectDeal());
   o.add(buildDirectDeal());
   return o;
 }
 
-checkUnnamed565(core.List<api.DirectDeal> o) {
+checkUnnamed17(core.List<api.DirectDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDirectDeal(o[0]);
   checkDirectDeal(o[1]);
@@ -579,7 +583,7 @@
   var o = new api.DirectDealsList();
   buildCounterDirectDealsList++;
   if (buildCounterDirectDealsList < 3) {
-    o.directDeals = buildUnnamed565();
+    o.directDeals = buildUnnamed17();
     o.kind = "foo";
   }
   buildCounterDirectDealsList--;
@@ -589,59 +593,59 @@
 checkDirectDealsList(api.DirectDealsList o) {
   buildCounterDirectDealsList++;
   if (buildCounterDirectDealsList < 3) {
-    checkUnnamed565(o.directDeals);
+    checkUnnamed17(o.directDeals);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDirectDealsList--;
 }
 
-buildUnnamed566() {
+buildUnnamed18() {
   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'});
   return o;
 }
 
-checkUnnamed566(core.List<core.Object> o) {
+checkUnnamed18(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')); 
 }
 
-buildUnnamed567() {
+buildUnnamed19() {
   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'});
   return o;
 }
 
-checkUnnamed567(core.List<core.Object> o) {
+checkUnnamed19(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')); 
 }
 
-buildUnnamed568() {
+buildUnnamed20() {
   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'});
   return o;
 }
 
-checkUnnamed568(core.List<core.Object> o) {
+checkUnnamed20(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')); 
 }
 
-buildUnnamed569() {
+buildUnnamed21() {
   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'});
   return o;
 }
 
-checkUnnamed569(core.List<core.Object> o) {
+checkUnnamed21(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')); 
@@ -652,10 +656,10 @@
   var o = new api.PerformanceReport();
   buildCounterPerformanceReport++;
   if (buildCounterPerformanceReport < 3) {
-    o.calloutStatusRate = buildUnnamed566();
-    o.cookieMatcherStatusRate = buildUnnamed567();
-    o.creativeStatusRate = buildUnnamed568();
-    o.hostedMatchStatusRate = buildUnnamed569();
+    o.calloutStatusRate = buildUnnamed18();
+    o.cookieMatcherStatusRate = buildUnnamed19();
+    o.creativeStatusRate = buildUnnamed20();
+    o.hostedMatchStatusRate = buildUnnamed21();
     o.kind = "foo";
     o.latency50thPercentile = 42.0;
     o.latency85thPercentile = 42.0;
@@ -676,10 +680,10 @@
 checkPerformanceReport(api.PerformanceReport o) {
   buildCounterPerformanceReport++;
   if (buildCounterPerformanceReport < 3) {
-    checkUnnamed566(o.calloutStatusRate);
-    checkUnnamed567(o.cookieMatcherStatusRate);
-    checkUnnamed568(o.creativeStatusRate);
-    checkUnnamed569(o.hostedMatchStatusRate);
+    checkUnnamed18(o.calloutStatusRate);
+    checkUnnamed19(o.cookieMatcherStatusRate);
+    checkUnnamed20(o.creativeStatusRate);
+    checkUnnamed21(o.hostedMatchStatusRate);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.latency50thPercentile, unittest.equals(42.0));
     unittest.expect(o.latency85thPercentile, unittest.equals(42.0));
@@ -696,14 +700,14 @@
   buildCounterPerformanceReport--;
 }
 
-buildUnnamed570() {
+buildUnnamed22() {
   var o = new core.List<api.PerformanceReport>();
   o.add(buildPerformanceReport());
   o.add(buildPerformanceReport());
   return o;
 }
 
-checkUnnamed570(core.List<api.PerformanceReport> o) {
+checkUnnamed22(core.List<api.PerformanceReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPerformanceReport(o[0]);
   checkPerformanceReport(o[1]);
@@ -715,7 +719,7 @@
   buildCounterPerformanceReportList++;
   if (buildCounterPerformanceReportList < 3) {
     o.kind = "foo";
-    o.performanceReport = buildUnnamed570();
+    o.performanceReport = buildUnnamed22();
   }
   buildCounterPerformanceReportList--;
   return o;
@@ -725,19 +729,19 @@
   buildCounterPerformanceReportList++;
   if (buildCounterPerformanceReportList < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed570(o.performanceReport);
+    checkUnnamed22(o.performanceReport);
   }
   buildCounterPerformanceReportList--;
 }
 
-buildUnnamed571() {
+buildUnnamed23() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed571(core.List<core.String> o) {
+checkUnnamed23(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -764,40 +768,40 @@
   buildCounterPretargetingConfigDimensions--;
 }
 
-buildUnnamed572() {
+buildUnnamed24() {
   var o = new core.List<api.PretargetingConfigDimensions>();
   o.add(buildPretargetingConfigDimensions());
   o.add(buildPretargetingConfigDimensions());
   return o;
 }
 
-checkUnnamed572(core.List<api.PretargetingConfigDimensions> o) {
+checkUnnamed24(core.List<api.PretargetingConfigDimensions> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPretargetingConfigDimensions(o[0]);
   checkPretargetingConfigDimensions(o[1]);
 }
 
-buildUnnamed573() {
+buildUnnamed25() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed573(core.List<core.String> o) {
+checkUnnamed25(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed574() {
+buildUnnamed26() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed574(core.List<core.String> 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'));
@@ -824,105 +828,105 @@
   buildCounterPretargetingConfigExcludedPlacements--;
 }
 
-buildUnnamed575() {
+buildUnnamed27() {
   var o = new core.List<api.PretargetingConfigExcludedPlacements>();
   o.add(buildPretargetingConfigExcludedPlacements());
   o.add(buildPretargetingConfigExcludedPlacements());
   return o;
 }
 
-checkUnnamed575(core.List<api.PretargetingConfigExcludedPlacements> o) {
+checkUnnamed27(core.List<api.PretargetingConfigExcludedPlacements> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPretargetingConfigExcludedPlacements(o[0]);
   checkPretargetingConfigExcludedPlacements(o[1]);
 }
 
-buildUnnamed576() {
+buildUnnamed28() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed576(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'));
 }
 
-buildUnnamed577() {
+buildUnnamed29() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed577(core.List<core.String> o) {
+checkUnnamed29(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed578() {
+buildUnnamed30() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed578(core.List<core.String> o) {
+checkUnnamed30(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed579() {
+buildUnnamed31() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed579(core.List<core.String> o) {
+checkUnnamed31(core.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() {
+buildUnnamed32() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed580(core.List<core.String> o) {
+checkUnnamed32(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed581() {
+buildUnnamed33() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed581(core.List<core.String> o) {
+checkUnnamed33(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed582() {
+buildUnnamed34() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed582(core.List<core.String> o) {
+checkUnnamed34(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -949,79 +953,79 @@
   buildCounterPretargetingConfigPlacements--;
 }
 
-buildUnnamed583() {
+buildUnnamed35() {
   var o = new core.List<api.PretargetingConfigPlacements>();
   o.add(buildPretargetingConfigPlacements());
   o.add(buildPretargetingConfigPlacements());
   return o;
 }
 
-checkUnnamed583(core.List<api.PretargetingConfigPlacements> o) {
+checkUnnamed35(core.List<api.PretargetingConfigPlacements> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPretargetingConfigPlacements(o[0]);
   checkPretargetingConfigPlacements(o[1]);
 }
 
-buildUnnamed584() {
+buildUnnamed36() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed584(core.List<core.String> o) {
+checkUnnamed36(core.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() {
+buildUnnamed37() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed585(core.List<core.String> o) {
+checkUnnamed37(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed586() {
+buildUnnamed38() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed586(core.List<core.String> o) {
+checkUnnamed38(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed587() {
+buildUnnamed39() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed587(core.List<core.String> o) {
+checkUnnamed39(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed588() {
+buildUnnamed40() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed588(core.List<core.String> o) {
+checkUnnamed40(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1035,26 +1039,26 @@
     o.billingId = "foo";
     o.configId = "foo";
     o.configName = "foo";
-    o.creativeType = buildUnnamed571();
-    o.dimensions = buildUnnamed572();
-    o.excludedContentLabels = buildUnnamed573();
-    o.excludedGeoCriteriaIds = buildUnnamed574();
-    o.excludedPlacements = buildUnnamed575();
-    o.excludedUserLists = buildUnnamed576();
-    o.excludedVerticals = buildUnnamed577();
-    o.geoCriteriaIds = buildUnnamed578();
+    o.creativeType = buildUnnamed23();
+    o.dimensions = buildUnnamed24();
+    o.excludedContentLabels = buildUnnamed25();
+    o.excludedGeoCriteriaIds = buildUnnamed26();
+    o.excludedPlacements = buildUnnamed27();
+    o.excludedUserLists = buildUnnamed28();
+    o.excludedVerticals = buildUnnamed29();
+    o.geoCriteriaIds = buildUnnamed30();
     o.isActive = true;
     o.kind = "foo";
-    o.languages = buildUnnamed579();
-    o.mobileCarriers = buildUnnamed580();
-    o.mobileDevices = buildUnnamed581();
-    o.mobileOperatingSystemVersions = buildUnnamed582();
-    o.placements = buildUnnamed583();
-    o.platforms = buildUnnamed584();
-    o.supportedCreativeAttributes = buildUnnamed585();
-    o.userLists = buildUnnamed586();
-    o.vendorTypes = buildUnnamed587();
-    o.verticals = buildUnnamed588();
+    o.languages = buildUnnamed31();
+    o.mobileCarriers = buildUnnamed32();
+    o.mobileDevices = buildUnnamed33();
+    o.mobileOperatingSystemVersions = buildUnnamed34();
+    o.placements = buildUnnamed35();
+    o.platforms = buildUnnamed36();
+    o.supportedCreativeAttributes = buildUnnamed37();
+    o.userLists = buildUnnamed38();
+    o.vendorTypes = buildUnnamed39();
+    o.verticals = buildUnnamed40();
   }
   buildCounterPretargetingConfig--;
   return o;
@@ -1066,38 +1070,38 @@
     unittest.expect(o.billingId, unittest.equals('foo'));
     unittest.expect(o.configId, unittest.equals('foo'));
     unittest.expect(o.configName, unittest.equals('foo'));
-    checkUnnamed571(o.creativeType);
-    checkUnnamed572(o.dimensions);
-    checkUnnamed573(o.excludedContentLabels);
-    checkUnnamed574(o.excludedGeoCriteriaIds);
-    checkUnnamed575(o.excludedPlacements);
-    checkUnnamed576(o.excludedUserLists);
-    checkUnnamed577(o.excludedVerticals);
-    checkUnnamed578(o.geoCriteriaIds);
+    checkUnnamed23(o.creativeType);
+    checkUnnamed24(o.dimensions);
+    checkUnnamed25(o.excludedContentLabels);
+    checkUnnamed26(o.excludedGeoCriteriaIds);
+    checkUnnamed27(o.excludedPlacements);
+    checkUnnamed28(o.excludedUserLists);
+    checkUnnamed29(o.excludedVerticals);
+    checkUnnamed30(o.geoCriteriaIds);
     unittest.expect(o.isActive, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed579(o.languages);
-    checkUnnamed580(o.mobileCarriers);
-    checkUnnamed581(o.mobileDevices);
-    checkUnnamed582(o.mobileOperatingSystemVersions);
-    checkUnnamed583(o.placements);
-    checkUnnamed584(o.platforms);
-    checkUnnamed585(o.supportedCreativeAttributes);
-    checkUnnamed586(o.userLists);
-    checkUnnamed587(o.vendorTypes);
-    checkUnnamed588(o.verticals);
+    checkUnnamed31(o.languages);
+    checkUnnamed32(o.mobileCarriers);
+    checkUnnamed33(o.mobileDevices);
+    checkUnnamed34(o.mobileOperatingSystemVersions);
+    checkUnnamed35(o.placements);
+    checkUnnamed36(o.platforms);
+    checkUnnamed37(o.supportedCreativeAttributes);
+    checkUnnamed38(o.userLists);
+    checkUnnamed39(o.vendorTypes);
+    checkUnnamed40(o.verticals);
   }
   buildCounterPretargetingConfig--;
 }
 
-buildUnnamed589() {
+buildUnnamed41() {
   var o = new core.List<api.PretargetingConfig>();
   o.add(buildPretargetingConfig());
   o.add(buildPretargetingConfig());
   return o;
 }
 
-checkUnnamed589(core.List<api.PretargetingConfig> o) {
+checkUnnamed41(core.List<api.PretargetingConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPretargetingConfig(o[0]);
   checkPretargetingConfig(o[1]);
@@ -1108,7 +1112,7 @@
   var o = new api.PretargetingConfigList();
   buildCounterPretargetingConfigList++;
   if (buildCounterPretargetingConfigList < 3) {
-    o.items = buildUnnamed589();
+    o.items = buildUnnamed41();
     o.kind = "foo";
   }
   buildCounterPretargetingConfigList--;
@@ -1118,33 +1122,33 @@
 checkPretargetingConfigList(api.PretargetingConfigList o) {
   buildCounterPretargetingConfigList++;
   if (buildCounterPretargetingConfigList < 3) {
-    checkUnnamed589(o.items);
+    checkUnnamed41(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPretargetingConfigList--;
 }
 
-buildUnnamed590() {
+buildUnnamed42() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed590(core.List<core.int> o) {
+checkUnnamed42(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));
 }
 
-buildUnnamed591() {
+buildUnnamed43() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed591(core.List<core.String> o) {
+checkUnnamed43(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1745,8 +1749,8 @@
 
       var mock = new common_test.HttpServerMock();
       api.CreativesResourceApi res = new api.AdexchangebuyerApi(mock).creatives;
-      var arg_accountId = buildUnnamed590();
-      var arg_buyerCreativeId = buildUnnamed591();
+      var arg_accountId = buildUnnamed42();
+      var arg_buyerCreativeId = buildUnnamed43();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_statusFilter = "foo";
diff --git a/generated/googleapis/test/adexchangeseller/v1_1_test.dart b/generated/googleapis/test/adexchangeseller/v1_1_test.dart
index 9229e3f..f2a2206 100644
--- a/generated/googleapis/test/adexchangeseller/v1_1_test.dart
+++ b/generated/googleapis/test/adexchangeseller/v1_1_test.dart
@@ -66,14 +66,14 @@
   buildCounterAdClient--;
 }
 
-buildUnnamed241() {
+buildUnnamed44() {
   var o = new core.List<api.AdClient>();
   o.add(buildAdClient());
   o.add(buildAdClient());
   return o;
 }
 
-checkUnnamed241(core.List<api.AdClient> o) {
+checkUnnamed44(core.List<api.AdClient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdClient(o[0]);
   checkAdClient(o[1]);
@@ -85,7 +85,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed241();
+    o.items = buildUnnamed44();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -97,7 +97,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed241(o.items);
+    checkUnnamed44(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -131,14 +131,14 @@
   buildCounterAdUnit--;
 }
 
-buildUnnamed242() {
+buildUnnamed45() {
   var o = new core.List<api.AdUnit>();
   o.add(buildAdUnit());
   o.add(buildAdUnit());
   return o;
 }
 
-checkUnnamed242(core.List<api.AdUnit> o) {
+checkUnnamed45(core.List<api.AdUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdUnit(o[0]);
   checkAdUnit(o[1]);
@@ -150,7 +150,7 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed242();
+    o.items = buildUnnamed45();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -162,7 +162,7 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed242(o.items);
+    checkUnnamed45(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -196,14 +196,14 @@
   buildCounterAlert--;
 }
 
-buildUnnamed243() {
+buildUnnamed46() {
   var o = new core.List<api.Alert>();
   o.add(buildAlert());
   o.add(buildAlert());
   return o;
 }
 
-checkUnnamed243(core.List<api.Alert> o) {
+checkUnnamed46(core.List<api.Alert> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAlert(o[0]);
   checkAlert(o[1]);
@@ -214,7 +214,7 @@
   var o = new api.Alerts();
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    o.items = buildUnnamed243();
+    o.items = buildUnnamed46();
     o.kind = "foo";
   }
   buildCounterAlerts--;
@@ -224,7 +224,7 @@
 checkAlerts(api.Alerts o) {
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    checkUnnamed243(o.items);
+    checkUnnamed46(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAlerts--;
@@ -282,14 +282,14 @@
   buildCounterCustomChannel--;
 }
 
-buildUnnamed244() {
+buildUnnamed47() {
   var o = new core.List<api.CustomChannel>();
   o.add(buildCustomChannel());
   o.add(buildCustomChannel());
   return o;
 }
 
-checkUnnamed244(core.List<api.CustomChannel> o) {
+checkUnnamed47(core.List<api.CustomChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomChannel(o[0]);
   checkCustomChannel(o[1]);
@@ -301,7 +301,7 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed244();
+    o.items = buildUnnamed47();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -313,21 +313,21 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed244(o.items);
+    checkUnnamed47(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCustomChannels--;
 }
 
-buildUnnamed245() {
+buildUnnamed48() {
   var o = new core.List<api.ReportingMetadataEntry>();
   o.add(buildReportingMetadataEntry());
   o.add(buildReportingMetadataEntry());
   return o;
 }
 
-checkUnnamed245(core.List<api.ReportingMetadataEntry> o) {
+checkUnnamed48(core.List<api.ReportingMetadataEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportingMetadataEntry(o[0]);
   checkReportingMetadataEntry(o[1]);
@@ -338,7 +338,7 @@
   var o = new api.Metadata();
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    o.items = buildUnnamed245();
+    o.items = buildUnnamed48();
     o.kind = "foo";
   }
   buildCounterMetadata--;
@@ -348,7 +348,7 @@
 checkMetadata(api.Metadata o) {
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    checkUnnamed245(o.items);
+    checkUnnamed48(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterMetadata--;
@@ -387,14 +387,14 @@
   buildCounterPreferredDeal--;
 }
 
-buildUnnamed246() {
+buildUnnamed49() {
   var o = new core.List<api.PreferredDeal>();
   o.add(buildPreferredDeal());
   o.add(buildPreferredDeal());
   return o;
 }
 
-checkUnnamed246(core.List<api.PreferredDeal> o) {
+checkUnnamed49(core.List<api.PreferredDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPreferredDeal(o[0]);
   checkPreferredDeal(o[1]);
@@ -405,7 +405,7 @@
   var o = new api.PreferredDeals();
   buildCounterPreferredDeals++;
   if (buildCounterPreferredDeals < 3) {
-    o.items = buildUnnamed246();
+    o.items = buildUnnamed49();
     o.kind = "foo";
   }
   buildCounterPreferredDeals--;
@@ -415,20 +415,20 @@
 checkPreferredDeals(api.PreferredDeals o) {
   buildCounterPreferredDeals++;
   if (buildCounterPreferredDeals < 3) {
-    checkUnnamed246(o.items);
+    checkUnnamed49(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPreferredDeals--;
 }
 
-buildUnnamed247() {
+buildUnnamed50() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed247(core.List<core.String> o) {
+checkUnnamed50(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -457,66 +457,66 @@
   buildCounterReportHeaders--;
 }
 
-buildUnnamed248() {
+buildUnnamed51() {
   var o = new core.List<api.ReportHeaders>();
   o.add(buildReportHeaders());
   o.add(buildReportHeaders());
   return o;
 }
 
-checkUnnamed248(core.List<api.ReportHeaders> o) {
+checkUnnamed51(core.List<api.ReportHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportHeaders(o[0]);
   checkReportHeaders(o[1]);
 }
 
-buildUnnamed249() {
+buildUnnamed52() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed249(core.List<core.String> o) {
+checkUnnamed52(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed250() {
+buildUnnamed53() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed249());
-  o.add(buildUnnamed249());
+  o.add(buildUnnamed52());
+  o.add(buildUnnamed52());
   return o;
 }
 
-checkUnnamed250(core.List<core.List<core.String>> o) {
+checkUnnamed53(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed249(o[0]);
-  checkUnnamed249(o[1]);
+  checkUnnamed52(o[0]);
+  checkUnnamed52(o[1]);
 }
 
-buildUnnamed251() {
+buildUnnamed54() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed251(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'));
 }
 
-buildUnnamed252() {
+buildUnnamed55() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed252(core.List<core.String> o) {
+checkUnnamed55(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -527,13 +527,13 @@
   var o = new api.Report();
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    o.averages = buildUnnamed247();
-    o.headers = buildUnnamed248();
+    o.averages = buildUnnamed50();
+    o.headers = buildUnnamed51();
     o.kind = "foo";
-    o.rows = buildUnnamed250();
+    o.rows = buildUnnamed53();
     o.totalMatchedRows = "foo";
-    o.totals = buildUnnamed251();
-    o.warnings = buildUnnamed252();
+    o.totals = buildUnnamed54();
+    o.warnings = buildUnnamed55();
   }
   buildCounterReport--;
   return o;
@@ -542,77 +542,77 @@
 checkReport(api.Report o) {
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    checkUnnamed247(o.averages);
-    checkUnnamed248(o.headers);
+    checkUnnamed50(o.averages);
+    checkUnnamed51(o.headers);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed250(o.rows);
+    checkUnnamed53(o.rows);
     unittest.expect(o.totalMatchedRows, unittest.equals('foo'));
-    checkUnnamed251(o.totals);
-    checkUnnamed252(o.warnings);
+    checkUnnamed54(o.totals);
+    checkUnnamed55(o.warnings);
   }
   buildCounterReport--;
 }
 
-buildUnnamed253() {
+buildUnnamed56() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed253(core.List<core.String> o) {
+checkUnnamed56(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed254() {
+buildUnnamed57() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed254(core.List<core.String> o) {
+checkUnnamed57(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed255() {
+buildUnnamed58() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed255(core.List<core.String> o) {
+checkUnnamed58(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed256() {
+buildUnnamed59() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed256(core.List<core.String> o) {
+checkUnnamed59(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed257() {
+buildUnnamed60() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed257(core.List<core.String> o) {
+checkUnnamed60(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -623,13 +623,13 @@
   var o = new api.ReportingMetadataEntry();
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    o.compatibleDimensions = buildUnnamed253();
-    o.compatibleMetrics = buildUnnamed254();
+    o.compatibleDimensions = buildUnnamed56();
+    o.compatibleMetrics = buildUnnamed57();
     o.id = "foo";
     o.kind = "foo";
-    o.requiredDimensions = buildUnnamed255();
-    o.requiredMetrics = buildUnnamed256();
-    o.supportedProducts = buildUnnamed257();
+    o.requiredDimensions = buildUnnamed58();
+    o.requiredMetrics = buildUnnamed59();
+    o.supportedProducts = buildUnnamed60();
   }
   buildCounterReportingMetadataEntry--;
   return o;
@@ -638,13 +638,13 @@
 checkReportingMetadataEntry(api.ReportingMetadataEntry o) {
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    checkUnnamed253(o.compatibleDimensions);
-    checkUnnamed254(o.compatibleMetrics);
+    checkUnnamed56(o.compatibleDimensions);
+    checkUnnamed57(o.compatibleMetrics);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed255(o.requiredDimensions);
-    checkUnnamed256(o.requiredMetrics);
-    checkUnnamed257(o.supportedProducts);
+    checkUnnamed58(o.requiredDimensions);
+    checkUnnamed59(o.requiredMetrics);
+    checkUnnamed60(o.supportedProducts);
   }
   buildCounterReportingMetadataEntry--;
 }
@@ -672,14 +672,14 @@
   buildCounterSavedReport--;
 }
 
-buildUnnamed258() {
+buildUnnamed61() {
   var o = new core.List<api.SavedReport>();
   o.add(buildSavedReport());
   o.add(buildSavedReport());
   return o;
 }
 
-checkUnnamed258(core.List<api.SavedReport> o) {
+checkUnnamed61(core.List<api.SavedReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSavedReport(o[0]);
   checkSavedReport(o[1]);
@@ -691,7 +691,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed258();
+    o.items = buildUnnamed61();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -703,7 +703,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed258(o.items);
+    checkUnnamed61(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -733,14 +733,14 @@
   buildCounterUrlChannel--;
 }
 
-buildUnnamed259() {
+buildUnnamed62() {
   var o = new core.List<api.UrlChannel>();
   o.add(buildUrlChannel());
   o.add(buildUrlChannel());
   return o;
 }
 
-checkUnnamed259(core.List<api.UrlChannel> o) {
+checkUnnamed62(core.List<api.UrlChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlChannel(o[0]);
   checkUrlChannel(o[1]);
@@ -752,7 +752,7 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed259();
+    o.items = buildUnnamed62();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -764,60 +764,60 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed259(o.items);
+    checkUnnamed62(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterUrlChannels--;
 }
 
-buildUnnamed260() {
+buildUnnamed63() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed260(core.List<core.String> o) {
+checkUnnamed63(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed261() {
+buildUnnamed64() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed261(core.List<core.String> o) {
+checkUnnamed64(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed262() {
+buildUnnamed65() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed262(core.List<core.String> o) {
+checkUnnamed65(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed263() {
+buildUnnamed66() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed263(core.List<core.String> o) {
+checkUnnamed66(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1745,12 +1745,12 @@
       api.ReportsResourceApi res = new api.AdexchangesellerApi(mock).reports;
       var arg_startDate = "foo";
       var arg_endDate = "foo";
-      var arg_dimension = buildUnnamed260();
-      var arg_filter = buildUnnamed261();
+      var arg_dimension = buildUnnamed63();
+      var arg_filter = buildUnnamed64();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed262();
-      var arg_sort = buildUnnamed263();
+      var arg_metric = buildUnnamed65();
+      var arg_sort = buildUnnamed66();
       var arg_startIndex = 42;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
diff --git a/generated/googleapis/test/adexchangeseller/v2_0_test.dart b/generated/googleapis/test/adexchangeseller/v2_0_test.dart
index 484827b..24196e8 100644
--- a/generated/googleapis/test/adexchangeseller/v2_0_test.dart
+++ b/generated/googleapis/test/adexchangeseller/v2_0_test.dart
@@ -39,14 +39,14 @@
   buildCounterAccount--;
 }
 
-buildUnnamed776() {
+buildUnnamed67() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed776(core.List<api.Account> o) {
+checkUnnamed67(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -58,7 +58,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed776();
+    o.items = buildUnnamed67();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -70,7 +70,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed776(o.items);
+    checkUnnamed67(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -104,14 +104,14 @@
   buildCounterAdClient--;
 }
 
-buildUnnamed777() {
+buildUnnamed68() {
   var o = new core.List<api.AdClient>();
   o.add(buildAdClient());
   o.add(buildAdClient());
   return o;
 }
 
-checkUnnamed777(core.List<api.AdClient> o) {
+checkUnnamed68(core.List<api.AdClient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdClient(o[0]);
   checkAdClient(o[1]);
@@ -123,7 +123,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed777();
+    o.items = buildUnnamed68();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -135,7 +135,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed777(o.items);
+    checkUnnamed68(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -169,14 +169,14 @@
   buildCounterAlert--;
 }
 
-buildUnnamed778() {
+buildUnnamed69() {
   var o = new core.List<api.Alert>();
   o.add(buildAlert());
   o.add(buildAlert());
   return o;
 }
 
-checkUnnamed778(core.List<api.Alert> o) {
+checkUnnamed69(core.List<api.Alert> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAlert(o[0]);
   checkAlert(o[1]);
@@ -187,7 +187,7 @@
   var o = new api.Alerts();
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    o.items = buildUnnamed778();
+    o.items = buildUnnamed69();
     o.kind = "foo";
   }
   buildCounterAlerts--;
@@ -197,7 +197,7 @@
 checkAlerts(api.Alerts o) {
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    checkUnnamed778(o.items);
+    checkUnnamed69(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAlerts--;
@@ -255,14 +255,14 @@
   buildCounterCustomChannel--;
 }
 
-buildUnnamed779() {
+buildUnnamed70() {
   var o = new core.List<api.CustomChannel>();
   o.add(buildCustomChannel());
   o.add(buildCustomChannel());
   return o;
 }
 
-checkUnnamed779(core.List<api.CustomChannel> o) {
+checkUnnamed70(core.List<api.CustomChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomChannel(o[0]);
   checkCustomChannel(o[1]);
@@ -274,7 +274,7 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed779();
+    o.items = buildUnnamed70();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -286,21 +286,21 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed779(o.items);
+    checkUnnamed70(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCustomChannels--;
 }
 
-buildUnnamed780() {
+buildUnnamed71() {
   var o = new core.List<api.ReportingMetadataEntry>();
   o.add(buildReportingMetadataEntry());
   o.add(buildReportingMetadataEntry());
   return o;
 }
 
-checkUnnamed780(core.List<api.ReportingMetadataEntry> o) {
+checkUnnamed71(core.List<api.ReportingMetadataEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportingMetadataEntry(o[0]);
   checkReportingMetadataEntry(o[1]);
@@ -311,7 +311,7 @@
   var o = new api.Metadata();
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    o.items = buildUnnamed780();
+    o.items = buildUnnamed71();
     o.kind = "foo";
   }
   buildCounterMetadata--;
@@ -321,7 +321,7 @@
 checkMetadata(api.Metadata o) {
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    checkUnnamed780(o.items);
+    checkUnnamed71(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterMetadata--;
@@ -360,14 +360,14 @@
   buildCounterPreferredDeal--;
 }
 
-buildUnnamed781() {
+buildUnnamed72() {
   var o = new core.List<api.PreferredDeal>();
   o.add(buildPreferredDeal());
   o.add(buildPreferredDeal());
   return o;
 }
 
-checkUnnamed781(core.List<api.PreferredDeal> o) {
+checkUnnamed72(core.List<api.PreferredDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPreferredDeal(o[0]);
   checkPreferredDeal(o[1]);
@@ -378,7 +378,7 @@
   var o = new api.PreferredDeals();
   buildCounterPreferredDeals++;
   if (buildCounterPreferredDeals < 3) {
-    o.items = buildUnnamed781();
+    o.items = buildUnnamed72();
     o.kind = "foo";
   }
   buildCounterPreferredDeals--;
@@ -388,20 +388,20 @@
 checkPreferredDeals(api.PreferredDeals o) {
   buildCounterPreferredDeals++;
   if (buildCounterPreferredDeals < 3) {
-    checkUnnamed781(o.items);
+    checkUnnamed72(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPreferredDeals--;
 }
 
-buildUnnamed782() {
+buildUnnamed73() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed782(core.List<core.String> o) {
+checkUnnamed73(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -430,66 +430,66 @@
   buildCounterReportHeaders--;
 }
 
-buildUnnamed783() {
+buildUnnamed74() {
   var o = new core.List<api.ReportHeaders>();
   o.add(buildReportHeaders());
   o.add(buildReportHeaders());
   return o;
 }
 
-checkUnnamed783(core.List<api.ReportHeaders> o) {
+checkUnnamed74(core.List<api.ReportHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportHeaders(o[0]);
   checkReportHeaders(o[1]);
 }
 
-buildUnnamed784() {
+buildUnnamed75() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed784(core.List<core.String> o) {
+checkUnnamed75(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed785() {
+buildUnnamed76() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed784());
-  o.add(buildUnnamed784());
+  o.add(buildUnnamed75());
+  o.add(buildUnnamed75());
   return o;
 }
 
-checkUnnamed785(core.List<core.List<core.String>> o) {
+checkUnnamed76(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed784(o[0]);
-  checkUnnamed784(o[1]);
+  checkUnnamed75(o[0]);
+  checkUnnamed75(o[1]);
 }
 
-buildUnnamed786() {
+buildUnnamed77() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed786(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'));
 }
 
-buildUnnamed787() {
+buildUnnamed78() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed787(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'));
@@ -500,13 +500,13 @@
   var o = new api.Report();
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    o.averages = buildUnnamed782();
-    o.headers = buildUnnamed783();
+    o.averages = buildUnnamed73();
+    o.headers = buildUnnamed74();
     o.kind = "foo";
-    o.rows = buildUnnamed785();
+    o.rows = buildUnnamed76();
     o.totalMatchedRows = "foo";
-    o.totals = buildUnnamed786();
-    o.warnings = buildUnnamed787();
+    o.totals = buildUnnamed77();
+    o.warnings = buildUnnamed78();
   }
   buildCounterReport--;
   return o;
@@ -515,77 +515,77 @@
 checkReport(api.Report o) {
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    checkUnnamed782(o.averages);
-    checkUnnamed783(o.headers);
+    checkUnnamed73(o.averages);
+    checkUnnamed74(o.headers);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed785(o.rows);
+    checkUnnamed76(o.rows);
     unittest.expect(o.totalMatchedRows, unittest.equals('foo'));
-    checkUnnamed786(o.totals);
-    checkUnnamed787(o.warnings);
+    checkUnnamed77(o.totals);
+    checkUnnamed78(o.warnings);
   }
   buildCounterReport--;
 }
 
-buildUnnamed788() {
+buildUnnamed79() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed788(core.List<core.String> o) {
+checkUnnamed79(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed789() {
+buildUnnamed80() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed789(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'));
 }
 
-buildUnnamed790() {
+buildUnnamed81() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed790(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'));
 }
 
-buildUnnamed791() {
+buildUnnamed82() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed791(core.List<core.String> o) {
+checkUnnamed82(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed792() {
+buildUnnamed83() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed792(core.List<core.String> o) {
+checkUnnamed83(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -596,13 +596,13 @@
   var o = new api.ReportingMetadataEntry();
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    o.compatibleDimensions = buildUnnamed788();
-    o.compatibleMetrics = buildUnnamed789();
+    o.compatibleDimensions = buildUnnamed79();
+    o.compatibleMetrics = buildUnnamed80();
     o.id = "foo";
     o.kind = "foo";
-    o.requiredDimensions = buildUnnamed790();
-    o.requiredMetrics = buildUnnamed791();
-    o.supportedProducts = buildUnnamed792();
+    o.requiredDimensions = buildUnnamed81();
+    o.requiredMetrics = buildUnnamed82();
+    o.supportedProducts = buildUnnamed83();
   }
   buildCounterReportingMetadataEntry--;
   return o;
@@ -611,13 +611,13 @@
 checkReportingMetadataEntry(api.ReportingMetadataEntry o) {
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    checkUnnamed788(o.compatibleDimensions);
-    checkUnnamed789(o.compatibleMetrics);
+    checkUnnamed79(o.compatibleDimensions);
+    checkUnnamed80(o.compatibleMetrics);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed790(o.requiredDimensions);
-    checkUnnamed791(o.requiredMetrics);
-    checkUnnamed792(o.supportedProducts);
+    checkUnnamed81(o.requiredDimensions);
+    checkUnnamed82(o.requiredMetrics);
+    checkUnnamed83(o.supportedProducts);
   }
   buildCounterReportingMetadataEntry--;
 }
@@ -645,14 +645,14 @@
   buildCounterSavedReport--;
 }
 
-buildUnnamed793() {
+buildUnnamed84() {
   var o = new core.List<api.SavedReport>();
   o.add(buildSavedReport());
   o.add(buildSavedReport());
   return o;
 }
 
-checkUnnamed793(core.List<api.SavedReport> o) {
+checkUnnamed84(core.List<api.SavedReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSavedReport(o[0]);
   checkSavedReport(o[1]);
@@ -664,7 +664,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed793();
+    o.items = buildUnnamed84();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -676,7 +676,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed793(o.items);
+    checkUnnamed84(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -706,14 +706,14 @@
   buildCounterUrlChannel--;
 }
 
-buildUnnamed794() {
+buildUnnamed85() {
   var o = new core.List<api.UrlChannel>();
   o.add(buildUrlChannel());
   o.add(buildUrlChannel());
   return o;
 }
 
-checkUnnamed794(core.List<api.UrlChannel> o) {
+checkUnnamed85(core.List<api.UrlChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlChannel(o[0]);
   checkUrlChannel(o[1]);
@@ -725,7 +725,7 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed794();
+    o.items = buildUnnamed85();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -737,60 +737,60 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed794(o.items);
+    checkUnnamed85(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterUrlChannels--;
 }
 
-buildUnnamed795() {
+buildUnnamed86() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed795(core.List<core.String> o) {
+checkUnnamed86(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed796() {
+buildUnnamed87() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed796(core.List<core.String> o) {
+checkUnnamed87(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed797() {
+buildUnnamed88() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed797(core.List<core.String> o) {
+checkUnnamed88(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed798() {
+buildUnnamed89() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed798(core.List<core.String> o) {
+checkUnnamed89(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1563,12 +1563,12 @@
       var arg_accountId = "foo";
       var arg_startDate = "foo";
       var arg_endDate = "foo";
-      var arg_dimension = buildUnnamed795();
-      var arg_filter = buildUnnamed796();
+      var arg_dimension = buildUnnamed86();
+      var arg_filter = buildUnnamed87();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed797();
-      var arg_sort = buildUnnamed798();
+      var arg_metric = buildUnnamed88();
+      var arg_sort = buildUnnamed89();
       var arg_startIndex = 42;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
diff --git a/generated/googleapis/test/admin/directory_v1_test.dart b/generated/googleapis/test/admin/directory_v1_test.dart
index 7371ef4..57dafbb 100644
--- a/generated/googleapis/test/admin/directory_v1_test.dart
+++ b/generated/googleapis/test/admin/directory_v1_test.dart
@@ -43,14 +43,14 @@
   buildCounterAlias--;
 }
 
-buildUnnamed463() {
+buildUnnamed90() {
   var o = new core.List<api.Alias>();
   o.add(buildAlias());
   o.add(buildAlias());
   return o;
 }
 
-checkUnnamed463(core.List<api.Alias> o) {
+checkUnnamed90(core.List<api.Alias> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAlias(o[0]);
   checkAlias(o[1]);
@@ -61,7 +61,7 @@
   var o = new api.Aliases();
   buildCounterAliases++;
   if (buildCounterAliases < 3) {
-    o.aliases = buildUnnamed463();
+    o.aliases = buildUnnamed90();
     o.etag = "foo";
     o.kind = "foo";
   }
@@ -72,7 +72,7 @@
 checkAliases(api.Aliases o) {
   buildCounterAliases++;
   if (buildCounterAliases < 3) {
-    checkUnnamed463(o.aliases);
+    checkUnnamed90(o.aliases);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
   }
@@ -110,14 +110,14 @@
   buildCounterAsp--;
 }
 
-buildUnnamed464() {
+buildUnnamed91() {
   var o = new core.List<api.Asp>();
   o.add(buildAsp());
   o.add(buildAsp());
   return o;
 }
 
-checkUnnamed464(core.List<api.Asp> o) {
+checkUnnamed91(core.List<api.Asp> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAsp(o[0]);
   checkAsp(o[1]);
@@ -129,7 +129,7 @@
   buildCounterAsps++;
   if (buildCounterAsps < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed464();
+    o.items = buildUnnamed91();
     o.kind = "foo";
   }
   buildCounterAsps--;
@@ -140,20 +140,20 @@
   buildCounterAsps++;
   if (buildCounterAsps < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed464(o.items);
+    checkUnnamed91(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAsps--;
 }
 
-buildUnnamed465() {
+buildUnnamed92() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed465(core.Map<core.String, core.String> o) {
+checkUnnamed92(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'));
@@ -168,7 +168,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed465();
+    o.params = buildUnnamed92();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -186,7 +186,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed465(o.params);
+    checkUnnamed92(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -217,14 +217,14 @@
   buildCounterChromeOsDeviceActiveTimeRanges--;
 }
 
-buildUnnamed466() {
+buildUnnamed93() {
   var o = new core.List<api.ChromeOsDeviceActiveTimeRanges>();
   o.add(buildChromeOsDeviceActiveTimeRanges());
   o.add(buildChromeOsDeviceActiveTimeRanges());
   return o;
 }
 
-checkUnnamed466(core.List<api.ChromeOsDeviceActiveTimeRanges> o) {
+checkUnnamed93(core.List<api.ChromeOsDeviceActiveTimeRanges> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChromeOsDeviceActiveTimeRanges(o[0]);
   checkChromeOsDeviceActiveTimeRanges(o[1]);
@@ -251,14 +251,14 @@
   buildCounterChromeOsDeviceRecentUsers--;
 }
 
-buildUnnamed467() {
+buildUnnamed94() {
   var o = new core.List<api.ChromeOsDeviceRecentUsers>();
   o.add(buildChromeOsDeviceRecentUsers());
   o.add(buildChromeOsDeviceRecentUsers());
   return o;
 }
 
-checkUnnamed467(core.List<api.ChromeOsDeviceRecentUsers> o) {
+checkUnnamed94(core.List<api.ChromeOsDeviceRecentUsers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChromeOsDeviceRecentUsers(o[0]);
   checkChromeOsDeviceRecentUsers(o[1]);
@@ -269,7 +269,7 @@
   var o = new api.ChromeOsDevice();
   buildCounterChromeOsDevice++;
   if (buildCounterChromeOsDevice < 3) {
-    o.activeTimeRanges = buildUnnamed466();
+    o.activeTimeRanges = buildUnnamed93();
     o.annotatedLocation = "foo";
     o.annotatedUser = "foo";
     o.bootMode = "foo";
@@ -288,7 +288,7 @@
     o.orgUnitPath = "foo";
     o.osVersion = "foo";
     o.platformVersion = "foo";
-    o.recentUsers = buildUnnamed467();
+    o.recentUsers = buildUnnamed94();
     o.serialNumber = "foo";
     o.status = "foo";
     o.supportEndDate = core.DateTime.parse("2002-02-27T14:01:02");
@@ -301,7 +301,7 @@
 checkChromeOsDevice(api.ChromeOsDevice o) {
   buildCounterChromeOsDevice++;
   if (buildCounterChromeOsDevice < 3) {
-    checkUnnamed466(o.activeTimeRanges);
+    checkUnnamed93(o.activeTimeRanges);
     unittest.expect(o.annotatedLocation, unittest.equals('foo'));
     unittest.expect(o.annotatedUser, unittest.equals('foo'));
     unittest.expect(o.bootMode, unittest.equals('foo'));
@@ -320,7 +320,7 @@
     unittest.expect(o.orgUnitPath, unittest.equals('foo'));
     unittest.expect(o.osVersion, unittest.equals('foo'));
     unittest.expect(o.platformVersion, unittest.equals('foo'));
-    checkUnnamed467(o.recentUsers);
+    checkUnnamed94(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")));
@@ -329,14 +329,14 @@
   buildCounterChromeOsDevice--;
 }
 
-buildUnnamed468() {
+buildUnnamed95() {
   var o = new core.List<api.ChromeOsDevice>();
   o.add(buildChromeOsDevice());
   o.add(buildChromeOsDevice());
   return o;
 }
 
-checkUnnamed468(core.List<api.ChromeOsDevice> o) {
+checkUnnamed95(core.List<api.ChromeOsDevice> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChromeOsDevice(o[0]);
   checkChromeOsDevice(o[1]);
@@ -347,7 +347,7 @@
   var o = new api.ChromeOsDevices();
   buildCounterChromeOsDevices++;
   if (buildCounterChromeOsDevices < 3) {
-    o.chromeosdevices = buildUnnamed468();
+    o.chromeosdevices = buildUnnamed95();
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
@@ -359,7 +359,7 @@
 checkChromeOsDevices(api.ChromeOsDevices o) {
   buildCounterChromeOsDevices++;
   if (buildCounterChromeOsDevices < 3) {
-    checkUnnamed468(o.chromeosdevices);
+    checkUnnamed95(o.chromeosdevices);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -367,27 +367,27 @@
   buildCounterChromeOsDevices--;
 }
 
-buildUnnamed469() {
+buildUnnamed96() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed469(core.List<core.String> o) {
+checkUnnamed96(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed470() {
+buildUnnamed97() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed470(core.List<core.String> o) {
+checkUnnamed97(core.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 +399,7 @@
   buildCounterGroup++;
   if (buildCounterGroup < 3) {
     o.adminCreated = true;
-    o.aliases = buildUnnamed469();
+    o.aliases = buildUnnamed96();
     o.description = "foo";
     o.directMembersCount = "foo";
     o.email = "foo";
@@ -407,7 +407,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.nonEditableAliases = buildUnnamed470();
+    o.nonEditableAliases = buildUnnamed97();
   }
   buildCounterGroup--;
   return o;
@@ -417,7 +417,7 @@
   buildCounterGroup++;
   if (buildCounterGroup < 3) {
     unittest.expect(o.adminCreated, unittest.isTrue);
-    checkUnnamed469(o.aliases);
+    checkUnnamed96(o.aliases);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.directMembersCount, unittest.equals('foo'));
     unittest.expect(o.email, unittest.equals('foo'));
@@ -425,19 +425,19 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed470(o.nonEditableAliases);
+    checkUnnamed97(o.nonEditableAliases);
   }
   buildCounterGroup--;
 }
 
-buildUnnamed471() {
+buildUnnamed98() {
   var o = new core.List<api.Group>();
   o.add(buildGroup());
   o.add(buildGroup());
   return o;
 }
 
-checkUnnamed471(core.List<api.Group> o) {
+checkUnnamed98(core.List<api.Group> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGroup(o[0]);
   checkGroup(o[1]);
@@ -449,7 +449,7 @@
   buildCounterGroups++;
   if (buildCounterGroups < 3) {
     o.etag = "foo";
-    o.groups = buildUnnamed471();
+    o.groups = buildUnnamed98();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -461,7 +461,7 @@
   buildCounterGroups++;
   if (buildCounterGroups < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed471(o.groups);
+    checkUnnamed98(o.groups);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -497,14 +497,14 @@
   buildCounterMember--;
 }
 
-buildUnnamed472() {
+buildUnnamed99() {
   var o = new core.List<api.Member>();
   o.add(buildMember());
   o.add(buildMember());
   return o;
 }
 
-checkUnnamed472(core.List<api.Member> o) {
+checkUnnamed99(core.List<api.Member> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMember(o[0]);
   checkMember(o[1]);
@@ -517,7 +517,7 @@
   if (buildCounterMembers < 3) {
     o.etag = "foo";
     o.kind = "foo";
-    o.members = buildUnnamed472();
+    o.members = buildUnnamed99();
     o.nextPageToken = "foo";
   }
   buildCounterMembers--;
@@ -529,20 +529,20 @@
   if (buildCounterMembers < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed472(o.members);
+    checkUnnamed99(o.members);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterMembers--;
 }
 
-buildUnnamed473() {
+buildUnnamed100() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed473(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'));
@@ -555,7 +555,7 @@
   if (buildCounterMobileDeviceApplications < 3) {
     o.displayName = "foo";
     o.packageName = "foo";
-    o.permission = buildUnnamed473();
+    o.permission = buildUnnamed100();
     o.versionCode = 42;
     o.versionName = "foo";
   }
@@ -568,47 +568,47 @@
   if (buildCounterMobileDeviceApplications < 3) {
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.packageName, unittest.equals('foo'));
-    checkUnnamed473(o.permission);
+    checkUnnamed100(o.permission);
     unittest.expect(o.versionCode, unittest.equals(42));
     unittest.expect(o.versionName, unittest.equals('foo'));
   }
   buildCounterMobileDeviceApplications--;
 }
 
-buildUnnamed474() {
+buildUnnamed101() {
   var o = new core.List<api.MobileDeviceApplications>();
   o.add(buildMobileDeviceApplications());
   o.add(buildMobileDeviceApplications());
   return o;
 }
 
-checkUnnamed474(core.List<api.MobileDeviceApplications> o) {
+checkUnnamed101(core.List<api.MobileDeviceApplications> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMobileDeviceApplications(o[0]);
   checkMobileDeviceApplications(o[1]);
 }
 
-buildUnnamed475() {
+buildUnnamed102() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed475(core.List<core.String> o) {
+checkUnnamed102(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed476() {
+buildUnnamed103() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed476(core.List<core.String> o) {
+checkUnnamed103(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -619,13 +619,13 @@
   var o = new api.MobileDevice();
   buildCounterMobileDevice++;
   if (buildCounterMobileDevice < 3) {
-    o.applications = buildUnnamed474();
+    o.applications = buildUnnamed101();
     o.basebandVersion = "foo";
     o.buildNumber = "foo";
     o.defaultLanguage = "foo";
     o.deviceCompromisedStatus = "foo";
     o.deviceId = "foo";
-    o.email = buildUnnamed475();
+    o.email = buildUnnamed102();
     o.etag = "foo";
     o.firstSync = core.DateTime.parse("2002-02-27T14:01:02");
     o.hardwareId = "foo";
@@ -636,7 +636,7 @@
     o.managedAccountIsOnOwnerProfile = true;
     o.meid = "foo";
     o.model = "foo";
-    o.name = buildUnnamed476();
+    o.name = buildUnnamed103();
     o.networkOperator = "foo";
     o.os = "foo";
     o.resourceId = "foo";
@@ -653,13 +653,13 @@
 checkMobileDevice(api.MobileDevice o) {
   buildCounterMobileDevice++;
   if (buildCounterMobileDevice < 3) {
-    checkUnnamed474(o.applications);
+    checkUnnamed101(o.applications);
     unittest.expect(o.basebandVersion, unittest.equals('foo'));
     unittest.expect(o.buildNumber, unittest.equals('foo'));
     unittest.expect(o.defaultLanguage, unittest.equals('foo'));
     unittest.expect(o.deviceCompromisedStatus, unittest.equals('foo'));
     unittest.expect(o.deviceId, unittest.equals('foo'));
-    checkUnnamed475(o.email);
+    checkUnnamed102(o.email);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.firstSync, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.hardwareId, unittest.equals('foo'));
@@ -670,7 +670,7 @@
     unittest.expect(o.managedAccountIsOnOwnerProfile, unittest.isTrue);
     unittest.expect(o.meid, unittest.equals('foo'));
     unittest.expect(o.model, unittest.equals('foo'));
-    checkUnnamed476(o.name);
+    checkUnnamed103(o.name);
     unittest.expect(o.networkOperator, unittest.equals('foo'));
     unittest.expect(o.os, unittest.equals('foo'));
     unittest.expect(o.resourceId, unittest.equals('foo'));
@@ -702,14 +702,14 @@
   buildCounterMobileDeviceAction--;
 }
 
-buildUnnamed477() {
+buildUnnamed104() {
   var o = new core.List<api.MobileDevice>();
   o.add(buildMobileDevice());
   o.add(buildMobileDevice());
   return o;
 }
 
-checkUnnamed477(core.List<api.MobileDevice> o) {
+checkUnnamed104(core.List<api.MobileDevice> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMobileDevice(o[0]);
   checkMobileDevice(o[1]);
@@ -722,7 +722,7 @@
   if (buildCounterMobileDevices < 3) {
     o.etag = "foo";
     o.kind = "foo";
-    o.mobiledevices = buildUnnamed477();
+    o.mobiledevices = buildUnnamed104();
     o.nextPageToken = "foo";
   }
   buildCounterMobileDevices--;
@@ -734,7 +734,7 @@
   if (buildCounterMobileDevices < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed477(o.mobiledevices);
+    checkUnnamed104(o.mobiledevices);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterMobileDevices--;
@@ -773,14 +773,14 @@
   buildCounterNotification--;
 }
 
-buildUnnamed478() {
+buildUnnamed105() {
   var o = new core.List<api.Notification>();
   o.add(buildNotification());
   o.add(buildNotification());
   return o;
 }
 
-checkUnnamed478(core.List<api.Notification> o) {
+checkUnnamed105(core.List<api.Notification> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNotification(o[0]);
   checkNotification(o[1]);
@@ -792,7 +792,7 @@
   buildCounterNotifications++;
   if (buildCounterNotifications < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed478();
+    o.items = buildUnnamed105();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.unreadNotificationsCount = 42;
@@ -805,7 +805,7 @@
   buildCounterNotifications++;
   if (buildCounterNotifications < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed478(o.items);
+    checkUnnamed105(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.unreadNotificationsCount, unittest.equals(42));
@@ -844,14 +844,14 @@
   buildCounterOrgUnit--;
 }
 
-buildUnnamed479() {
+buildUnnamed106() {
   var o = new core.List<api.OrgUnit>();
   o.add(buildOrgUnit());
   o.add(buildOrgUnit());
   return o;
 }
 
-checkUnnamed479(core.List<api.OrgUnit> o) {
+checkUnnamed106(core.List<api.OrgUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrgUnit(o[0]);
   checkOrgUnit(o[1]);
@@ -864,7 +864,7 @@
   if (buildCounterOrgUnits < 3) {
     o.etag = "foo";
     o.kind = "foo";
-    o.organizationUnits = buildUnnamed479();
+    o.organizationUnits = buildUnnamed106();
   }
   buildCounterOrgUnits--;
   return o;
@@ -875,19 +875,19 @@
   if (buildCounterOrgUnits < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed479(o.organizationUnits);
+    checkUnnamed106(o.organizationUnits);
   }
   buildCounterOrgUnits--;
 }
 
-buildUnnamed480() {
+buildUnnamed107() {
   var o = new core.List<api.SchemaFieldSpec>();
   o.add(buildSchemaFieldSpec());
   o.add(buildSchemaFieldSpec());
   return o;
 }
 
-checkUnnamed480(core.List<api.SchemaFieldSpec> o) {
+checkUnnamed107(core.List<api.SchemaFieldSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSchemaFieldSpec(o[0]);
   checkSchemaFieldSpec(o[1]);
@@ -899,7 +899,7 @@
   buildCounterSchema++;
   if (buildCounterSchema < 3) {
     o.etag = "foo";
-    o.fields = buildUnnamed480();
+    o.fields = buildUnnamed107();
     o.kind = "foo";
     o.schemaId = "foo";
     o.schemaName = "foo";
@@ -912,7 +912,7 @@
   buildCounterSchema++;
   if (buildCounterSchema < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed480(o.fields);
+    checkUnnamed107(o.fields);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.schemaId, unittest.equals('foo'));
     unittest.expect(o.schemaName, unittest.equals('foo'));
@@ -976,14 +976,14 @@
   buildCounterSchemaFieldSpec--;
 }
 
-buildUnnamed481() {
+buildUnnamed108() {
   var o = new core.List<api.Schema>();
   o.add(buildSchema());
   o.add(buildSchema());
   return o;
 }
 
-checkUnnamed481(core.List<api.Schema> o) {
+checkUnnamed108(core.List<api.Schema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSchema(o[0]);
   checkSchema(o[1]);
@@ -996,7 +996,7 @@
   if (buildCounterSchemas < 3) {
     o.etag = "foo";
     o.kind = "foo";
-    o.schemas = buildUnnamed481();
+    o.schemas = buildUnnamed108();
   }
   buildCounterSchemas--;
   return o;
@@ -1007,19 +1007,19 @@
   if (buildCounterSchemas < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed481(o.schemas);
+    checkUnnamed108(o.schemas);
   }
   buildCounterSchemas--;
 }
 
-buildUnnamed482() {
+buildUnnamed109() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed482(core.List<core.String> o) {
+checkUnnamed109(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1036,7 +1036,7 @@
     o.etag = "foo";
     o.kind = "foo";
     o.nativeApp = true;
-    o.scopes = buildUnnamed482();
+    o.scopes = buildUnnamed109();
     o.userKey = "foo";
   }
   buildCounterToken--;
@@ -1052,20 +1052,20 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nativeApp, unittest.isTrue);
-    checkUnnamed482(o.scopes);
+    checkUnnamed109(o.scopes);
     unittest.expect(o.userKey, unittest.equals('foo'));
   }
   buildCounterToken--;
 }
 
-buildUnnamed483() {
+buildUnnamed110() {
   var o = new core.List<api.Token>();
   o.add(buildToken());
   o.add(buildToken());
   return o;
 }
 
-checkUnnamed483(core.List<api.Token> o) {
+checkUnnamed110(core.List<api.Token> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkToken(o[0]);
   checkToken(o[1]);
@@ -1077,7 +1077,7 @@
   buildCounterTokens++;
   if (buildCounterTokens < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed483();
+    o.items = buildUnnamed110();
     o.kind = "foo";
   }
   buildCounterTokens--;
@@ -1088,46 +1088,46 @@
   buildCounterTokens++;
   if (buildCounterTokens < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed483(o.items);
+    checkUnnamed110(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTokens--;
 }
 
-buildUnnamed484() {
+buildUnnamed111() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed484(core.List<core.String> o) {
+checkUnnamed111(core.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() {
+buildUnnamed112() {
   var o = new core.Map<core.String, api.UserCustomProperties>();
   o["x"] = buildUserCustomProperties();
   o["y"] = buildUserCustomProperties();
   return o;
 }
 
-checkUnnamed485(core.Map<core.String, api.UserCustomProperties> o) {
+checkUnnamed112(core.Map<core.String, api.UserCustomProperties> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserCustomProperties(o["x"]);
   checkUserCustomProperties(o["y"]);
 }
 
-buildUnnamed486() {
+buildUnnamed113() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed486(core.List<core.String> o) {
+checkUnnamed113(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1140,10 +1140,10 @@
   if (buildCounterUser < 3) {
     o.addresses = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
     o.agreedToTerms = true;
-    o.aliases = buildUnnamed484();
+    o.aliases = buildUnnamed111();
     o.changePasswordAtNextLogin = true;
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
-    o.customSchemas = buildUnnamed485();
+    o.customSchemas = buildUnnamed112();
     o.customerId = "foo";
     o.deletionTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.emails = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
@@ -1160,7 +1160,7 @@
     o.kind = "foo";
     o.lastLoginTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.name = buildUserName();
-    o.nonEditableAliases = buildUnnamed486();
+    o.nonEditableAliases = buildUnnamed113();
     o.orgUnitPath = "foo";
     o.organizations = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
     o.password = "foo";
@@ -1180,10 +1180,10 @@
   if (buildCounterUser < 3) {
     var casted1 = (o.addresses) 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.agreedToTerms, unittest.isTrue);
-    checkUnnamed484(o.aliases);
+    checkUnnamed111(o.aliases);
     unittest.expect(o.changePasswordAtNextLogin, unittest.isTrue);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed485(o.customSchemas);
+    checkUnnamed112(o.customSchemas);
     unittest.expect(o.customerId, unittest.equals('foo'));
     unittest.expect(o.deletionTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     var casted2 = (o.emails) 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')); 
@@ -1200,7 +1200,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastLoginTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkUserName(o.name);
-    checkUnnamed486(o.nonEditableAliases);
+    checkUnnamed113(o.nonEditableAliases);
     unittest.expect(o.orgUnitPath, unittest.equals('foo'));
     var casted5 = (o.organizations) 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.password, unittest.equals('foo'));
@@ -1528,14 +1528,14 @@
   buildCounterUserUndelete--;
 }
 
-buildUnnamed487() {
+buildUnnamed114() {
   var o = new core.List<api.User>();
   o.add(buildUser());
   o.add(buildUser());
   return o;
 }
 
-checkUnnamed487(core.List<api.User> o) {
+checkUnnamed114(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUser(o[0]);
   checkUser(o[1]);
@@ -1550,7 +1550,7 @@
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.triggerEvent = "foo";
-    o.users = buildUnnamed487();
+    o.users = buildUnnamed114();
   }
   buildCounterUsers--;
   return o;
@@ -1563,7 +1563,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.triggerEvent, unittest.equals('foo'));
-    checkUnnamed487(o.users);
+    checkUnnamed114(o.users);
   }
   buildCounterUsers--;
 }
@@ -1593,14 +1593,14 @@
   buildCounterVerificationCode--;
 }
 
-buildUnnamed488() {
+buildUnnamed115() {
   var o = new core.List<api.VerificationCode>();
   o.add(buildVerificationCode());
   o.add(buildVerificationCode());
   return o;
 }
 
-checkUnnamed488(core.List<api.VerificationCode> o) {
+checkUnnamed115(core.List<api.VerificationCode> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVerificationCode(o[0]);
   checkVerificationCode(o[1]);
@@ -1612,7 +1612,7 @@
   buildCounterVerificationCodes++;
   if (buildCounterVerificationCodes < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed488();
+    o.items = buildUnnamed115();
     o.kind = "foo";
   }
   buildCounterVerificationCodes--;
@@ -1623,59 +1623,59 @@
   buildCounterVerificationCodes++;
   if (buildCounterVerificationCodes < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed488(o.items);
+    checkUnnamed115(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterVerificationCodes--;
 }
 
-buildUnnamed489() {
+buildUnnamed116() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed489(core.List<core.String> o) {
+checkUnnamed116(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed490() {
+buildUnnamed117() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed490(core.List<core.String> o) {
+checkUnnamed117(core.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() {
+buildUnnamed118() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed491(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'));
 }
 
-buildUnnamed492() {
+buildUnnamed119() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed492(core.List<core.String> o) {
+checkUnnamed119(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3924,7 +3924,7 @@
       var mock = new common_test.HttpServerMock();
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_customerId = "foo";
-      var arg_orgUnitPath = buildUnnamed489();
+      var arg_orgUnitPath = buildUnnamed116();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3978,7 +3978,7 @@
       var mock = new common_test.HttpServerMock();
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_customerId = "foo";
-      var arg_orgUnitPath = buildUnnamed490();
+      var arg_orgUnitPath = buildUnnamed117();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4149,7 +4149,7 @@
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_request = buildOrgUnit();
       var arg_customerId = "foo";
-      var arg_orgUnitPath = buildUnnamed491();
+      var arg_orgUnitPath = buildUnnamed118();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var obj = new api.OrgUnit.fromJson(json);
         checkOrgUnit(obj);
@@ -4209,7 +4209,7 @@
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_request = buildOrgUnit();
       var arg_customerId = "foo";
-      var arg_orgUnitPath = buildUnnamed492();
+      var arg_orgUnitPath = buildUnnamed119();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var obj = new api.OrgUnit.fromJson(json);
         checkOrgUnit(obj);
diff --git a/generated/googleapis/test/admin/email_migration_v2_test.dart b/generated/googleapis/test/admin/email_migration_v2_test.dart
index 8bb3315..9818823 100644
--- a/generated/googleapis/test/admin/email_migration_v2_test.dart
+++ b/generated/googleapis/test/admin/email_migration_v2_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed0() {
+buildUnnamed120() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed0(core.List<core.String> o) {
+checkUnnamed120(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -42,7 +42,7 @@
     o.isTrash = true;
     o.isUnread = true;
     o.kind = "foo";
-    o.labels = buildUnnamed0();
+    o.labels = buildUnnamed120();
   }
   buildCounterMailItem--;
   return o;
@@ -59,7 +59,7 @@
     unittest.expect(o.isTrash, unittest.isTrue);
     unittest.expect(o.isUnread, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed0(o.labels);
+    checkUnnamed120(o.labels);
   }
   buildCounterMailItem--;
 }
diff --git a/generated/googleapis/test/admin/reports_v1_test.dart b/generated/googleapis/test/admin/reports_v1_test.dart
index f03a7dd..fb9178a 100644
--- a/generated/googleapis/test/admin/reports_v1_test.dart
+++ b/generated/googleapis/test/admin/reports_v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed388() {
+buildUnnamed121() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed388(core.List<api.Activity> o) {
+checkUnnamed121(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -35,7 +35,7 @@
   buildCounterActivities++;
   if (buildCounterActivities < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed388();
+    o.items = buildUnnamed121();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -47,7 +47,7 @@
   buildCounterActivities++;
   if (buildCounterActivities < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed388(o.items);
+    checkUnnamed121(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -79,27 +79,27 @@
   buildCounterActivityActor--;
 }
 
-buildUnnamed389() {
+buildUnnamed122() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed389(core.List<core.String> o) {
+checkUnnamed122(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed390() {
+buildUnnamed123() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed390(core.List<core.String> o) {
+checkUnnamed123(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -112,8 +112,8 @@
   if (buildCounterActivityEventsParameters < 3) {
     o.boolValue = true;
     o.intValue = "foo";
-    o.multiIntValue = buildUnnamed389();
-    o.multiValue = buildUnnamed390();
+    o.multiIntValue = buildUnnamed122();
+    o.multiValue = buildUnnamed123();
     o.name = "foo";
     o.value = "foo";
   }
@@ -126,22 +126,22 @@
   if (buildCounterActivityEventsParameters < 3) {
     unittest.expect(o.boolValue, unittest.isTrue);
     unittest.expect(o.intValue, unittest.equals('foo'));
-    checkUnnamed389(o.multiIntValue);
-    checkUnnamed390(o.multiValue);
+    checkUnnamed122(o.multiIntValue);
+    checkUnnamed123(o.multiValue);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterActivityEventsParameters--;
 }
 
-buildUnnamed391() {
+buildUnnamed124() {
   var o = new core.List<api.ActivityEventsParameters>();
   o.add(buildActivityEventsParameters());
   o.add(buildActivityEventsParameters());
   return o;
 }
 
-checkUnnamed391(core.List<api.ActivityEventsParameters> o) {
+checkUnnamed124(core.List<api.ActivityEventsParameters> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityEventsParameters(o[0]);
   checkActivityEventsParameters(o[1]);
@@ -153,7 +153,7 @@
   buildCounterActivityEvents++;
   if (buildCounterActivityEvents < 3) {
     o.name = "foo";
-    o.parameters = buildUnnamed391();
+    o.parameters = buildUnnamed124();
     o.type = "foo";
   }
   buildCounterActivityEvents--;
@@ -164,20 +164,20 @@
   buildCounterActivityEvents++;
   if (buildCounterActivityEvents < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed391(o.parameters);
+    checkUnnamed124(o.parameters);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterActivityEvents--;
 }
 
-buildUnnamed392() {
+buildUnnamed125() {
   var o = new core.List<api.ActivityEvents>();
   o.add(buildActivityEvents());
   o.add(buildActivityEvents());
   return o;
 }
 
-checkUnnamed392(core.List<api.ActivityEvents> o) {
+checkUnnamed125(core.List<api.ActivityEvents> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityEvents(o[0]);
   checkActivityEvents(o[1]);
@@ -215,7 +215,7 @@
   if (buildCounterActivity < 3) {
     o.actor = buildActivityActor();
     o.etag = "foo";
-    o.events = buildUnnamed392();
+    o.events = buildUnnamed125();
     o.id = buildActivityId();
     o.ipAddress = "foo";
     o.kind = "foo";
@@ -230,7 +230,7 @@
   if (buildCounterActivity < 3) {
     checkActivityActor(o.actor);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed392(o.events);
+    checkUnnamed125(o.events);
     checkActivityId(o.id);
     unittest.expect(o.ipAddress, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -239,14 +239,14 @@
   buildCounterActivity--;
 }
 
-buildUnnamed393() {
+buildUnnamed126() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed393(core.Map<core.String, core.String> o) {
+checkUnnamed126(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'));
@@ -261,7 +261,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed393();
+    o.params = buildUnnamed126();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -279,7 +279,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed393(o.params);
+    checkUnnamed126(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -314,30 +314,30 @@
   buildCounterUsageReportEntity--;
 }
 
-buildUnnamed394() {
+buildUnnamed127() {
   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;
 }
 
-checkUnnamed394(core.Map<core.String, core.Object> o) {
+checkUnnamed127(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')); 
 }
 
-buildUnnamed395() {
+buildUnnamed128() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed394());
-  o.add(buildUnnamed394());
+  o.add(buildUnnamed127());
+  o.add(buildUnnamed127());
   return o;
 }
 
-checkUnnamed395(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed128(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed394(o[0]);
-  checkUnnamed394(o[1]);
+  checkUnnamed127(o[0]);
+  checkUnnamed127(o[1]);
 }
 
 core.int buildCounterUsageReportParameters = 0;
@@ -348,7 +348,7 @@
     o.boolValue = true;
     o.datetimeValue = core.DateTime.parse("2002-02-27T14:01:02");
     o.intValue = "foo";
-    o.msgValue = buildUnnamed395();
+    o.msgValue = buildUnnamed128();
     o.name = "foo";
     o.stringValue = "foo";
   }
@@ -362,21 +362,21 @@
     unittest.expect(o.boolValue, unittest.isTrue);
     unittest.expect(o.datetimeValue, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.intValue, unittest.equals('foo'));
-    checkUnnamed395(o.msgValue);
+    checkUnnamed128(o.msgValue);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.stringValue, unittest.equals('foo'));
   }
   buildCounterUsageReportParameters--;
 }
 
-buildUnnamed396() {
+buildUnnamed129() {
   var o = new core.List<api.UsageReportParameters>();
   o.add(buildUsageReportParameters());
   o.add(buildUsageReportParameters());
   return o;
 }
 
-checkUnnamed396(core.List<api.UsageReportParameters> o) {
+checkUnnamed129(core.List<api.UsageReportParameters> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageReportParameters(o[0]);
   checkUsageReportParameters(o[1]);
@@ -391,7 +391,7 @@
     o.entity = buildUsageReportEntity();
     o.etag = "foo";
     o.kind = "foo";
-    o.parameters = buildUnnamed396();
+    o.parameters = buildUnnamed129();
   }
   buildCounterUsageReport--;
   return o;
@@ -404,19 +404,19 @@
     checkUsageReportEntity(o.entity);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed396(o.parameters);
+    checkUnnamed129(o.parameters);
   }
   buildCounterUsageReport--;
 }
 
-buildUnnamed397() {
+buildUnnamed130() {
   var o = new core.List<api.UsageReport>();
   o.add(buildUsageReport());
   o.add(buildUsageReport());
   return o;
 }
 
-checkUnnamed397(core.List<api.UsageReport> o) {
+checkUnnamed130(core.List<api.UsageReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageReport(o[0]);
   checkUsageReport(o[1]);
@@ -443,14 +443,14 @@
   buildCounterUsageReportsWarningsData--;
 }
 
-buildUnnamed398() {
+buildUnnamed131() {
   var o = new core.List<api.UsageReportsWarningsData>();
   o.add(buildUsageReportsWarningsData());
   o.add(buildUsageReportsWarningsData());
   return o;
 }
 
-checkUnnamed398(core.List<api.UsageReportsWarningsData> o) {
+checkUnnamed131(core.List<api.UsageReportsWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageReportsWarningsData(o[0]);
   checkUsageReportsWarningsData(o[1]);
@@ -462,7 +462,7 @@
   buildCounterUsageReportsWarnings++;
   if (buildCounterUsageReportsWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed398();
+    o.data = buildUnnamed131();
     o.message = "foo";
   }
   buildCounterUsageReportsWarnings--;
@@ -473,20 +473,20 @@
   buildCounterUsageReportsWarnings++;
   if (buildCounterUsageReportsWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed398(o.data);
+    checkUnnamed131(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterUsageReportsWarnings--;
 }
 
-buildUnnamed399() {
+buildUnnamed132() {
   var o = new core.List<api.UsageReportsWarnings>();
   o.add(buildUsageReportsWarnings());
   o.add(buildUsageReportsWarnings());
   return o;
 }
 
-checkUnnamed399(core.List<api.UsageReportsWarnings> o) {
+checkUnnamed132(core.List<api.UsageReportsWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageReportsWarnings(o[0]);
   checkUsageReportsWarnings(o[1]);
@@ -500,8 +500,8 @@
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.usageReports = buildUnnamed397();
-    o.warnings = buildUnnamed399();
+    o.usageReports = buildUnnamed130();
+    o.warnings = buildUnnamed132();
   }
   buildCounterUsageReports--;
   return o;
@@ -513,8 +513,8 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed397(o.usageReports);
-    checkUnnamed399(o.warnings);
+    checkUnnamed130(o.usageReports);
+    checkUnnamed132(o.warnings);
   }
   buildCounterUsageReports--;
 }
diff --git a/generated/googleapis/test/adsense/v1_4_test.dart b/generated/googleapis/test/adsense/v1_4_test.dart
index 25f6496..fcde049 100644
--- a/generated/googleapis/test/adsense/v1_4_test.dart
+++ b/generated/googleapis/test/adsense/v1_4_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed841() {
+buildUnnamed133() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed841(core.List<api.Account> o) {
+checkUnnamed133(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -38,7 +38,7 @@
     o.kind = "foo";
     o.name = "foo";
     o.premium = true;
-    o.subAccounts = buildUnnamed841();
+    o.subAccounts = buildUnnamed133();
     o.timezone = "foo";
   }
   buildCounterAccount--;
@@ -52,20 +52,20 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.premium, unittest.isTrue);
-    checkUnnamed841(o.subAccounts);
+    checkUnnamed133(o.subAccounts);
     unittest.expect(o.timezone, unittest.equals('foo'));
   }
   buildCounterAccount--;
 }
 
-buildUnnamed842() {
+buildUnnamed134() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed842(core.List<api.Account> o) {
+checkUnnamed134(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -77,7 +77,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed842();
+    o.items = buildUnnamed134();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -89,7 +89,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed842(o.items);
+    checkUnnamed134(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -125,14 +125,14 @@
   buildCounterAdClient--;
 }
 
-buildUnnamed843() {
+buildUnnamed135() {
   var o = new core.List<api.AdClient>();
   o.add(buildAdClient());
   o.add(buildAdClient());
   return o;
 }
 
-checkUnnamed843(core.List<api.AdClient> o) {
+checkUnnamed135(core.List<api.AdClient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdClient(o[0]);
   checkAdClient(o[1]);
@@ -144,7 +144,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed843();
+    o.items = buildUnnamed135();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -156,7 +156,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed843(o.items);
+    checkUnnamed135(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -390,14 +390,14 @@
   buildCounterAdUnit--;
 }
 
-buildUnnamed844() {
+buildUnnamed136() {
   var o = new core.List<api.AdUnit>();
   o.add(buildAdUnit());
   o.add(buildAdUnit());
   return o;
 }
 
-checkUnnamed844(core.List<api.AdUnit> o) {
+checkUnnamed136(core.List<api.AdUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdUnit(o[0]);
   checkAdUnit(o[1]);
@@ -409,7 +409,7 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed844();
+    o.items = buildUnnamed136();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -421,21 +421,21 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed844(o.items);
+    checkUnnamed136(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterAdUnits--;
 }
 
-buildUnnamed845() {
+buildUnnamed137() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed845(core.List<core.String> o) {
+checkUnnamed137(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -464,66 +464,66 @@
   buildCounterAdsenseReportsGenerateResponseHeaders--;
 }
 
-buildUnnamed846() {
+buildUnnamed138() {
   var o = new core.List<api.AdsenseReportsGenerateResponseHeaders>();
   o.add(buildAdsenseReportsGenerateResponseHeaders());
   o.add(buildAdsenseReportsGenerateResponseHeaders());
   return o;
 }
 
-checkUnnamed846(core.List<api.AdsenseReportsGenerateResponseHeaders> o) {
+checkUnnamed138(core.List<api.AdsenseReportsGenerateResponseHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdsenseReportsGenerateResponseHeaders(o[0]);
   checkAdsenseReportsGenerateResponseHeaders(o[1]);
 }
 
-buildUnnamed847() {
+buildUnnamed139() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed847(core.List<core.String> o) {
+checkUnnamed139(core.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() {
+buildUnnamed140() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed847());
-  o.add(buildUnnamed847());
+  o.add(buildUnnamed139());
+  o.add(buildUnnamed139());
   return o;
 }
 
-checkUnnamed848(core.List<core.List<core.String>> o) {
+checkUnnamed140(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed847(o[0]);
-  checkUnnamed847(o[1]);
+  checkUnnamed139(o[0]);
+  checkUnnamed139(o[1]);
 }
 
-buildUnnamed849() {
+buildUnnamed141() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed849(core.List<core.String> o) {
+checkUnnamed141(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed850() {
+buildUnnamed142() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed850(core.List<core.String> o) {
+checkUnnamed142(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -534,15 +534,15 @@
   var o = new api.AdsenseReportsGenerateResponse();
   buildCounterAdsenseReportsGenerateResponse++;
   if (buildCounterAdsenseReportsGenerateResponse < 3) {
-    o.averages = buildUnnamed845();
+    o.averages = buildUnnamed137();
     o.endDate = "foo";
-    o.headers = buildUnnamed846();
+    o.headers = buildUnnamed138();
     o.kind = "foo";
-    o.rows = buildUnnamed848();
+    o.rows = buildUnnamed140();
     o.startDate = "foo";
     o.totalMatchedRows = "foo";
-    o.totals = buildUnnamed849();
-    o.warnings = buildUnnamed850();
+    o.totals = buildUnnamed141();
+    o.warnings = buildUnnamed142();
   }
   buildCounterAdsenseReportsGenerateResponse--;
   return o;
@@ -551,15 +551,15 @@
 checkAdsenseReportsGenerateResponse(api.AdsenseReportsGenerateResponse o) {
   buildCounterAdsenseReportsGenerateResponse++;
   if (buildCounterAdsenseReportsGenerateResponse < 3) {
-    checkUnnamed845(o.averages);
+    checkUnnamed137(o.averages);
     unittest.expect(o.endDate, unittest.equals('foo'));
-    checkUnnamed846(o.headers);
+    checkUnnamed138(o.headers);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed848(o.rows);
+    checkUnnamed140(o.rows);
     unittest.expect(o.startDate, unittest.equals('foo'));
     unittest.expect(o.totalMatchedRows, unittest.equals('foo'));
-    checkUnnamed849(o.totals);
-    checkUnnamed850(o.warnings);
+    checkUnnamed141(o.totals);
+    checkUnnamed142(o.warnings);
   }
   buildCounterAdsenseReportsGenerateResponse--;
 }
@@ -593,14 +593,14 @@
   buildCounterAlert--;
 }
 
-buildUnnamed851() {
+buildUnnamed143() {
   var o = new core.List<api.Alert>();
   o.add(buildAlert());
   o.add(buildAlert());
   return o;
 }
 
-checkUnnamed851(core.List<api.Alert> o) {
+checkUnnamed143(core.List<api.Alert> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAlert(o[0]);
   checkAlert(o[1]);
@@ -611,7 +611,7 @@
   var o = new api.Alerts();
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    o.items = buildUnnamed851();
+    o.items = buildUnnamed143();
     o.kind = "foo";
   }
   buildCounterAlerts--;
@@ -621,7 +621,7 @@
 checkAlerts(api.Alerts o) {
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    checkUnnamed851(o.items);
+    checkUnnamed143(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAlerts--;
@@ -679,14 +679,14 @@
   buildCounterCustomChannel--;
 }
 
-buildUnnamed852() {
+buildUnnamed144() {
   var o = new core.List<api.CustomChannel>();
   o.add(buildCustomChannel());
   o.add(buildCustomChannel());
   return o;
 }
 
-checkUnnamed852(core.List<api.CustomChannel> o) {
+checkUnnamed144(core.List<api.CustomChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomChannel(o[0]);
   checkCustomChannel(o[1]);
@@ -698,7 +698,7 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed852();
+    o.items = buildUnnamed144();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -710,21 +710,21 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed852(o.items);
+    checkUnnamed144(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCustomChannels--;
 }
 
-buildUnnamed853() {
+buildUnnamed145() {
   var o = new core.List<api.ReportingMetadataEntry>();
   o.add(buildReportingMetadataEntry());
   o.add(buildReportingMetadataEntry());
   return o;
 }
 
-checkUnnamed853(core.List<api.ReportingMetadataEntry> o) {
+checkUnnamed145(core.List<api.ReportingMetadataEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportingMetadataEntry(o[0]);
   checkReportingMetadataEntry(o[1]);
@@ -735,7 +735,7 @@
   var o = new api.Metadata();
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    o.items = buildUnnamed853();
+    o.items = buildUnnamed145();
     o.kind = "foo";
   }
   buildCounterMetadata--;
@@ -745,7 +745,7 @@
 checkMetadata(api.Metadata o) {
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    checkUnnamed853(o.items);
+    checkUnnamed145(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterMetadata--;
@@ -778,14 +778,14 @@
   buildCounterPayment--;
 }
 
-buildUnnamed854() {
+buildUnnamed146() {
   var o = new core.List<api.Payment>();
   o.add(buildPayment());
   o.add(buildPayment());
   return o;
 }
 
-checkUnnamed854(core.List<api.Payment> o) {
+checkUnnamed146(core.List<api.Payment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPayment(o[0]);
   checkPayment(o[1]);
@@ -796,7 +796,7 @@
   var o = new api.Payments();
   buildCounterPayments++;
   if (buildCounterPayments < 3) {
-    o.items = buildUnnamed854();
+    o.items = buildUnnamed146();
     o.kind = "foo";
   }
   buildCounterPayments--;
@@ -806,72 +806,72 @@
 checkPayments(api.Payments o) {
   buildCounterPayments++;
   if (buildCounterPayments < 3) {
-    checkUnnamed854(o.items);
+    checkUnnamed146(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPayments--;
 }
 
-buildUnnamed855() {
+buildUnnamed147() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed855(core.List<core.String> o) {
+checkUnnamed147(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed856() {
+buildUnnamed148() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed856(core.List<core.String> o) {
+checkUnnamed148(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed857() {
+buildUnnamed149() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed857(core.List<core.String> o) {
+checkUnnamed149(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed858() {
+buildUnnamed150() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed858(core.List<core.String> o) {
+checkUnnamed150(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed859() {
+buildUnnamed151() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed859(core.List<core.String> o) {
+checkUnnamed151(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -882,13 +882,13 @@
   var o = new api.ReportingMetadataEntry();
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    o.compatibleDimensions = buildUnnamed855();
-    o.compatibleMetrics = buildUnnamed856();
+    o.compatibleDimensions = buildUnnamed147();
+    o.compatibleMetrics = buildUnnamed148();
     o.id = "foo";
     o.kind = "foo";
-    o.requiredDimensions = buildUnnamed857();
-    o.requiredMetrics = buildUnnamed858();
-    o.supportedProducts = buildUnnamed859();
+    o.requiredDimensions = buildUnnamed149();
+    o.requiredMetrics = buildUnnamed150();
+    o.supportedProducts = buildUnnamed151();
   }
   buildCounterReportingMetadataEntry--;
   return o;
@@ -897,13 +897,13 @@
 checkReportingMetadataEntry(api.ReportingMetadataEntry o) {
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    checkUnnamed855(o.compatibleDimensions);
-    checkUnnamed856(o.compatibleMetrics);
+    checkUnnamed147(o.compatibleDimensions);
+    checkUnnamed148(o.compatibleMetrics);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed857(o.requiredDimensions);
-    checkUnnamed858(o.requiredMetrics);
-    checkUnnamed859(o.supportedProducts);
+    checkUnnamed149(o.requiredDimensions);
+    checkUnnamed150(o.requiredMetrics);
+    checkUnnamed151(o.supportedProducts);
   }
   buildCounterReportingMetadataEntry--;
 }
@@ -933,14 +933,14 @@
   buildCounterSavedAdStyle--;
 }
 
-buildUnnamed860() {
+buildUnnamed152() {
   var o = new core.List<api.SavedAdStyle>();
   o.add(buildSavedAdStyle());
   o.add(buildSavedAdStyle());
   return o;
 }
 
-checkUnnamed860(core.List<api.SavedAdStyle> o) {
+checkUnnamed152(core.List<api.SavedAdStyle> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSavedAdStyle(o[0]);
   checkSavedAdStyle(o[1]);
@@ -952,7 +952,7 @@
   buildCounterSavedAdStyles++;
   if (buildCounterSavedAdStyles < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed860();
+    o.items = buildUnnamed152();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -964,7 +964,7 @@
   buildCounterSavedAdStyles++;
   if (buildCounterSavedAdStyles < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed860(o.items);
+    checkUnnamed152(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -994,14 +994,14 @@
   buildCounterSavedReport--;
 }
 
-buildUnnamed861() {
+buildUnnamed153() {
   var o = new core.List<api.SavedReport>();
   o.add(buildSavedReport());
   o.add(buildSavedReport());
   return o;
 }
 
-checkUnnamed861(core.List<api.SavedReport> o) {
+checkUnnamed153(core.List<api.SavedReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSavedReport(o[0]);
   checkSavedReport(o[1]);
@@ -1013,7 +1013,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed861();
+    o.items = buildUnnamed153();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1025,7 +1025,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed861(o.items);
+    checkUnnamed153(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1055,14 +1055,14 @@
   buildCounterUrlChannel--;
 }
 
-buildUnnamed862() {
+buildUnnamed154() {
   var o = new core.List<api.UrlChannel>();
   o.add(buildUrlChannel());
   o.add(buildUrlChannel());
   return o;
 }
 
-checkUnnamed862(core.List<api.UrlChannel> o) {
+checkUnnamed154(core.List<api.UrlChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlChannel(o[0]);
   checkUrlChannel(o[1]);
@@ -1074,7 +1074,7 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed862();
+    o.items = buildUnnamed154();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1086,125 +1086,125 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed862(o.items);
+    checkUnnamed154(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterUrlChannels--;
 }
 
-buildUnnamed863() {
+buildUnnamed155() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed863(core.List<core.String> o) {
+checkUnnamed155(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed864() {
+buildUnnamed156() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed864(core.List<core.String> o) {
+checkUnnamed156(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed865() {
+buildUnnamed157() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed865(core.List<core.String> o) {
+checkUnnamed157(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed866() {
+buildUnnamed158() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed866(core.List<core.String> o) {
+checkUnnamed158(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed867() {
+buildUnnamed159() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed867(core.List<core.String> o) {
+checkUnnamed159(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed868() {
+buildUnnamed160() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed868(core.List<core.String> o) {
+checkUnnamed160(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed869() {
+buildUnnamed161() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed869(core.List<core.String> o) {
+checkUnnamed161(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed870() {
+buildUnnamed162() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed870(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'));
 }
 
-buildUnnamed871() {
+buildUnnamed163() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed871(core.List<core.String> o) {
+checkUnnamed163(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2333,12 +2333,12 @@
       var arg_startDate = "foo";
       var arg_endDate = "foo";
       var arg_currency = "foo";
-      var arg_dimension = buildUnnamed863();
-      var arg_filter = buildUnnamed864();
+      var arg_dimension = buildUnnamed155();
+      var arg_filter = buildUnnamed156();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed865();
-      var arg_sort = buildUnnamed866();
+      var arg_metric = buildUnnamed157();
+      var arg_sort = buildUnnamed158();
       var arg_startIndex = 42;
       var arg_useTimezoneReporting = true;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
@@ -3460,14 +3460,14 @@
       api.ReportsResourceApi res = new api.AdsenseApi(mock).reports;
       var arg_startDate = "foo";
       var arg_endDate = "foo";
-      var arg_accountId = buildUnnamed867();
+      var arg_accountId = buildUnnamed159();
       var arg_currency = "foo";
-      var arg_dimension = buildUnnamed868();
-      var arg_filter = buildUnnamed869();
+      var arg_dimension = buildUnnamed160();
+      var arg_filter = buildUnnamed161();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed870();
-      var arg_sort = buildUnnamed871();
+      var arg_metric = buildUnnamed162();
+      var arg_sort = buildUnnamed163();
       var arg_startIndex = 42;
       var arg_useTimezoneReporting = true;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
diff --git a/generated/googleapis/test/adsensehost/v4_1_test.dart b/generated/googleapis/test/adsensehost/v4_1_test.dart
index 9bd2249..7476d8a 100644
--- a/generated/googleapis/test/adsensehost/v4_1_test.dart
+++ b/generated/googleapis/test/adsensehost/v4_1_test.dart
@@ -41,14 +41,14 @@
   buildCounterAccount--;
 }
 
-buildUnnamed1043() {
+buildUnnamed164() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed1043(core.List<api.Account> o) {
+checkUnnamed164(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -60,7 +60,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1043();
+    o.items = buildUnnamed164();
     o.kind = "foo";
   }
   buildCounterAccounts--;
@@ -71,7 +71,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1043(o.items);
+    checkUnnamed164(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccounts--;
@@ -104,14 +104,14 @@
   buildCounterAdClient--;
 }
 
-buildUnnamed1044() {
+buildUnnamed165() {
   var o = new core.List<api.AdClient>();
   o.add(buildAdClient());
   o.add(buildAdClient());
   return o;
 }
 
-checkUnnamed1044(core.List<api.AdClient> o) {
+checkUnnamed165(core.List<api.AdClient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdClient(o[0]);
   checkAdClient(o[1]);
@@ -123,7 +123,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1044();
+    o.items = buildUnnamed165();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -135,7 +135,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1044(o.items);
+    checkUnnamed165(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -340,14 +340,14 @@
   buildCounterAdUnit--;
 }
 
-buildUnnamed1045() {
+buildUnnamed166() {
   var o = new core.List<api.AdUnit>();
   o.add(buildAdUnit());
   o.add(buildAdUnit());
   return o;
 }
 
-checkUnnamed1045(core.List<api.AdUnit> o) {
+checkUnnamed166(core.List<api.AdUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdUnit(o[0]);
   checkAdUnit(o[1]);
@@ -359,7 +359,7 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1045();
+    o.items = buildUnnamed166();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -371,21 +371,21 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1045(o.items);
+    checkUnnamed166(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterAdUnits--;
 }
 
-buildUnnamed1046() {
+buildUnnamed167() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1046(core.List<core.String> o) {
+checkUnnamed167(core.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 +399,7 @@
     o.accountId = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.productCodes = buildUnnamed1046();
+    o.productCodes = buildUnnamed167();
     o.redirectUrl = "foo";
     o.status = "foo";
     o.userLocale = "foo";
@@ -416,7 +416,7 @@
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1046(o.productCodes);
+    checkUnnamed167(o.productCodes);
     unittest.expect(o.redirectUrl, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.userLocale, unittest.equals('foo'));
@@ -451,14 +451,14 @@
   buildCounterCustomChannel--;
 }
 
-buildUnnamed1047() {
+buildUnnamed168() {
   var o = new core.List<api.CustomChannel>();
   o.add(buildCustomChannel());
   o.add(buildCustomChannel());
   return o;
 }
 
-checkUnnamed1047(core.List<api.CustomChannel> o) {
+checkUnnamed168(core.List<api.CustomChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomChannel(o[0]);
   checkCustomChannel(o[1]);
@@ -470,7 +470,7 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1047();
+    o.items = buildUnnamed168();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -482,21 +482,21 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1047(o.items);
+    checkUnnamed168(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCustomChannels--;
 }
 
-buildUnnamed1048() {
+buildUnnamed169() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1048(core.List<core.String> o) {
+checkUnnamed169(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -525,66 +525,66 @@
   buildCounterReportHeaders--;
 }
 
-buildUnnamed1049() {
+buildUnnamed170() {
   var o = new core.List<api.ReportHeaders>();
   o.add(buildReportHeaders());
   o.add(buildReportHeaders());
   return o;
 }
 
-checkUnnamed1049(core.List<api.ReportHeaders> o) {
+checkUnnamed170(core.List<api.ReportHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportHeaders(o[0]);
   checkReportHeaders(o[1]);
 }
 
-buildUnnamed1050() {
+buildUnnamed171() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1050(core.List<core.String> o) {
+checkUnnamed171(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1051() {
+buildUnnamed172() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed1050());
-  o.add(buildUnnamed1050());
+  o.add(buildUnnamed171());
+  o.add(buildUnnamed171());
   return o;
 }
 
-checkUnnamed1051(core.List<core.List<core.String>> o) {
+checkUnnamed172(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1050(o[0]);
-  checkUnnamed1050(o[1]);
+  checkUnnamed171(o[0]);
+  checkUnnamed171(o[1]);
 }
 
-buildUnnamed1052() {
+buildUnnamed173() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1052(core.List<core.String> o) {
+checkUnnamed173(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1053() {
+buildUnnamed174() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1053(core.List<core.String> o) {
+checkUnnamed174(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -595,13 +595,13 @@
   var o = new api.Report();
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    o.averages = buildUnnamed1048();
-    o.headers = buildUnnamed1049();
+    o.averages = buildUnnamed169();
+    o.headers = buildUnnamed170();
     o.kind = "foo";
-    o.rows = buildUnnamed1051();
+    o.rows = buildUnnamed172();
     o.totalMatchedRows = "foo";
-    o.totals = buildUnnamed1052();
-    o.warnings = buildUnnamed1053();
+    o.totals = buildUnnamed173();
+    o.warnings = buildUnnamed174();
   }
   buildCounterReport--;
   return o;
@@ -610,13 +610,13 @@
 checkReport(api.Report o) {
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    checkUnnamed1048(o.averages);
-    checkUnnamed1049(o.headers);
+    checkUnnamed169(o.averages);
+    checkUnnamed170(o.headers);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1051(o.rows);
+    checkUnnamed172(o.rows);
     unittest.expect(o.totalMatchedRows, unittest.equals('foo'));
-    checkUnnamed1052(o.totals);
-    checkUnnamed1053(o.warnings);
+    checkUnnamed173(o.totals);
+    checkUnnamed174(o.warnings);
   }
   buildCounterReport--;
 }
@@ -644,14 +644,14 @@
   buildCounterUrlChannel--;
 }
 
-buildUnnamed1054() {
+buildUnnamed175() {
   var o = new core.List<api.UrlChannel>();
   o.add(buildUrlChannel());
   o.add(buildUrlChannel());
   return o;
 }
 
-checkUnnamed1054(core.List<api.UrlChannel> o) {
+checkUnnamed175(core.List<api.UrlChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlChannel(o[0]);
   checkUrlChannel(o[1]);
@@ -663,7 +663,7 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1054();
+    o.items = buildUnnamed175();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -675,151 +675,151 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1054(o.items);
+    checkUnnamed175(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterUrlChannels--;
 }
 
-buildUnnamed1055() {
+buildUnnamed176() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1055(core.List<core.String> o) {
+checkUnnamed176(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1056() {
+buildUnnamed177() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1056(core.List<core.String> o) {
+checkUnnamed177(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1057() {
+buildUnnamed178() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1057(core.List<core.String> o) {
+checkUnnamed178(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1058() {
+buildUnnamed179() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1058(core.List<core.String> o) {
+checkUnnamed179(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1059() {
+buildUnnamed180() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1059(core.List<core.String> o) {
+checkUnnamed180(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1060() {
+buildUnnamed181() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1060(core.List<core.String> o) {
+checkUnnamed181(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1061() {
+buildUnnamed182() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1061(core.List<core.String> o) {
+checkUnnamed182(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1062() {
+buildUnnamed183() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1062(core.List<core.String> o) {
+checkUnnamed183(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1063() {
+buildUnnamed184() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1063(core.List<core.String> o) {
+checkUnnamed184(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1064() {
+buildUnnamed185() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1064(core.List<core.String> o) {
+checkUnnamed185(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1065() {
+buildUnnamed186() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1065(core.List<core.String> o) {
+checkUnnamed186(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1061,7 +1061,7 @@
 
       var mock = new common_test.HttpServerMock();
       api.AccountsResourceApi res = new api.AdsensehostApi(mock).accounts;
-      var arg_filterAdClientId = buildUnnamed1055();
+      var arg_filterAdClientId = buildUnnamed176();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1363,7 +1363,7 @@
       var arg_accountId = "foo";
       var arg_adClientId = "foo";
       var arg_adUnitId = "foo";
-      var arg_hostCustomChannelId = buildUnnamed1056();
+      var arg_hostCustomChannelId = buildUnnamed177();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1702,12 +1702,12 @@
       var arg_accountId = "foo";
       var arg_startDate = "foo";
       var arg_endDate = "foo";
-      var arg_dimension = buildUnnamed1057();
-      var arg_filter = buildUnnamed1058();
+      var arg_dimension = buildUnnamed178();
+      var arg_filter = buildUnnamed179();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed1059();
-      var arg_sort = buildUnnamed1060();
+      var arg_metric = buildUnnamed180();
+      var arg_sort = buildUnnamed181();
       var arg_startIndex = 42;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1876,7 +1876,7 @@
 
       var mock = new common_test.HttpServerMock();
       api.AssociationsessionsResourceApi res = new api.AdsensehostApi(mock).associationsessions;
-      var arg_productCode = buildUnnamed1061();
+      var arg_productCode = buildUnnamed182();
       var arg_websiteUrl = "foo";
       var arg_userLocale = "foo";
       var arg_websiteLocale = "foo";
@@ -2330,12 +2330,12 @@
       api.ReportsResourceApi res = new api.AdsensehostApi(mock).reports;
       var arg_startDate = "foo";
       var arg_endDate = "foo";
-      var arg_dimension = buildUnnamed1062();
-      var arg_filter = buildUnnamed1063();
+      var arg_dimension = buildUnnamed183();
+      var arg_filter = buildUnnamed184();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed1064();
-      var arg_sort = buildUnnamed1065();
+      var arg_metric = buildUnnamed185();
+      var arg_sort = buildUnnamed186();
       var arg_startIndex = 42;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
diff --git a/generated/googleapis/test/analytics/v3_test.dart b/generated/googleapis/test/analytics/v3_test.dart
index 9c470bc..a5a07cc 100644
--- a/generated/googleapis/test/analytics/v3_test.dart
+++ b/generated/googleapis/test/analytics/v3_test.dart
@@ -37,14 +37,14 @@
   buildCounterAccountChildLink--;
 }
 
-buildUnnamed592() {
+buildUnnamed187() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed592(core.List<core.String> o) {
+checkUnnamed187(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -55,7 +55,7 @@
   var o = new api.AccountPermissions();
   buildCounterAccountPermissions++;
   if (buildCounterAccountPermissions < 3) {
-    o.effective = buildUnnamed592();
+    o.effective = buildUnnamed187();
   }
   buildCounterAccountPermissions--;
   return o;
@@ -64,7 +64,7 @@
 checkAccountPermissions(api.AccountPermissions o) {
   buildCounterAccountPermissions++;
   if (buildCounterAccountPermissions < 3) {
-    checkUnnamed592(o.effective);
+    checkUnnamed187(o.effective);
   }
   buildCounterAccountPermissions--;
 }
@@ -127,14 +127,14 @@
   buildCounterAccountRef--;
 }
 
-buildUnnamed593() {
+buildUnnamed188() {
   var o = new core.List<api.AccountSummary>();
   o.add(buildAccountSummary());
   o.add(buildAccountSummary());
   return o;
 }
 
-checkUnnamed593(core.List<api.AccountSummary> o) {
+checkUnnamed188(core.List<api.AccountSummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountSummary(o[0]);
   checkAccountSummary(o[1]);
@@ -145,7 +145,7 @@
   var o = new api.AccountSummaries();
   buildCounterAccountSummaries++;
   if (buildCounterAccountSummaries < 3) {
-    o.items = buildUnnamed593();
+    o.items = buildUnnamed188();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -161,7 +161,7 @@
 checkAccountSummaries(api.AccountSummaries o) {
   buildCounterAccountSummaries++;
   if (buildCounterAccountSummaries < 3) {
-    checkUnnamed593(o.items);
+    checkUnnamed188(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -173,14 +173,14 @@
   buildCounterAccountSummaries--;
 }
 
-buildUnnamed594() {
+buildUnnamed189() {
   var o = new core.List<api.WebPropertySummary>();
   o.add(buildWebPropertySummary());
   o.add(buildWebPropertySummary());
   return o;
 }
 
-checkUnnamed594(core.List<api.WebPropertySummary> o) {
+checkUnnamed189(core.List<api.WebPropertySummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebPropertySummary(o[0]);
   checkWebPropertySummary(o[1]);
@@ -194,7 +194,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.webProperties = buildUnnamed594();
+    o.webProperties = buildUnnamed189();
   }
   buildCounterAccountSummary--;
   return o;
@@ -206,7 +206,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed594(o.webProperties);
+    checkUnnamed189(o.webProperties);
   }
   buildCounterAccountSummary--;
 }
@@ -240,14 +240,14 @@
   buildCounterAccountTicket--;
 }
 
-buildUnnamed595() {
+buildUnnamed190() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed595(core.List<api.Account> o) {
+checkUnnamed190(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -258,7 +258,7 @@
   var o = new api.Accounts();
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
-    o.items = buildUnnamed595();
+    o.items = buildUnnamed190();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -274,7 +274,7 @@
 checkAccounts(api.Accounts o) {
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
-    checkUnnamed595(o.items);
+    checkUnnamed190(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -309,14 +309,14 @@
   buildCounterAdWordsAccount--;
 }
 
-buildUnnamed596() {
+buildUnnamed191() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed596(core.List<core.String> o) {
+checkUnnamed191(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -327,7 +327,7 @@
   var o = new api.AnalyticsDataimportDeleteUploadDataRequest();
   buildCounterAnalyticsDataimportDeleteUploadDataRequest++;
   if (buildCounterAnalyticsDataimportDeleteUploadDataRequest < 3) {
-    o.customDataImportUids = buildUnnamed596();
+    o.customDataImportUids = buildUnnamed191();
   }
   buildCounterAnalyticsDataimportDeleteUploadDataRequest--;
   return o;
@@ -336,19 +336,19 @@
 checkAnalyticsDataimportDeleteUploadDataRequest(api.AnalyticsDataimportDeleteUploadDataRequest o) {
   buildCounterAnalyticsDataimportDeleteUploadDataRequest++;
   if (buildCounterAnalyticsDataimportDeleteUploadDataRequest < 3) {
-    checkUnnamed596(o.customDataImportUids);
+    checkUnnamed191(o.customDataImportUids);
   }
   buildCounterAnalyticsDataimportDeleteUploadDataRequest--;
 }
 
-buildUnnamed597() {
+buildUnnamed192() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed597(core.Map<core.String, core.String> o) {
+checkUnnamed192(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'));
@@ -359,7 +359,7 @@
   var o = new api.Column();
   buildCounterColumn++;
   if (buildCounterColumn < 3) {
-    o.attributes = buildUnnamed597();
+    o.attributes = buildUnnamed192();
     o.id = "foo";
     o.kind = "foo";
   }
@@ -370,34 +370,34 @@
 checkColumn(api.Column o) {
   buildCounterColumn++;
   if (buildCounterColumn < 3) {
-    checkUnnamed597(o.attributes);
+    checkUnnamed192(o.attributes);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterColumn--;
 }
 
-buildUnnamed598() {
+buildUnnamed193() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed598(core.List<core.String> o) {
+checkUnnamed193(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed599() {
+buildUnnamed194() {
   var o = new core.List<api.Column>();
   o.add(buildColumn());
   o.add(buildColumn());
   return o;
 }
 
-checkUnnamed599(core.List<api.Column> o) {
+checkUnnamed194(core.List<api.Column> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColumn(o[0]);
   checkColumn(o[1]);
@@ -408,9 +408,9 @@
   var o = new api.Columns();
   buildCounterColumns++;
   if (buildCounterColumns < 3) {
-    o.attributeNames = buildUnnamed598();
+    o.attributeNames = buildUnnamed193();
     o.etag = "foo";
-    o.items = buildUnnamed599();
+    o.items = buildUnnamed194();
     o.kind = "foo";
     o.totalResults = 42;
   }
@@ -421,9 +421,9 @@
 checkColumns(api.Columns o) {
   buildCounterColumns++;
   if (buildCounterColumns < 3) {
-    checkUnnamed598(o.attributeNames);
+    checkUnnamed193(o.attributeNames);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed599(o.items);
+    checkUnnamed194(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.totalResults, unittest.equals(42));
   }
@@ -472,14 +472,14 @@
   buildCounterCustomDataSourceParentLink--;
 }
 
-buildUnnamed600() {
+buildUnnamed195() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed600(core.List<core.String> o) {
+checkUnnamed195(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -499,7 +499,7 @@
     o.kind = "foo";
     o.name = "foo";
     o.parentLink = buildCustomDataSourceParentLink();
-    o.profilesLinked = buildUnnamed600();
+    o.profilesLinked = buildUnnamed195();
     o.selfLink = "foo";
     o.type = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
@@ -522,7 +522,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkCustomDataSourceParentLink(o.parentLink);
-    checkUnnamed600(o.profilesLinked);
+    checkUnnamed195(o.profilesLinked);
     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")));
@@ -532,14 +532,14 @@
   buildCounterCustomDataSource--;
 }
 
-buildUnnamed601() {
+buildUnnamed196() {
   var o = new core.List<api.CustomDataSource>();
   o.add(buildCustomDataSource());
   o.add(buildCustomDataSource());
   return o;
 }
 
-checkUnnamed601(core.List<api.CustomDataSource> o) {
+checkUnnamed196(core.List<api.CustomDataSource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomDataSource(o[0]);
   checkCustomDataSource(o[1]);
@@ -550,7 +550,7 @@
   var o = new api.CustomDataSources();
   buildCounterCustomDataSources++;
   if (buildCounterCustomDataSources < 3) {
-    o.items = buildUnnamed601();
+    o.items = buildUnnamed196();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -566,7 +566,7 @@
 checkCustomDataSources(api.CustomDataSources o) {
   buildCounterCustomDataSources++;
   if (buildCounterCustomDataSources < 3) {
-    checkUnnamed601(o.items);
+    checkUnnamed196(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -620,14 +620,14 @@
   buildCounterDailyUploadRecentChanges--;
 }
 
-buildUnnamed602() {
+buildUnnamed197() {
   var o = new core.List<api.DailyUploadRecentChanges>();
   o.add(buildDailyUploadRecentChanges());
   o.add(buildDailyUploadRecentChanges());
   return o;
 }
 
-checkUnnamed602(core.List<api.DailyUploadRecentChanges> o) {
+checkUnnamed197(core.List<api.DailyUploadRecentChanges> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDailyUploadRecentChanges(o[0]);
   checkDailyUploadRecentChanges(o[1]);
@@ -646,7 +646,7 @@
     o.kind = "foo";
     o.modifiedTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.parentLink = buildDailyUploadParentLink();
-    o.recentChanges = buildUnnamed602();
+    o.recentChanges = buildUnnamed197();
     o.selfLink = "foo";
     o.webPropertyId = "foo";
   }
@@ -665,7 +665,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.modifiedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkDailyUploadParentLink(o.parentLink);
-    checkUnnamed602(o.recentChanges);
+    checkUnnamed197(o.recentChanges);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.webPropertyId, unittest.equals('foo'));
   }
@@ -703,14 +703,14 @@
   buildCounterDailyUploadAppend--;
 }
 
-buildUnnamed603() {
+buildUnnamed198() {
   var o = new core.List<api.DailyUpload>();
   o.add(buildDailyUpload());
   o.add(buildDailyUpload());
   return o;
 }
 
-checkUnnamed603(core.List<api.DailyUpload> o) {
+checkUnnamed198(core.List<api.DailyUpload> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDailyUpload(o[0]);
   checkDailyUpload(o[1]);
@@ -721,7 +721,7 @@
   var o = new api.DailyUploads();
   buildCounterDailyUploads++;
   if (buildCounterDailyUploads < 3) {
-    o.items = buildUnnamed603();
+    o.items = buildUnnamed198();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -737,7 +737,7 @@
 checkDailyUploads(api.DailyUploads o) {
   buildCounterDailyUploads++;
   if (buildCounterDailyUploads < 3) {
-    checkUnnamed603(o.items);
+    checkUnnamed198(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -749,14 +749,14 @@
   buildCounterDailyUploads--;
 }
 
-buildUnnamed604() {
+buildUnnamed199() {
   var o = new core.List<api.AdWordsAccount>();
   o.add(buildAdWordsAccount());
   o.add(buildAdWordsAccount());
   return o;
 }
 
-checkUnnamed604(core.List<api.AdWordsAccount> o) {
+checkUnnamed199(core.List<api.AdWordsAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdWordsAccount(o[0]);
   checkAdWordsAccount(o[1]);
@@ -781,14 +781,14 @@
   buildCounterEntityAdWordsLinkEntity--;
 }
 
-buildUnnamed605() {
+buildUnnamed200() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed605(core.List<core.String> o) {
+checkUnnamed200(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -799,12 +799,12 @@
   var o = new api.EntityAdWordsLink();
   buildCounterEntityAdWordsLink++;
   if (buildCounterEntityAdWordsLink < 3) {
-    o.adWordsAccounts = buildUnnamed604();
+    o.adWordsAccounts = buildUnnamed199();
     o.entity = buildEntityAdWordsLinkEntity();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.profileIds = buildUnnamed605();
+    o.profileIds = buildUnnamed200();
     o.selfLink = "foo";
   }
   buildCounterEntityAdWordsLink--;
@@ -814,25 +814,25 @@
 checkEntityAdWordsLink(api.EntityAdWordsLink o) {
   buildCounterEntityAdWordsLink++;
   if (buildCounterEntityAdWordsLink < 3) {
-    checkUnnamed604(o.adWordsAccounts);
+    checkUnnamed199(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'));
-    checkUnnamed605(o.profileIds);
+    checkUnnamed200(o.profileIds);
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
   buildCounterEntityAdWordsLink--;
 }
 
-buildUnnamed606() {
+buildUnnamed201() {
   var o = new core.List<api.EntityAdWordsLink>();
   o.add(buildEntityAdWordsLink());
   o.add(buildEntityAdWordsLink());
   return o;
 }
 
-checkUnnamed606(core.List<api.EntityAdWordsLink> o) {
+checkUnnamed201(core.List<api.EntityAdWordsLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityAdWordsLink(o[0]);
   checkEntityAdWordsLink(o[1]);
@@ -843,7 +843,7 @@
   var o = new api.EntityAdWordsLinks();
   buildCounterEntityAdWordsLinks++;
   if (buildCounterEntityAdWordsLinks < 3) {
-    o.items = buildUnnamed606();
+    o.items = buildUnnamed201();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -858,7 +858,7 @@
 checkEntityAdWordsLinks(api.EntityAdWordsLinks o) {
   buildCounterEntityAdWordsLinks++;
   if (buildCounterEntityAdWordsLinks < 3) {
-    checkUnnamed606(o.items);
+    checkUnnamed201(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -892,27 +892,27 @@
   buildCounterEntityUserLinkEntity--;
 }
 
-buildUnnamed607() {
+buildUnnamed202() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed607(core.List<core.String> o) {
+checkUnnamed202(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed608() {
+buildUnnamed203() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed608(core.List<core.String> o) {
+checkUnnamed203(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -923,8 +923,8 @@
   var o = new api.EntityUserLinkPermissions();
   buildCounterEntityUserLinkPermissions++;
   if (buildCounterEntityUserLinkPermissions < 3) {
-    o.effective = buildUnnamed607();
-    o.local = buildUnnamed608();
+    o.effective = buildUnnamed202();
+    o.local = buildUnnamed203();
   }
   buildCounterEntityUserLinkPermissions--;
   return o;
@@ -933,8 +933,8 @@
 checkEntityUserLinkPermissions(api.EntityUserLinkPermissions o) {
   buildCounterEntityUserLinkPermissions++;
   if (buildCounterEntityUserLinkPermissions < 3) {
-    checkUnnamed607(o.effective);
-    checkUnnamed608(o.local);
+    checkUnnamed202(o.effective);
+    checkUnnamed203(o.local);
   }
   buildCounterEntityUserLinkPermissions--;
 }
@@ -968,14 +968,14 @@
   buildCounterEntityUserLink--;
 }
 
-buildUnnamed609() {
+buildUnnamed204() {
   var o = new core.List<api.EntityUserLink>();
   o.add(buildEntityUserLink());
   o.add(buildEntityUserLink());
   return o;
 }
 
-checkUnnamed609(core.List<api.EntityUserLink> o) {
+checkUnnamed204(core.List<api.EntityUserLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityUserLink(o[0]);
   checkEntityUserLink(o[1]);
@@ -986,7 +986,7 @@
   var o = new api.EntityUserLinks();
   buildCounterEntityUserLinks++;
   if (buildCounterEntityUserLinks < 3) {
-    o.items = buildUnnamed609();
+    o.items = buildUnnamed204();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -1001,7 +1001,7 @@
 checkEntityUserLinks(api.EntityUserLinks o) {
   buildCounterEntityUserLinks++;
   if (buildCounterEntityUserLinks < 3) {
-    checkUnnamed609(o.items);
+    checkUnnamed204(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -1060,14 +1060,14 @@
   buildCounterExperimentVariations--;
 }
 
-buildUnnamed610() {
+buildUnnamed205() {
   var o = new core.List<api.ExperimentVariations>();
   o.add(buildExperimentVariations());
   o.add(buildExperimentVariations());
   return o;
 }
 
-checkUnnamed610(core.List<api.ExperimentVariations> o) {
+checkUnnamed205(core.List<api.ExperimentVariations> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExperimentVariations(o[0]);
   checkExperimentVariations(o[1]);
@@ -1102,7 +1102,7 @@
     o.status = "foo";
     o.trafficCoverage = 42.0;
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
-    o.variations = buildUnnamed610();
+    o.variations = buildUnnamed205();
     o.webPropertyId = "foo";
     o.winnerConfidenceLevel = 42.0;
     o.winnerFound = true;
@@ -1138,7 +1138,7 @@
     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")));
-    checkUnnamed610(o.variations);
+    checkUnnamed205(o.variations);
     unittest.expect(o.webPropertyId, unittest.equals('foo'));
     unittest.expect(o.winnerConfidenceLevel, unittest.equals(42.0));
     unittest.expect(o.winnerFound, unittest.isTrue);
@@ -1146,14 +1146,14 @@
   buildCounterExperiment--;
 }
 
-buildUnnamed611() {
+buildUnnamed206() {
   var o = new core.List<api.Experiment>();
   o.add(buildExperiment());
   o.add(buildExperiment());
   return o;
 }
 
-checkUnnamed611(core.List<api.Experiment> o) {
+checkUnnamed206(core.List<api.Experiment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExperiment(o[0]);
   checkExperiment(o[1]);
@@ -1164,7 +1164,7 @@
   var o = new api.Experiments();
   buildCounterExperiments++;
   if (buildCounterExperiments < 3) {
-    o.items = buildUnnamed611();
+    o.items = buildUnnamed206();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -1180,7 +1180,7 @@
 checkExperiments(api.Experiments o) {
   buildCounterExperiments++;
   if (buildCounterExperiments < 3) {
-    checkUnnamed611(o.items);
+    checkUnnamed206(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -1414,14 +1414,14 @@
   buildCounterFilterRef--;
 }
 
-buildUnnamed612() {
+buildUnnamed207() {
   var o = new core.List<api.Filter>();
   o.add(buildFilter());
   o.add(buildFilter());
   return o;
 }
 
-checkUnnamed612(core.List<api.Filter> o) {
+checkUnnamed207(core.List<api.Filter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilter(o[0]);
   checkFilter(o[1]);
@@ -1432,7 +1432,7 @@
   var o = new api.Filters();
   buildCounterFilters++;
   if (buildCounterFilters < 3) {
-    o.items = buildUnnamed612();
+    o.items = buildUnnamed207();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -1448,7 +1448,7 @@
 checkFilters(api.Filters o) {
   buildCounterFilters++;
   if (buildCounterFilters < 3) {
-    checkUnnamed612(o.items);
+    checkUnnamed207(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -1483,14 +1483,14 @@
   buildCounterGaDataColumnHeaders--;
 }
 
-buildUnnamed613() {
+buildUnnamed208() {
   var o = new core.List<api.GaDataColumnHeaders>();
   o.add(buildGaDataColumnHeaders());
   o.add(buildGaDataColumnHeaders());
   return o;
 }
 
-checkUnnamed613(core.List<api.GaDataColumnHeaders> o) {
+checkUnnamed208(core.List<api.GaDataColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGaDataColumnHeaders(o[0]);
   checkGaDataColumnHeaders(o[1]);
@@ -1519,14 +1519,14 @@
   buildCounterGaDataDataTableCols--;
 }
 
-buildUnnamed614() {
+buildUnnamed209() {
   var o = new core.List<api.GaDataDataTableCols>();
   o.add(buildGaDataDataTableCols());
   o.add(buildGaDataDataTableCols());
   return o;
 }
 
-checkUnnamed614(core.List<api.GaDataDataTableCols> o) {
+checkUnnamed209(core.List<api.GaDataDataTableCols> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGaDataDataTableCols(o[0]);
   checkGaDataDataTableCols(o[1]);
@@ -1551,14 +1551,14 @@
   buildCounterGaDataDataTableRowsC--;
 }
 
-buildUnnamed615() {
+buildUnnamed210() {
   var o = new core.List<api.GaDataDataTableRowsC>();
   o.add(buildGaDataDataTableRowsC());
   o.add(buildGaDataDataTableRowsC());
   return o;
 }
 
-checkUnnamed615(core.List<api.GaDataDataTableRowsC> o) {
+checkUnnamed210(core.List<api.GaDataDataTableRowsC> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGaDataDataTableRowsC(o[0]);
   checkGaDataDataTableRowsC(o[1]);
@@ -1569,7 +1569,7 @@
   var o = new api.GaDataDataTableRows();
   buildCounterGaDataDataTableRows++;
   if (buildCounterGaDataDataTableRows < 3) {
-    o.c = buildUnnamed615();
+    o.c = buildUnnamed210();
   }
   buildCounterGaDataDataTableRows--;
   return o;
@@ -1578,19 +1578,19 @@
 checkGaDataDataTableRows(api.GaDataDataTableRows o) {
   buildCounterGaDataDataTableRows++;
   if (buildCounterGaDataDataTableRows < 3) {
-    checkUnnamed615(o.c);
+    checkUnnamed210(o.c);
   }
   buildCounterGaDataDataTableRows--;
 }
 
-buildUnnamed616() {
+buildUnnamed211() {
   var o = new core.List<api.GaDataDataTableRows>();
   o.add(buildGaDataDataTableRows());
   o.add(buildGaDataDataTableRows());
   return o;
 }
 
-checkUnnamed616(core.List<api.GaDataDataTableRows> o) {
+checkUnnamed211(core.List<api.GaDataDataTableRows> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGaDataDataTableRows(o[0]);
   checkGaDataDataTableRows(o[1]);
@@ -1601,8 +1601,8 @@
   var o = new api.GaDataDataTable();
   buildCounterGaDataDataTable++;
   if (buildCounterGaDataDataTable < 3) {
-    o.cols = buildUnnamed614();
-    o.rows = buildUnnamed616();
+    o.cols = buildUnnamed209();
+    o.rows = buildUnnamed211();
   }
   buildCounterGaDataDataTable--;
   return o;
@@ -1611,8 +1611,8 @@
 checkGaDataDataTable(api.GaDataDataTable o) {
   buildCounterGaDataDataTable++;
   if (buildCounterGaDataDataTable < 3) {
-    checkUnnamed614(o.cols);
-    checkUnnamed616(o.rows);
+    checkUnnamed209(o.cols);
+    checkUnnamed211(o.rows);
   }
   buildCounterGaDataDataTable--;
 }
@@ -1646,27 +1646,27 @@
   buildCounterGaDataProfileInfo--;
 }
 
-buildUnnamed617() {
+buildUnnamed212() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed617(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'));
 }
 
-buildUnnamed618() {
+buildUnnamed213() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed618(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'));
@@ -1682,10 +1682,10 @@
     o.filters = "foo";
     o.ids = "foo";
     o.max_results = 42;
-    o.metrics = buildUnnamed617();
+    o.metrics = buildUnnamed212();
     o.samplingLevel = "foo";
     o.segment = "foo";
-    o.sort = buildUnnamed618();
+    o.sort = buildUnnamed213();
     o.start_date = "foo";
     o.start_index = 42;
   }
@@ -1701,50 +1701,50 @@
     unittest.expect(o.filters, unittest.equals('foo'));
     unittest.expect(o.ids, unittest.equals('foo'));
     unittest.expect(o.max_results, unittest.equals(42));
-    checkUnnamed617(o.metrics);
+    checkUnnamed212(o.metrics);
     unittest.expect(o.samplingLevel, unittest.equals('foo'));
     unittest.expect(o.segment, unittest.equals('foo'));
-    checkUnnamed618(o.sort);
+    checkUnnamed213(o.sort);
     unittest.expect(o.start_date, unittest.equals('foo'));
     unittest.expect(o.start_index, unittest.equals(42));
   }
   buildCounterGaDataQuery--;
 }
 
-buildUnnamed619() {
+buildUnnamed214() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed619(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'));
 }
 
-buildUnnamed620() {
+buildUnnamed215() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed619());
-  o.add(buildUnnamed619());
+  o.add(buildUnnamed214());
+  o.add(buildUnnamed214());
   return o;
 }
 
-checkUnnamed620(core.List<core.List<core.String>> o) {
+checkUnnamed215(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed619(o[0]);
-  checkUnnamed619(o[1]);
+  checkUnnamed214(o[0]);
+  checkUnnamed214(o[1]);
 }
 
-buildUnnamed621() {
+buildUnnamed216() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed621(core.Map<core.String, core.String> o) {
+checkUnnamed216(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'));
@@ -1755,7 +1755,7 @@
   var o = new api.GaData();
   buildCounterGaData++;
   if (buildCounterGaData < 3) {
-    o.columnHeaders = buildUnnamed613();
+    o.columnHeaders = buildUnnamed208();
     o.containsSampledData = true;
     o.dataTable = buildGaDataDataTable();
     o.id = "foo";
@@ -1765,12 +1765,12 @@
     o.previousLink = "foo";
     o.profileInfo = buildGaDataProfileInfo();
     o.query = buildGaDataQuery();
-    o.rows = buildUnnamed620();
+    o.rows = buildUnnamed215();
     o.sampleSize = "foo";
     o.sampleSpace = "foo";
     o.selfLink = "foo";
     o.totalResults = 42;
-    o.totalsForAllResults = buildUnnamed621();
+    o.totalsForAllResults = buildUnnamed216();
   }
   buildCounterGaData--;
   return o;
@@ -1779,7 +1779,7 @@
 checkGaData(api.GaData o) {
   buildCounterGaData++;
   if (buildCounterGaData < 3) {
-    checkUnnamed613(o.columnHeaders);
+    checkUnnamed208(o.columnHeaders);
     unittest.expect(o.containsSampledData, unittest.isTrue);
     checkGaDataDataTable(o.dataTable);
     unittest.expect(o.id, unittest.equals('foo'));
@@ -1789,12 +1789,12 @@
     unittest.expect(o.previousLink, unittest.equals('foo'));
     checkGaDataProfileInfo(o.profileInfo);
     checkGaDataQuery(o.query);
-    checkUnnamed620(o.rows);
+    checkUnnamed215(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));
-    checkUnnamed621(o.totalsForAllResults);
+    checkUnnamed216(o.totalsForAllResults);
   }
   buildCounterGaData--;
 }
@@ -1826,14 +1826,14 @@
   buildCounterGoalEventDetailsEventConditions--;
 }
 
-buildUnnamed622() {
+buildUnnamed217() {
   var o = new core.List<api.GoalEventDetailsEventConditions>();
   o.add(buildGoalEventDetailsEventConditions());
   o.add(buildGoalEventDetailsEventConditions());
   return o;
 }
 
-checkUnnamed622(core.List<api.GoalEventDetailsEventConditions> o) {
+checkUnnamed217(core.List<api.GoalEventDetailsEventConditions> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoalEventDetailsEventConditions(o[0]);
   checkGoalEventDetailsEventConditions(o[1]);
@@ -1844,7 +1844,7 @@
   var o = new api.GoalEventDetails();
   buildCounterGoalEventDetails++;
   if (buildCounterGoalEventDetails < 3) {
-    o.eventConditions = buildUnnamed622();
+    o.eventConditions = buildUnnamed217();
     o.useEventValue = true;
   }
   buildCounterGoalEventDetails--;
@@ -1854,7 +1854,7 @@
 checkGoalEventDetails(api.GoalEventDetails o) {
   buildCounterGoalEventDetails++;
   if (buildCounterGoalEventDetails < 3) {
-    checkUnnamed622(o.eventConditions);
+    checkUnnamed217(o.eventConditions);
     unittest.expect(o.useEventValue, unittest.isTrue);
   }
   buildCounterGoalEventDetails--;
@@ -1904,14 +1904,14 @@
   buildCounterGoalUrlDestinationDetailsSteps--;
 }
 
-buildUnnamed623() {
+buildUnnamed218() {
   var o = new core.List<api.GoalUrlDestinationDetailsSteps>();
   o.add(buildGoalUrlDestinationDetailsSteps());
   o.add(buildGoalUrlDestinationDetailsSteps());
   return o;
 }
 
-checkUnnamed623(core.List<api.GoalUrlDestinationDetailsSteps> o) {
+checkUnnamed218(core.List<api.GoalUrlDestinationDetailsSteps> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoalUrlDestinationDetailsSteps(o[0]);
   checkGoalUrlDestinationDetailsSteps(o[1]);
@@ -1925,7 +1925,7 @@
     o.caseSensitive = true;
     o.firstStepRequired = true;
     o.matchType = "foo";
-    o.steps = buildUnnamed623();
+    o.steps = buildUnnamed218();
     o.url = "foo";
   }
   buildCounterGoalUrlDestinationDetails--;
@@ -1938,7 +1938,7 @@
     unittest.expect(o.caseSensitive, unittest.isTrue);
     unittest.expect(o.firstStepRequired, unittest.isTrue);
     unittest.expect(o.matchType, unittest.equals('foo'));
-    checkUnnamed623(o.steps);
+    checkUnnamed218(o.steps);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterGoalUrlDestinationDetails--;
@@ -2039,14 +2039,14 @@
   buildCounterGoal--;
 }
 
-buildUnnamed624() {
+buildUnnamed219() {
   var o = new core.List<api.Goal>();
   o.add(buildGoal());
   o.add(buildGoal());
   return o;
 }
 
-checkUnnamed624(core.List<api.Goal> o) {
+checkUnnamed219(core.List<api.Goal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoal(o[0]);
   checkGoal(o[1]);
@@ -2057,7 +2057,7 @@
   var o = new api.Goals();
   buildCounterGoals++;
   if (buildCounterGoals < 3) {
-    o.items = buildUnnamed624();
+    o.items = buildUnnamed219();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -2073,7 +2073,7 @@
 checkGoals(api.Goals o) {
   buildCounterGoals++;
   if (buildCounterGoals < 3) {
-    checkUnnamed624(o.items);
+    checkUnnamed219(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -2108,14 +2108,14 @@
   buildCounterMcfDataColumnHeaders--;
 }
 
-buildUnnamed625() {
+buildUnnamed220() {
   var o = new core.List<api.McfDataColumnHeaders>();
   o.add(buildMcfDataColumnHeaders());
   o.add(buildMcfDataColumnHeaders());
   return o;
 }
 
-checkUnnamed625(core.List<api.McfDataColumnHeaders> o) {
+checkUnnamed220(core.List<api.McfDataColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMcfDataColumnHeaders(o[0]);
   checkMcfDataColumnHeaders(o[1]);
@@ -2150,27 +2150,27 @@
   buildCounterMcfDataProfileInfo--;
 }
 
-buildUnnamed626() {
+buildUnnamed221() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed626(core.List<core.String> o) {
+checkUnnamed221(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed627() {
+buildUnnamed222() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed627(core.List<core.String> o) {
+checkUnnamed222(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2186,10 +2186,10 @@
     o.filters = "foo";
     o.ids = "foo";
     o.max_results = 42;
-    o.metrics = buildUnnamed626();
+    o.metrics = buildUnnamed221();
     o.samplingLevel = "foo";
     o.segment = "foo";
-    o.sort = buildUnnamed627();
+    o.sort = buildUnnamed222();
     o.start_date = "foo";
     o.start_index = 42;
   }
@@ -2205,10 +2205,10 @@
     unittest.expect(o.filters, unittest.equals('foo'));
     unittest.expect(o.ids, unittest.equals('foo'));
     unittest.expect(o.max_results, unittest.equals(42));
-    checkUnnamed626(o.metrics);
+    checkUnnamed221(o.metrics);
     unittest.expect(o.samplingLevel, unittest.equals('foo'));
     unittest.expect(o.segment, unittest.equals('foo'));
-    checkUnnamed627(o.sort);
+    checkUnnamed222(o.sort);
     unittest.expect(o.start_date, unittest.equals('foo'));
     unittest.expect(o.start_index, unittest.equals(42));
   }
@@ -2236,14 +2236,14 @@
   buildCounterMcfDataRowsConversionPathValue--;
 }
 
-buildUnnamed628() {
+buildUnnamed223() {
   var o = new core.List<api.McfDataRowsConversionPathValue>();
   o.add(buildMcfDataRowsConversionPathValue());
   o.add(buildMcfDataRowsConversionPathValue());
   return o;
 }
 
-checkUnnamed628(core.List<api.McfDataRowsConversionPathValue> o) {
+checkUnnamed223(core.List<api.McfDataRowsConversionPathValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMcfDataRowsConversionPathValue(o[0]);
   checkMcfDataRowsConversionPathValue(o[1]);
@@ -2254,7 +2254,7 @@
   var o = new api.McfDataRows();
   buildCounterMcfDataRows++;
   if (buildCounterMcfDataRows < 3) {
-    o.conversionPathValue = buildUnnamed628();
+    o.conversionPathValue = buildUnnamed223();
     o.primitiveValue = "foo";
   }
   buildCounterMcfDataRows--;
@@ -2264,46 +2264,46 @@
 checkMcfDataRows(api.McfDataRows o) {
   buildCounterMcfDataRows++;
   if (buildCounterMcfDataRows < 3) {
-    checkUnnamed628(o.conversionPathValue);
+    checkUnnamed223(o.conversionPathValue);
     unittest.expect(o.primitiveValue, unittest.equals('foo'));
   }
   buildCounterMcfDataRows--;
 }
 
-buildUnnamed629() {
+buildUnnamed224() {
   var o = new core.List<api.McfDataRows>();
   o.add(buildMcfDataRows());
   o.add(buildMcfDataRows());
   return o;
 }
 
-checkUnnamed629(core.List<api.McfDataRows> o) {
+checkUnnamed224(core.List<api.McfDataRows> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMcfDataRows(o[0]);
   checkMcfDataRows(o[1]);
 }
 
-buildUnnamed630() {
+buildUnnamed225() {
   var o = new core.List<core.List<api.McfDataRows>>();
-  o.add(buildUnnamed629());
-  o.add(buildUnnamed629());
+  o.add(buildUnnamed224());
+  o.add(buildUnnamed224());
   return o;
 }
 
-checkUnnamed630(core.List<core.List<api.McfDataRows>> o) {
+checkUnnamed225(core.List<core.List<api.McfDataRows>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed629(o[0]);
-  checkUnnamed629(o[1]);
+  checkUnnamed224(o[0]);
+  checkUnnamed224(o[1]);
 }
 
-buildUnnamed631() {
+buildUnnamed226() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed631(core.Map<core.String, core.String> o) {
+checkUnnamed226(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'));
@@ -2314,7 +2314,7 @@
   var o = new api.McfData();
   buildCounterMcfData++;
   if (buildCounterMcfData < 3) {
-    o.columnHeaders = buildUnnamed625();
+    o.columnHeaders = buildUnnamed220();
     o.containsSampledData = true;
     o.id = "foo";
     o.itemsPerPage = 42;
@@ -2323,12 +2323,12 @@
     o.previousLink = "foo";
     o.profileInfo = buildMcfDataProfileInfo();
     o.query = buildMcfDataQuery();
-    o.rows = buildUnnamed630();
+    o.rows = buildUnnamed225();
     o.sampleSize = "foo";
     o.sampleSpace = "foo";
     o.selfLink = "foo";
     o.totalResults = 42;
-    o.totalsForAllResults = buildUnnamed631();
+    o.totalsForAllResults = buildUnnamed226();
   }
   buildCounterMcfData--;
   return o;
@@ -2337,7 +2337,7 @@
 checkMcfData(api.McfData o) {
   buildCounterMcfData++;
   if (buildCounterMcfData < 3) {
-    checkUnnamed625(o.columnHeaders);
+    checkUnnamed220(o.columnHeaders);
     unittest.expect(o.containsSampledData, unittest.isTrue);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.itemsPerPage, unittest.equals(42));
@@ -2346,12 +2346,12 @@
     unittest.expect(o.previousLink, unittest.equals('foo'));
     checkMcfDataProfileInfo(o.profileInfo);
     checkMcfDataQuery(o.query);
-    checkUnnamed630(o.rows);
+    checkUnnamed225(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));
-    checkUnnamed631(o.totalsForAllResults);
+    checkUnnamed226(o.totalsForAllResults);
   }
   buildCounterMcfData--;
 }
@@ -2398,14 +2398,14 @@
   buildCounterProfileParentLink--;
 }
 
-buildUnnamed632() {
+buildUnnamed227() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed632(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'));
@@ -2416,7 +2416,7 @@
   var o = new api.ProfilePermissions();
   buildCounterProfilePermissions++;
   if (buildCounterProfilePermissions < 3) {
-    o.effective = buildUnnamed632();
+    o.effective = buildUnnamed227();
   }
   buildCounterProfilePermissions--;
   return o;
@@ -2425,7 +2425,7 @@
 checkProfilePermissions(api.ProfilePermissions o) {
   buildCounterProfilePermissions++;
   if (buildCounterProfilePermissions < 3) {
-    checkUnnamed632(o.effective);
+    checkUnnamed227(o.effective);
   }
   buildCounterProfilePermissions--;
 }
@@ -2524,14 +2524,14 @@
   buildCounterProfileFilterLink--;
 }
 
-buildUnnamed633() {
+buildUnnamed228() {
   var o = new core.List<api.ProfileFilterLink>();
   o.add(buildProfileFilterLink());
   o.add(buildProfileFilterLink());
   return o;
 }
 
-checkUnnamed633(core.List<api.ProfileFilterLink> o) {
+checkUnnamed228(core.List<api.ProfileFilterLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProfileFilterLink(o[0]);
   checkProfileFilterLink(o[1]);
@@ -2542,7 +2542,7 @@
   var o = new api.ProfileFilterLinks();
   buildCounterProfileFilterLinks++;
   if (buildCounterProfileFilterLinks < 3) {
-    o.items = buildUnnamed633();
+    o.items = buildUnnamed228();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -2558,7 +2558,7 @@
 checkProfileFilterLinks(api.ProfileFilterLinks o) {
   buildCounterProfileFilterLinks++;
   if (buildCounterProfileFilterLinks < 3) {
-    checkUnnamed633(o.items);
+    checkUnnamed228(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -2626,14 +2626,14 @@
   buildCounterProfileSummary--;
 }
 
-buildUnnamed634() {
+buildUnnamed229() {
   var o = new core.List<api.Profile>();
   o.add(buildProfile());
   o.add(buildProfile());
   return o;
 }
 
-checkUnnamed634(core.List<api.Profile> o) {
+checkUnnamed229(core.List<api.Profile> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProfile(o[0]);
   checkProfile(o[1]);
@@ -2644,7 +2644,7 @@
   var o = new api.Profiles();
   buildCounterProfiles++;
   if (buildCounterProfiles < 3) {
-    o.items = buildUnnamed634();
+    o.items = buildUnnamed229();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -2660,7 +2660,7 @@
 checkProfiles(api.Profiles o) {
   buildCounterProfiles++;
   if (buildCounterProfiles < 3) {
-    checkUnnamed634(o.items);
+    checkUnnamed229(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -2695,14 +2695,14 @@
   buildCounterRealtimeDataColumnHeaders--;
 }
 
-buildUnnamed635() {
+buildUnnamed230() {
   var o = new core.List<api.RealtimeDataColumnHeaders>();
   o.add(buildRealtimeDataColumnHeaders());
   o.add(buildRealtimeDataColumnHeaders());
   return o;
 }
 
-checkUnnamed635(core.List<api.RealtimeDataColumnHeaders> o) {
+checkUnnamed230(core.List<api.RealtimeDataColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRealtimeDataColumnHeaders(o[0]);
   checkRealtimeDataColumnHeaders(o[1]);
@@ -2737,27 +2737,27 @@
   buildCounterRealtimeDataProfileInfo--;
 }
 
-buildUnnamed636() {
+buildUnnamed231() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed636(core.List<core.String> o) {
+checkUnnamed231(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed637() {
+buildUnnamed232() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed637(core.List<core.String> 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'));
@@ -2772,8 +2772,8 @@
     o.filters = "foo";
     o.ids = "foo";
     o.max_results = 42;
-    o.metrics = buildUnnamed636();
-    o.sort = buildUnnamed637();
+    o.metrics = buildUnnamed231();
+    o.sort = buildUnnamed232();
   }
   buildCounterRealtimeDataQuery--;
   return o;
@@ -2786,46 +2786,46 @@
     unittest.expect(o.filters, unittest.equals('foo'));
     unittest.expect(o.ids, unittest.equals('foo'));
     unittest.expect(o.max_results, unittest.equals(42));
-    checkUnnamed636(o.metrics);
-    checkUnnamed637(o.sort);
+    checkUnnamed231(o.metrics);
+    checkUnnamed232(o.sort);
   }
   buildCounterRealtimeDataQuery--;
 }
 
-buildUnnamed638() {
+buildUnnamed233() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed638(core.List<core.String> 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'));
 }
 
-buildUnnamed639() {
+buildUnnamed234() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed638());
-  o.add(buildUnnamed638());
+  o.add(buildUnnamed233());
+  o.add(buildUnnamed233());
   return o;
 }
 
-checkUnnamed639(core.List<core.List<core.String>> o) {
+checkUnnamed234(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed638(o[0]);
-  checkUnnamed638(o[1]);
+  checkUnnamed233(o[0]);
+  checkUnnamed233(o[1]);
 }
 
-buildUnnamed640() {
+buildUnnamed235() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed640(core.Map<core.String, core.String> o) {
+checkUnnamed235(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'));
@@ -2836,15 +2836,15 @@
   var o = new api.RealtimeData();
   buildCounterRealtimeData++;
   if (buildCounterRealtimeData < 3) {
-    o.columnHeaders = buildUnnamed635();
+    o.columnHeaders = buildUnnamed230();
     o.id = "foo";
     o.kind = "foo";
     o.profileInfo = buildRealtimeDataProfileInfo();
     o.query = buildRealtimeDataQuery();
-    o.rows = buildUnnamed639();
+    o.rows = buildUnnamed234();
     o.selfLink = "foo";
     o.totalResults = 42;
-    o.totalsForAllResults = buildUnnamed640();
+    o.totalsForAllResults = buildUnnamed235();
   }
   buildCounterRealtimeData--;
   return o;
@@ -2853,15 +2853,15 @@
 checkRealtimeData(api.RealtimeData o) {
   buildCounterRealtimeData++;
   if (buildCounterRealtimeData < 3) {
-    checkUnnamed635(o.columnHeaders);
+    checkUnnamed230(o.columnHeaders);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkRealtimeDataProfileInfo(o.profileInfo);
     checkRealtimeDataQuery(o.query);
-    checkUnnamed639(o.rows);
+    checkUnnamed234(o.rows);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalResults, unittest.equals(42));
-    checkUnnamed640(o.totalsForAllResults);
+    checkUnnamed235(o.totalsForAllResults);
   }
   buildCounterRealtimeData--;
 }
@@ -2901,14 +2901,14 @@
   buildCounterSegment--;
 }
 
-buildUnnamed641() {
+buildUnnamed236() {
   var o = new core.List<api.Segment>();
   o.add(buildSegment());
   o.add(buildSegment());
   return o;
 }
 
-checkUnnamed641(core.List<api.Segment> o) {
+checkUnnamed236(core.List<api.Segment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSegment(o[0]);
   checkSegment(o[1]);
@@ -2919,7 +2919,7 @@
   var o = new api.Segments();
   buildCounterSegments++;
   if (buildCounterSegments < 3) {
-    o.items = buildUnnamed641();
+    o.items = buildUnnamed236();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -2935,7 +2935,7 @@
 checkSegments(api.Segments o) {
   buildCounterSegments++;
   if (buildCounterSegments < 3) {
-    checkUnnamed641(o.items);
+    checkUnnamed236(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3042,14 +3042,14 @@
   buildCounterUnsampledReport--;
 }
 
-buildUnnamed642() {
+buildUnnamed237() {
   var o = new core.List<api.UnsampledReport>();
   o.add(buildUnsampledReport());
   o.add(buildUnsampledReport());
   return o;
 }
 
-checkUnnamed642(core.List<api.UnsampledReport> o) {
+checkUnnamed237(core.List<api.UnsampledReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUnsampledReport(o[0]);
   checkUnsampledReport(o[1]);
@@ -3060,7 +3060,7 @@
   var o = new api.UnsampledReports();
   buildCounterUnsampledReports++;
   if (buildCounterUnsampledReports < 3) {
-    o.items = buildUnnamed642();
+    o.items = buildUnnamed237();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -3076,7 +3076,7 @@
 checkUnsampledReports(api.UnsampledReports o) {
   buildCounterUnsampledReports++;
   if (buildCounterUnsampledReports < 3) {
-    checkUnnamed642(o.items);
+    checkUnnamed237(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3088,14 +3088,14 @@
   buildCounterUnsampledReports--;
 }
 
-buildUnnamed643() {
+buildUnnamed238() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed643(core.List<core.String> 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'));
@@ -3108,7 +3108,7 @@
   if (buildCounterUpload < 3) {
     o.accountId = "foo";
     o.customDataSourceId = "foo";
-    o.errors = buildUnnamed643();
+    o.errors = buildUnnamed238();
     o.id = "foo";
     o.kind = "foo";
     o.status = "foo";
@@ -3122,7 +3122,7 @@
   if (buildCounterUpload < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.customDataSourceId, unittest.equals('foo'));
-    checkUnnamed643(o.errors);
+    checkUnnamed238(o.errors);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
@@ -3130,14 +3130,14 @@
   buildCounterUpload--;
 }
 
-buildUnnamed644() {
+buildUnnamed239() {
   var o = new core.List<api.Upload>();
   o.add(buildUpload());
   o.add(buildUpload());
   return o;
 }
 
-checkUnnamed644(core.List<api.Upload> o) {
+checkUnnamed239(core.List<api.Upload> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUpload(o[0]);
   checkUpload(o[1]);
@@ -3148,7 +3148,7 @@
   var o = new api.Uploads();
   buildCounterUploads++;
   if (buildCounterUploads < 3) {
-    o.items = buildUnnamed644();
+    o.items = buildUnnamed239();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -3163,7 +3163,7 @@
 checkUploads(api.Uploads o) {
   buildCounterUploads++;
   if (buildCounterUploads < 3) {
-    checkUnnamed644(o.items);
+    checkUnnamed239(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3226,14 +3226,14 @@
   buildCounterWebPropertyRef--;
 }
 
-buildUnnamed645() {
+buildUnnamed240() {
   var o = new core.List<api.ProfileSummary>();
   o.add(buildProfileSummary());
   o.add(buildProfileSummary());
   return o;
 }
 
-checkUnnamed645(core.List<api.ProfileSummary> o) {
+checkUnnamed240(core.List<api.ProfileSummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProfileSummary(o[0]);
   checkProfileSummary(o[1]);
@@ -3249,7 +3249,7 @@
     o.kind = "foo";
     o.level = "foo";
     o.name = "foo";
-    o.profiles = buildUnnamed645();
+    o.profiles = buildUnnamed240();
     o.websiteUrl = "foo";
   }
   buildCounterWebPropertySummary--;
@@ -3264,20 +3264,20 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.level, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed645(o.profiles);
+    checkUnnamed240(o.profiles);
     unittest.expect(o.websiteUrl, unittest.equals('foo'));
   }
   buildCounterWebPropertySummary--;
 }
 
-buildUnnamed646() {
+buildUnnamed241() {
   var o = new core.List<api.Webproperty>();
   o.add(buildWebproperty());
   o.add(buildWebproperty());
   return o;
 }
 
-checkUnnamed646(core.List<api.Webproperty> o) {
+checkUnnamed241(core.List<api.Webproperty> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebproperty(o[0]);
   checkWebproperty(o[1]);
@@ -3288,7 +3288,7 @@
   var o = new api.Webproperties();
   buildCounterWebproperties++;
   if (buildCounterWebproperties < 3) {
-    o.items = buildUnnamed646();
+    o.items = buildUnnamed241();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -3304,7 +3304,7 @@
 checkWebproperties(api.Webproperties o) {
   buildCounterWebproperties++;
   if (buildCounterWebproperties < 3) {
-    checkUnnamed646(o.items);
+    checkUnnamed241(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3358,14 +3358,14 @@
   buildCounterWebpropertyParentLink--;
 }
 
-buildUnnamed647() {
+buildUnnamed242() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed647(core.List<core.String> o) {
+checkUnnamed242(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3376,7 +3376,7 @@
   var o = new api.WebpropertyPermissions();
   buildCounterWebpropertyPermissions++;
   if (buildCounterWebpropertyPermissions < 3) {
-    o.effective = buildUnnamed647();
+    o.effective = buildUnnamed242();
   }
   buildCounterWebpropertyPermissions--;
   return o;
@@ -3385,7 +3385,7 @@
 checkWebpropertyPermissions(api.WebpropertyPermissions o) {
   buildCounterWebpropertyPermissions++;
   if (buildCounterWebpropertyPermissions < 3) {
-    checkUnnamed647(o.effective);
+    checkUnnamed242(o.effective);
   }
   buildCounterWebpropertyPermissions--;
 }
diff --git a/generated/googleapis/test/androidpublisher/v2_test.dart b/generated/googleapis/test/androidpublisher/v2_test.dart
index d7f63aa..e2a493f 100644
--- a/generated/googleapis/test/androidpublisher/v2_test.dart
+++ b/generated/googleapis/test/androidpublisher/v2_test.dart
@@ -77,14 +77,14 @@
   buildCounterApkListing--;
 }
 
-buildUnnamed1029() {
+buildUnnamed243() {
   var o = new core.List<api.ApkListing>();
   o.add(buildApkListing());
   o.add(buildApkListing());
   return o;
 }
 
-checkUnnamed1029(core.List<api.ApkListing> o) {
+checkUnnamed243(core.List<api.ApkListing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApkListing(o[0]);
   checkApkListing(o[1]);
@@ -96,7 +96,7 @@
   buildCounterApkListingsListResponse++;
   if (buildCounterApkListingsListResponse < 3) {
     o.kind = "foo";
-    o.listings = buildUnnamed1029();
+    o.listings = buildUnnamed243();
   }
   buildCounterApkListingsListResponse--;
   return o;
@@ -106,19 +106,19 @@
   buildCounterApkListingsListResponse++;
   if (buildCounterApkListingsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1029(o.listings);
+    checkUnnamed243(o.listings);
   }
   buildCounterApkListingsListResponse--;
 }
 
-buildUnnamed1030() {
+buildUnnamed244() {
   var o = new core.List<api.Apk>();
   o.add(buildApk());
   o.add(buildApk());
   return o;
 }
 
-checkUnnamed1030(core.List<api.Apk> o) {
+checkUnnamed244(core.List<api.Apk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApk(o[0]);
   checkApk(o[1]);
@@ -129,7 +129,7 @@
   var o = new api.ApksListResponse();
   buildCounterApksListResponse++;
   if (buildCounterApksListResponse < 3) {
-    o.apks = buildUnnamed1030();
+    o.apks = buildUnnamed244();
     o.kind = "foo";
   }
   buildCounterApksListResponse--;
@@ -139,7 +139,7 @@
 checkApksListResponse(api.ApksListResponse o) {
   buildCounterApksListResponse++;
   if (buildCounterApksListResponse < 3) {
-    checkUnnamed1030(o.apks);
+    checkUnnamed244(o.apks);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterApksListResponse--;
@@ -254,14 +254,14 @@
   buildCounterImage--;
 }
 
-buildUnnamed1031() {
+buildUnnamed245() {
   var o = new core.List<api.Image>();
   o.add(buildImage());
   o.add(buildImage());
   return o;
 }
 
-checkUnnamed1031(core.List<api.Image> o) {
+checkUnnamed245(core.List<api.Image> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImage(o[0]);
   checkImage(o[1]);
@@ -272,7 +272,7 @@
   var o = new api.ImagesDeleteAllResponse();
   buildCounterImagesDeleteAllResponse++;
   if (buildCounterImagesDeleteAllResponse < 3) {
-    o.deleted = buildUnnamed1031();
+    o.deleted = buildUnnamed245();
   }
   buildCounterImagesDeleteAllResponse--;
   return o;
@@ -281,19 +281,19 @@
 checkImagesDeleteAllResponse(api.ImagesDeleteAllResponse o) {
   buildCounterImagesDeleteAllResponse++;
   if (buildCounterImagesDeleteAllResponse < 3) {
-    checkUnnamed1031(o.deleted);
+    checkUnnamed245(o.deleted);
   }
   buildCounterImagesDeleteAllResponse--;
 }
 
-buildUnnamed1032() {
+buildUnnamed246() {
   var o = new core.List<api.Image>();
   o.add(buildImage());
   o.add(buildImage());
   return o;
 }
 
-checkUnnamed1032(core.List<api.Image> o) {
+checkUnnamed246(core.List<api.Image> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImage(o[0]);
   checkImage(o[1]);
@@ -304,7 +304,7 @@
   var o = new api.ImagesListResponse();
   buildCounterImagesListResponse++;
   if (buildCounterImagesListResponse < 3) {
-    o.images = buildUnnamed1032();
+    o.images = buildUnnamed246();
   }
   buildCounterImagesListResponse--;
   return o;
@@ -313,7 +313,7 @@
 checkImagesListResponse(api.ImagesListResponse o) {
   buildCounterImagesListResponse++;
   if (buildCounterImagesListResponse < 3) {
-    checkUnnamed1032(o.images);
+    checkUnnamed246(o.images);
   }
   buildCounterImagesListResponse--;
 }
@@ -337,27 +337,27 @@
   buildCounterImagesUploadResponse--;
 }
 
-buildUnnamed1033() {
+buildUnnamed247() {
   var o = new core.Map<core.String, api.InAppProductListing>();
   o["x"] = buildInAppProductListing();
   o["y"] = buildInAppProductListing();
   return o;
 }
 
-checkUnnamed1033(core.Map<core.String, api.InAppProductListing> o) {
+checkUnnamed247(core.Map<core.String, api.InAppProductListing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInAppProductListing(o["x"]);
   checkInAppProductListing(o["y"]);
 }
 
-buildUnnamed1034() {
+buildUnnamed248() {
   var o = new core.Map<core.String, api.Price>();
   o["x"] = buildPrice();
   o["y"] = buildPrice();
   return o;
 }
 
-checkUnnamed1034(core.Map<core.String, api.Price> o) {
+checkUnnamed248(core.Map<core.String, api.Price> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPrice(o["x"]);
   checkPrice(o["y"]);
@@ -370,9 +370,9 @@
   if (buildCounterInAppProduct < 3) {
     o.defaultLanguage = "foo";
     o.defaultPrice = buildPrice();
-    o.listings = buildUnnamed1033();
+    o.listings = buildUnnamed247();
     o.packageName = "foo";
-    o.prices = buildUnnamed1034();
+    o.prices = buildUnnamed248();
     o.purchaseType = "foo";
     o.season = buildSeason();
     o.sku = "foo";
@@ -389,9 +389,9 @@
   if (buildCounterInAppProduct < 3) {
     unittest.expect(o.defaultLanguage, unittest.equals('foo'));
     checkPrice(o.defaultPrice);
-    checkUnnamed1033(o.listings);
+    checkUnnamed247(o.listings);
     unittest.expect(o.packageName, unittest.equals('foo'));
-    checkUnnamed1034(o.prices);
+    checkUnnamed248(o.prices);
     unittest.expect(o.purchaseType, unittest.equals('foo'));
     checkSeason(o.season);
     unittest.expect(o.sku, unittest.equals('foo'));
@@ -423,14 +423,14 @@
   buildCounterInAppProductListing--;
 }
 
-buildUnnamed1035() {
+buildUnnamed249() {
   var o = new core.List<api.InappproductsBatchRequestEntry>();
   o.add(buildInappproductsBatchRequestEntry());
   o.add(buildInappproductsBatchRequestEntry());
   return o;
 }
 
-checkUnnamed1035(core.List<api.InappproductsBatchRequestEntry> o) {
+checkUnnamed249(core.List<api.InappproductsBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInappproductsBatchRequestEntry(o[0]);
   checkInappproductsBatchRequestEntry(o[1]);
@@ -441,7 +441,7 @@
   var o = new api.InappproductsBatchRequest();
   buildCounterInappproductsBatchRequest++;
   if (buildCounterInappproductsBatchRequest < 3) {
-    o.entrys = buildUnnamed1035();
+    o.entrys = buildUnnamed249();
   }
   buildCounterInappproductsBatchRequest--;
   return o;
@@ -450,7 +450,7 @@
 checkInappproductsBatchRequest(api.InappproductsBatchRequest o) {
   buildCounterInappproductsBatchRequest++;
   if (buildCounterInappproductsBatchRequest < 3) {
-    checkUnnamed1035(o.entrys);
+    checkUnnamed249(o.entrys);
   }
   buildCounterInappproductsBatchRequest--;
 }
@@ -480,14 +480,14 @@
   buildCounterInappproductsBatchRequestEntry--;
 }
 
-buildUnnamed1036() {
+buildUnnamed250() {
   var o = new core.List<api.InappproductsBatchResponseEntry>();
   o.add(buildInappproductsBatchResponseEntry());
   o.add(buildInappproductsBatchResponseEntry());
   return o;
 }
 
-checkUnnamed1036(core.List<api.InappproductsBatchResponseEntry> o) {
+checkUnnamed250(core.List<api.InappproductsBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInappproductsBatchResponseEntry(o[0]);
   checkInappproductsBatchResponseEntry(o[1]);
@@ -498,7 +498,7 @@
   var o = new api.InappproductsBatchResponse();
   buildCounterInappproductsBatchResponse++;
   if (buildCounterInappproductsBatchResponse < 3) {
-    o.entrys = buildUnnamed1036();
+    o.entrys = buildUnnamed250();
     o.kind = "foo";
   }
   buildCounterInappproductsBatchResponse--;
@@ -508,7 +508,7 @@
 checkInappproductsBatchResponse(api.InappproductsBatchResponse o) {
   buildCounterInappproductsBatchResponse++;
   if (buildCounterInappproductsBatchResponse < 3) {
-    checkUnnamed1036(o.entrys);
+    checkUnnamed250(o.entrys);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterInappproductsBatchResponse--;
@@ -575,14 +575,14 @@
   buildCounterInappproductsInsertResponse--;
 }
 
-buildUnnamed1037() {
+buildUnnamed251() {
   var o = new core.List<api.InAppProduct>();
   o.add(buildInAppProduct());
   o.add(buildInAppProduct());
   return o;
 }
 
-checkUnnamed1037(core.List<api.InAppProduct> o) {
+checkUnnamed251(core.List<api.InAppProduct> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInAppProduct(o[0]);
   checkInAppProduct(o[1]);
@@ -593,7 +593,7 @@
   var o = new api.InappproductsListResponse();
   buildCounterInappproductsListResponse++;
   if (buildCounterInappproductsListResponse < 3) {
-    o.inappproduct = buildUnnamed1037();
+    o.inappproduct = buildUnnamed251();
     o.kind = "foo";
     o.pageInfo = buildPageInfo();
     o.tokenPagination = buildTokenPagination();
@@ -605,7 +605,7 @@
 checkInappproductsListResponse(api.InappproductsListResponse o) {
   buildCounterInappproductsListResponse++;
   if (buildCounterInappproductsListResponse < 3) {
-    checkUnnamed1037(o.inappproduct);
+    checkUnnamed251(o.inappproduct);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
     checkTokenPagination(o.tokenPagination);
@@ -678,14 +678,14 @@
   buildCounterListing--;
 }
 
-buildUnnamed1038() {
+buildUnnamed252() {
   var o = new core.List<api.Listing>();
   o.add(buildListing());
   o.add(buildListing());
   return o;
 }
 
-checkUnnamed1038(core.List<api.Listing> o) {
+checkUnnamed252(core.List<api.Listing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkListing(o[0]);
   checkListing(o[1]);
@@ -697,7 +697,7 @@
   buildCounterListingsListResponse++;
   if (buildCounterListingsListResponse < 3) {
     o.kind = "foo";
-    o.listings = buildUnnamed1038();
+    o.listings = buildUnnamed252();
   }
   buildCounterListingsListResponse--;
   return o;
@@ -707,7 +707,7 @@
   buildCounterListingsListResponse++;
   if (buildCounterListingsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1038(o.listings);
+    checkUnnamed252(o.listings);
   }
   buildCounterListingsListResponse--;
 }
@@ -909,27 +909,27 @@
   buildCounterSubscriptionPurchasesDeferResponse--;
 }
 
-buildUnnamed1039() {
+buildUnnamed253() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1039(core.List<core.String> 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'));
 }
 
-buildUnnamed1040() {
+buildUnnamed254() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1040(core.List<core.String> o) {
+checkUnnamed254(core.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,8 +940,8 @@
   var o = new api.Testers();
   buildCounterTesters++;
   if (buildCounterTesters < 3) {
-    o.googleGroups = buildUnnamed1039();
-    o.googlePlusCommunities = buildUnnamed1040();
+    o.googleGroups = buildUnnamed253();
+    o.googlePlusCommunities = buildUnnamed254();
   }
   buildCounterTesters--;
   return o;
@@ -950,8 +950,8 @@
 checkTesters(api.Testers o) {
   buildCounterTesters++;
   if (buildCounterTesters < 3) {
-    checkUnnamed1039(o.googleGroups);
-    checkUnnamed1040(o.googlePlusCommunities);
+    checkUnnamed253(o.googleGroups);
+    checkUnnamed254(o.googlePlusCommunities);
   }
   buildCounterTesters--;
 }
@@ -977,14 +977,14 @@
   buildCounterTokenPagination--;
 }
 
-buildUnnamed1041() {
+buildUnnamed255() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed1041(core.List<core.int> o) {
+checkUnnamed255(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));
@@ -997,7 +997,7 @@
   if (buildCounterTrack < 3) {
     o.track = "foo";
     o.userFraction = 42.0;
-    o.versionCodes = buildUnnamed1041();
+    o.versionCodes = buildUnnamed255();
   }
   buildCounterTrack--;
   return o;
@@ -1008,19 +1008,19 @@
   if (buildCounterTrack < 3) {
     unittest.expect(o.track, unittest.equals('foo'));
     unittest.expect(o.userFraction, unittest.equals(42.0));
-    checkUnnamed1041(o.versionCodes);
+    checkUnnamed255(o.versionCodes);
   }
   buildCounterTrack--;
 }
 
-buildUnnamed1042() {
+buildUnnamed256() {
   var o = new core.List<api.Track>();
   o.add(buildTrack());
   o.add(buildTrack());
   return o;
 }
 
-checkUnnamed1042(core.List<api.Track> o) {
+checkUnnamed256(core.List<api.Track> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTrack(o[0]);
   checkTrack(o[1]);
@@ -1032,7 +1032,7 @@
   buildCounterTracksListResponse++;
   if (buildCounterTracksListResponse < 3) {
     o.kind = "foo";
-    o.tracks = buildUnnamed1042();
+    o.tracks = buildUnnamed256();
   }
   buildCounterTracksListResponse--;
   return o;
@@ -1042,7 +1042,7 @@
   buildCounterTracksListResponse++;
   if (buildCounterTracksListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1042(o.tracks);
+    checkUnnamed256(o.tracks);
   }
   buildCounterTracksListResponse--;
 }
diff --git a/generated/googleapis/test/appsactivity/v1_test.dart b/generated/googleapis/test/appsactivity/v1_test.dart
index 548d3c5..1c41212 100644
--- a/generated/googleapis/test/appsactivity/v1_test.dart
+++ b/generated/googleapis/test/appsactivity/v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed667() {
+buildUnnamed257() {
   var o = new core.List<api.Event>();
   o.add(buildEvent());
   o.add(buildEvent());
   return o;
 }
 
-checkUnnamed667(core.List<api.Event> o) {
+checkUnnamed257(core.List<api.Event> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEvent(o[0]);
   checkEvent(o[1]);
@@ -35,7 +35,7 @@
   buildCounterActivity++;
   if (buildCounterActivity < 3) {
     o.combinedEvent = buildEvent();
-    o.singleEvents = buildUnnamed667();
+    o.singleEvents = buildUnnamed257();
   }
   buildCounterActivity--;
   return o;
@@ -45,32 +45,32 @@
   buildCounterActivity++;
   if (buildCounterActivity < 3) {
     checkEvent(o.combinedEvent);
-    checkUnnamed667(o.singleEvents);
+    checkUnnamed257(o.singleEvents);
   }
   buildCounterActivity--;
 }
 
-buildUnnamed668() {
+buildUnnamed258() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed668(core.List<core.String> o) {
+checkUnnamed258(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed669() {
+buildUnnamed259() {
   var o = new core.List<api.PermissionChange>();
   o.add(buildPermissionChange());
   o.add(buildPermissionChange());
   return o;
 }
 
-checkUnnamed669(core.List<api.PermissionChange> o) {
+checkUnnamed259(core.List<api.PermissionChange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermissionChange(o[0]);
   checkPermissionChange(o[1]);
@@ -81,11 +81,11 @@
   var o = new api.Event();
   buildCounterEvent++;
   if (buildCounterEvent < 3) {
-    o.additionalEventTypes = buildUnnamed668();
+    o.additionalEventTypes = buildUnnamed258();
     o.eventTimeMillis = "foo";
     o.fromUserDeletion = true;
     o.move = buildMove();
-    o.permissionChanges = buildUnnamed669();
+    o.permissionChanges = buildUnnamed259();
     o.primaryEventType = "foo";
     o.rename = buildRename();
     o.target = buildTarget();
@@ -98,11 +98,11 @@
 checkEvent(api.Event o) {
   buildCounterEvent++;
   if (buildCounterEvent < 3) {
-    checkUnnamed668(o.additionalEventTypes);
+    checkUnnamed258(o.additionalEventTypes);
     unittest.expect(o.eventTimeMillis, unittest.equals('foo'));
     unittest.expect(o.fromUserDeletion, unittest.isTrue);
     checkMove(o.move);
-    checkUnnamed669(o.permissionChanges);
+    checkUnnamed259(o.permissionChanges);
     unittest.expect(o.primaryEventType, unittest.equals('foo'));
     checkRename(o.rename);
     checkTarget(o.target);
@@ -111,14 +111,14 @@
   buildCounterEvent--;
 }
 
-buildUnnamed670() {
+buildUnnamed260() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed670(core.List<api.Activity> o) {
+checkUnnamed260(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -129,7 +129,7 @@
   var o = new api.ListActivitiesResponse();
   buildCounterListActivitiesResponse++;
   if (buildCounterListActivitiesResponse < 3) {
-    o.activities = buildUnnamed670();
+    o.activities = buildUnnamed260();
     o.nextPageToken = "foo";
   }
   buildCounterListActivitiesResponse--;
@@ -139,33 +139,33 @@
 checkListActivitiesResponse(api.ListActivitiesResponse o) {
   buildCounterListActivitiesResponse++;
   if (buildCounterListActivitiesResponse < 3) {
-    checkUnnamed670(o.activities);
+    checkUnnamed260(o.activities);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListActivitiesResponse--;
 }
 
-buildUnnamed671() {
+buildUnnamed261() {
   var o = new core.List<api.Parent>();
   o.add(buildParent());
   o.add(buildParent());
   return o;
 }
 
-checkUnnamed671(core.List<api.Parent> o) {
+checkUnnamed261(core.List<api.Parent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParent(o[0]);
   checkParent(o[1]);
 }
 
-buildUnnamed672() {
+buildUnnamed262() {
   var o = new core.List<api.Parent>();
   o.add(buildParent());
   o.add(buildParent());
   return o;
 }
 
-checkUnnamed672(core.List<api.Parent> o) {
+checkUnnamed262(core.List<api.Parent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParent(o[0]);
   checkParent(o[1]);
@@ -176,8 +176,8 @@
   var o = new api.Move();
   buildCounterMove++;
   if (buildCounterMove < 3) {
-    o.addedParents = buildUnnamed671();
-    o.removedParents = buildUnnamed672();
+    o.addedParents = buildUnnamed261();
+    o.removedParents = buildUnnamed262();
   }
   buildCounterMove--;
   return o;
@@ -186,8 +186,8 @@
 checkMove(api.Move o) {
   buildCounterMove++;
   if (buildCounterMove < 3) {
-    checkUnnamed671(o.addedParents);
-    checkUnnamed672(o.removedParents);
+    checkUnnamed261(o.addedParents);
+    checkUnnamed262(o.removedParents);
   }
   buildCounterMove--;
 }
@@ -244,27 +244,27 @@
   buildCounterPermission--;
 }
 
-buildUnnamed673() {
+buildUnnamed263() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed673(core.List<api.Permission> o) {
+checkUnnamed263(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
 }
 
-buildUnnamed674() {
+buildUnnamed264() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed674(core.List<api.Permission> o) {
+checkUnnamed264(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
@@ -275,8 +275,8 @@
   var o = new api.PermissionChange();
   buildCounterPermissionChange++;
   if (buildCounterPermissionChange < 3) {
-    o.addedPermissions = buildUnnamed673();
-    o.removedPermissions = buildUnnamed674();
+    o.addedPermissions = buildUnnamed263();
+    o.removedPermissions = buildUnnamed264();
   }
   buildCounterPermissionChange--;
   return o;
@@ -285,8 +285,8 @@
 checkPermissionChange(api.PermissionChange o) {
   buildCounterPermissionChange++;
   if (buildCounterPermissionChange < 3) {
-    checkUnnamed673(o.addedPermissions);
-    checkUnnamed674(o.removedPermissions);
+    checkUnnamed263(o.addedPermissions);
+    checkUnnamed264(o.removedPermissions);
   }
   buildCounterPermissionChange--;
 }
diff --git a/generated/googleapis/test/appstate/v1_test.dart b/generated/googleapis/test/appstate/v1_test.dart
index 4cb6822..3de68e9 100644
--- a/generated/googleapis/test/appstate/v1_test.dart
+++ b/generated/googleapis/test/appstate/v1_test.dart
@@ -41,14 +41,14 @@
   buildCounterGetResponse--;
 }
 
-buildUnnamed1019() {
+buildUnnamed265() {
   var o = new core.List<api.GetResponse>();
   o.add(buildGetResponse());
   o.add(buildGetResponse());
   return o;
 }
 
-checkUnnamed1019(core.List<api.GetResponse> o) {
+checkUnnamed265(core.List<api.GetResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGetResponse(o[0]);
   checkGetResponse(o[1]);
@@ -59,7 +59,7 @@
   var o = new api.ListResponse();
   buildCounterListResponse++;
   if (buildCounterListResponse < 3) {
-    o.items = buildUnnamed1019();
+    o.items = buildUnnamed265();
     o.kind = "foo";
     o.maximumKeyCount = 42;
   }
@@ -70,7 +70,7 @@
 checkListResponse(api.ListResponse o) {
   buildCounterListResponse++;
   if (buildCounterListResponse < 3) {
-    checkUnnamed1019(o.items);
+    checkUnnamed265(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.maximumKeyCount, unittest.equals(42));
   }
diff --git a/generated/googleapis/test/bigquery/v2_test.dart b/generated/googleapis/test/bigquery/v2_test.dart
index 331cea0..670178c 100644
--- a/generated/googleapis/test/bigquery/v2_test.dart
+++ b/generated/googleapis/test/bigquery/v2_test.dart
@@ -45,14 +45,14 @@
   buildCounterDatasetAccess--;
 }
 
-buildUnnamed1089() {
+buildUnnamed266() {
   var o = new core.List<api.DatasetAccess>();
   o.add(buildDatasetAccess());
   o.add(buildDatasetAccess());
   return o;
 }
 
-checkUnnamed1089(core.List<api.DatasetAccess> o) {
+checkUnnamed266(core.List<api.DatasetAccess> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatasetAccess(o[0]);
   checkDatasetAccess(o[1]);
@@ -63,7 +63,7 @@
   var o = new api.Dataset();
   buildCounterDataset++;
   if (buildCounterDataset < 3) {
-    o.access = buildUnnamed1089();
+    o.access = buildUnnamed266();
     o.creationTime = "foo";
     o.datasetReference = buildDatasetReference();
     o.description = "foo";
@@ -81,7 +81,7 @@
 checkDataset(api.Dataset o) {
   buildCounterDataset++;
   if (buildCounterDataset < 3) {
-    checkUnnamed1089(o.access);
+    checkUnnamed266(o.access);
     unittest.expect(o.creationTime, unittest.equals('foo'));
     checkDatasetReference(o.datasetReference);
     unittest.expect(o.description, unittest.equals('foo'));
@@ -120,14 +120,14 @@
   buildCounterDatasetListDatasets--;
 }
 
-buildUnnamed1090() {
+buildUnnamed267() {
   var o = new core.List<api.DatasetListDatasets>();
   o.add(buildDatasetListDatasets());
   o.add(buildDatasetListDatasets());
   return o;
 }
 
-checkUnnamed1090(core.List<api.DatasetListDatasets> o) {
+checkUnnamed267(core.List<api.DatasetListDatasets> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatasetListDatasets(o[0]);
   checkDatasetListDatasets(o[1]);
@@ -138,7 +138,7 @@
   var o = new api.DatasetList();
   buildCounterDatasetList++;
   if (buildCounterDatasetList < 3) {
-    o.datasets = buildUnnamed1090();
+    o.datasets = buildUnnamed267();
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
@@ -150,7 +150,7 @@
 checkDatasetList(api.DatasetList o) {
   buildCounterDatasetList++;
   if (buildCounterDatasetList < 3) {
-    checkUnnamed1090(o.datasets);
+    checkUnnamed267(o.datasets);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -204,14 +204,14 @@
   buildCounterErrorProto--;
 }
 
-buildUnnamed1091() {
+buildUnnamed268() {
   var o = new core.List<api.TableRow>();
   o.add(buildTableRow());
   o.add(buildTableRow());
   return o;
 }
 
-checkUnnamed1091(core.List<api.TableRow> o) {
+checkUnnamed268(core.List<api.TableRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableRow(o[0]);
   checkTableRow(o[1]);
@@ -228,7 +228,7 @@
     o.jobReference = buildJobReference();
     o.kind = "foo";
     o.pageToken = "foo";
-    o.rows = buildUnnamed1091();
+    o.rows = buildUnnamed268();
     o.schema = buildTableSchema();
     o.totalRows = "foo";
   }
@@ -245,7 +245,7 @@
     checkJobReference(o.jobReference);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed1091(o.rows);
+    checkUnnamed268(o.rows);
     checkTableSchema(o.schema);
     unittest.expect(o.totalRows, unittest.equals('foo'));
   }
@@ -314,14 +314,14 @@
   buildCounterJobConfiguration--;
 }
 
-buildUnnamed1092() {
+buildUnnamed269() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1092(core.List<core.String> o) {
+checkUnnamed269(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -335,7 +335,7 @@
     o.compression = "foo";
     o.destinationFormat = "foo";
     o.destinationUri = "foo";
-    o.destinationUris = buildUnnamed1092();
+    o.destinationUris = buildUnnamed269();
     o.fieldDelimiter = "foo";
     o.printHeader = true;
     o.sourceTable = buildTableReference();
@@ -350,7 +350,7 @@
     unittest.expect(o.compression, unittest.equals('foo'));
     unittest.expect(o.destinationFormat, unittest.equals('foo'));
     unittest.expect(o.destinationUri, unittest.equals('foo'));
-    checkUnnamed1092(o.destinationUris);
+    checkUnnamed269(o.destinationUris);
     unittest.expect(o.fieldDelimiter, unittest.equals('foo'));
     unittest.expect(o.printHeader, unittest.isTrue);
     checkTableReference(o.sourceTable);
@@ -358,14 +358,14 @@
   buildCounterJobConfigurationExtract--;
 }
 
-buildUnnamed1093() {
+buildUnnamed270() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1093(core.List<core.String> o) {
+checkUnnamed270(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -378,7 +378,7 @@
   if (buildCounterJobConfigurationLink < 3) {
     o.createDisposition = "foo";
     o.destinationTable = buildTableReference();
-    o.sourceUri = buildUnnamed1093();
+    o.sourceUri = buildUnnamed270();
     o.writeDisposition = "foo";
   }
   buildCounterJobConfigurationLink--;
@@ -390,20 +390,20 @@
   if (buildCounterJobConfigurationLink < 3) {
     unittest.expect(o.createDisposition, unittest.equals('foo'));
     checkTableReference(o.destinationTable);
-    checkUnnamed1093(o.sourceUri);
+    checkUnnamed270(o.sourceUri);
     unittest.expect(o.writeDisposition, unittest.equals('foo'));
   }
   buildCounterJobConfigurationLink--;
 }
 
-buildUnnamed1094() {
+buildUnnamed271() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1094(core.List<core.String> o) {
+checkUnnamed271(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -428,7 +428,7 @@
     o.schemaInlineFormat = "foo";
     o.skipLeadingRows = 42;
     o.sourceFormat = "foo";
-    o.sourceUris = buildUnnamed1094();
+    o.sourceUris = buildUnnamed271();
     o.writeDisposition = "foo";
   }
   buildCounterJobConfigurationLoad--;
@@ -452,7 +452,7 @@
     unittest.expect(o.schemaInlineFormat, unittest.equals('foo'));
     unittest.expect(o.skipLeadingRows, unittest.equals(42));
     unittest.expect(o.sourceFormat, unittest.equals('foo'));
-    checkUnnamed1094(o.sourceUris);
+    checkUnnamed271(o.sourceUris);
     unittest.expect(o.writeDisposition, unittest.equals('foo'));
   }
   buildCounterJobConfigurationLoad--;
@@ -495,14 +495,14 @@
   buildCounterJobConfigurationQuery--;
 }
 
-buildUnnamed1095() {
+buildUnnamed272() {
   var o = new core.List<api.TableReference>();
   o.add(buildTableReference());
   o.add(buildTableReference());
   return o;
 }
 
-checkUnnamed1095(core.List<api.TableReference> o) {
+checkUnnamed272(core.List<api.TableReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableReference(o[0]);
   checkTableReference(o[1]);
@@ -516,7 +516,7 @@
     o.createDisposition = "foo";
     o.destinationTable = buildTableReference();
     o.sourceTable = buildTableReference();
-    o.sourceTables = buildUnnamed1095();
+    o.sourceTables = buildUnnamed272();
     o.writeDisposition = "foo";
   }
   buildCounterJobConfigurationTableCopy--;
@@ -529,7 +529,7 @@
     unittest.expect(o.createDisposition, unittest.equals('foo'));
     checkTableReference(o.destinationTable);
     checkTableReference(o.sourceTable);
-    checkUnnamed1095(o.sourceTables);
+    checkUnnamed272(o.sourceTables);
     unittest.expect(o.writeDisposition, unittest.equals('foo'));
   }
   buildCounterJobConfigurationTableCopy--;
@@ -570,14 +570,14 @@
   buildCounterJobListJobs--;
 }
 
-buildUnnamed1096() {
+buildUnnamed273() {
   var o = new core.List<api.JobListJobs>();
   o.add(buildJobListJobs());
   o.add(buildJobListJobs());
   return o;
 }
 
-checkUnnamed1096(core.List<api.JobListJobs> o) {
+checkUnnamed273(core.List<api.JobListJobs> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJobListJobs(o[0]);
   checkJobListJobs(o[1]);
@@ -589,7 +589,7 @@
   buildCounterJobList++;
   if (buildCounterJobList < 3) {
     o.etag = "foo";
-    o.jobs = buildUnnamed1096();
+    o.jobs = buildUnnamed273();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -602,7 +602,7 @@
   buildCounterJobList++;
   if (buildCounterJobList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1096(o.jobs);
+    checkUnnamed273(o.jobs);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -706,14 +706,14 @@
   buildCounterJobStatistics3--;
 }
 
-buildUnnamed1097() {
+buildUnnamed274() {
   var o = new core.List<api.ErrorProto>();
   o.add(buildErrorProto());
   o.add(buildErrorProto());
   return o;
 }
 
-checkUnnamed1097(core.List<api.ErrorProto> o) {
+checkUnnamed274(core.List<api.ErrorProto> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkErrorProto(o[0]);
   checkErrorProto(o[1]);
@@ -725,7 +725,7 @@
   buildCounterJobStatus++;
   if (buildCounterJobStatus < 3) {
     o.errorResult = buildErrorProto();
-    o.errors = buildUnnamed1097();
+    o.errors = buildUnnamed274();
     o.state = "foo";
   }
   buildCounterJobStatus--;
@@ -736,7 +736,7 @@
   buildCounterJobStatus++;
   if (buildCounterJobStatus < 3) {
     checkErrorProto(o.errorResult);
-    checkUnnamed1097(o.errors);
+    checkUnnamed274(o.errors);
     unittest.expect(o.state, unittest.equals('foo'));
   }
   buildCounterJobStatus--;
@@ -782,14 +782,14 @@
   buildCounterProjectListProjects--;
 }
 
-buildUnnamed1098() {
+buildUnnamed275() {
   var o = new core.List<api.ProjectListProjects>();
   o.add(buildProjectListProjects());
   o.add(buildProjectListProjects());
   return o;
 }
 
-checkUnnamed1098(core.List<api.ProjectListProjects> o) {
+checkUnnamed275(core.List<api.ProjectListProjects> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProjectListProjects(o[0]);
   checkProjectListProjects(o[1]);
@@ -803,7 +803,7 @@
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.projects = buildUnnamed1098();
+    o.projects = buildUnnamed275();
     o.totalItems = 42;
   }
   buildCounterProjectList--;
@@ -816,7 +816,7 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1098(o.projects);
+    checkUnnamed275(o.projects);
     unittest.expect(o.totalItems, unittest.equals(42));
   }
   buildCounterProjectList--;
@@ -874,14 +874,14 @@
   buildCounterQueryRequest--;
 }
 
-buildUnnamed1099() {
+buildUnnamed276() {
   var o = new core.List<api.TableRow>();
   o.add(buildTableRow());
   o.add(buildTableRow());
   return o;
 }
 
-checkUnnamed1099(core.List<api.TableRow> o) {
+checkUnnamed276(core.List<api.TableRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableRow(o[0]);
   checkTableRow(o[1]);
@@ -897,7 +897,7 @@
     o.jobReference = buildJobReference();
     o.kind = "foo";
     o.pageToken = "foo";
-    o.rows = buildUnnamed1099();
+    o.rows = buildUnnamed276();
     o.schema = buildTableSchema();
     o.totalBytesProcessed = "foo";
     o.totalRows = "foo";
@@ -914,7 +914,7 @@
     checkJobReference(o.jobReference);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed1099(o.rows);
+    checkUnnamed276(o.rows);
     checkTableSchema(o.schema);
     unittest.expect(o.totalBytesProcessed, unittest.equals('foo'));
     unittest.expect(o.totalRows, unittest.equals('foo'));
@@ -1009,14 +1009,14 @@
   buildCounterTableDataInsertAllRequestRows--;
 }
 
-buildUnnamed1100() {
+buildUnnamed277() {
   var o = new core.List<api.TableDataInsertAllRequestRows>();
   o.add(buildTableDataInsertAllRequestRows());
   o.add(buildTableDataInsertAllRequestRows());
   return o;
 }
 
-checkUnnamed1100(core.List<api.TableDataInsertAllRequestRows> o) {
+checkUnnamed277(core.List<api.TableDataInsertAllRequestRows> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableDataInsertAllRequestRows(o[0]);
   checkTableDataInsertAllRequestRows(o[1]);
@@ -1028,7 +1028,7 @@
   buildCounterTableDataInsertAllRequest++;
   if (buildCounterTableDataInsertAllRequest < 3) {
     o.kind = "foo";
-    o.rows = buildUnnamed1100();
+    o.rows = buildUnnamed277();
   }
   buildCounterTableDataInsertAllRequest--;
   return o;
@@ -1038,19 +1038,19 @@
   buildCounterTableDataInsertAllRequest++;
   if (buildCounterTableDataInsertAllRequest < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1100(o.rows);
+    checkUnnamed277(o.rows);
   }
   buildCounterTableDataInsertAllRequest--;
 }
 
-buildUnnamed1101() {
+buildUnnamed278() {
   var o = new core.List<api.ErrorProto>();
   o.add(buildErrorProto());
   o.add(buildErrorProto());
   return o;
 }
 
-checkUnnamed1101(core.List<api.ErrorProto> o) {
+checkUnnamed278(core.List<api.ErrorProto> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkErrorProto(o[0]);
   checkErrorProto(o[1]);
@@ -1061,7 +1061,7 @@
   var o = new api.TableDataInsertAllResponseInsertErrors();
   buildCounterTableDataInsertAllResponseInsertErrors++;
   if (buildCounterTableDataInsertAllResponseInsertErrors < 3) {
-    o.errors = buildUnnamed1101();
+    o.errors = buildUnnamed278();
     o.index = 42;
   }
   buildCounterTableDataInsertAllResponseInsertErrors--;
@@ -1071,20 +1071,20 @@
 checkTableDataInsertAllResponseInsertErrors(api.TableDataInsertAllResponseInsertErrors o) {
   buildCounterTableDataInsertAllResponseInsertErrors++;
   if (buildCounterTableDataInsertAllResponseInsertErrors < 3) {
-    checkUnnamed1101(o.errors);
+    checkUnnamed278(o.errors);
     unittest.expect(o.index, unittest.equals(42));
   }
   buildCounterTableDataInsertAllResponseInsertErrors--;
 }
 
-buildUnnamed1102() {
+buildUnnamed279() {
   var o = new core.List<api.TableDataInsertAllResponseInsertErrors>();
   o.add(buildTableDataInsertAllResponseInsertErrors());
   o.add(buildTableDataInsertAllResponseInsertErrors());
   return o;
 }
 
-checkUnnamed1102(core.List<api.TableDataInsertAllResponseInsertErrors> o) {
+checkUnnamed279(core.List<api.TableDataInsertAllResponseInsertErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableDataInsertAllResponseInsertErrors(o[0]);
   checkTableDataInsertAllResponseInsertErrors(o[1]);
@@ -1095,7 +1095,7 @@
   var o = new api.TableDataInsertAllResponse();
   buildCounterTableDataInsertAllResponse++;
   if (buildCounterTableDataInsertAllResponse < 3) {
-    o.insertErrors = buildUnnamed1102();
+    o.insertErrors = buildUnnamed279();
     o.kind = "foo";
   }
   buildCounterTableDataInsertAllResponse--;
@@ -1105,20 +1105,20 @@
 checkTableDataInsertAllResponse(api.TableDataInsertAllResponse o) {
   buildCounterTableDataInsertAllResponse++;
   if (buildCounterTableDataInsertAllResponse < 3) {
-    checkUnnamed1102(o.insertErrors);
+    checkUnnamed279(o.insertErrors);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTableDataInsertAllResponse--;
 }
 
-buildUnnamed1103() {
+buildUnnamed280() {
   var o = new core.List<api.TableRow>();
   o.add(buildTableRow());
   o.add(buildTableRow());
   return o;
 }
 
-checkUnnamed1103(core.List<api.TableRow> o) {
+checkUnnamed280(core.List<api.TableRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableRow(o[0]);
   checkTableRow(o[1]);
@@ -1132,7 +1132,7 @@
     o.etag = "foo";
     o.kind = "foo";
     o.pageToken = "foo";
-    o.rows = buildUnnamed1103();
+    o.rows = buildUnnamed280();
     o.totalRows = "foo";
   }
   buildCounterTableDataList--;
@@ -1145,20 +1145,20 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed1103(o.rows);
+    checkUnnamed280(o.rows);
     unittest.expect(o.totalRows, unittest.equals('foo'));
   }
   buildCounterTableDataList--;
 }
 
-buildUnnamed1104() {
+buildUnnamed281() {
   var o = new core.List<api.TableFieldSchema>();
   o.add(buildTableFieldSchema());
   o.add(buildTableFieldSchema());
   return o;
 }
 
-checkUnnamed1104(core.List<api.TableFieldSchema> o) {
+checkUnnamed281(core.List<api.TableFieldSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableFieldSchema(o[0]);
   checkTableFieldSchema(o[1]);
@@ -1170,7 +1170,7 @@
   buildCounterTableFieldSchema++;
   if (buildCounterTableFieldSchema < 3) {
     o.description = "foo";
-    o.fields = buildUnnamed1104();
+    o.fields = buildUnnamed281();
     o.mode = "foo";
     o.name = "foo";
     o.type = "foo";
@@ -1183,7 +1183,7 @@
   buildCounterTableFieldSchema++;
   if (buildCounterTableFieldSchema < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1104(o.fields);
+    checkUnnamed281(o.fields);
     unittest.expect(o.mode, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -1218,14 +1218,14 @@
   buildCounterTableListTables--;
 }
 
-buildUnnamed1105() {
+buildUnnamed282() {
   var o = new core.List<api.TableListTables>();
   o.add(buildTableListTables());
   o.add(buildTableListTables());
   return o;
 }
 
-checkUnnamed1105(core.List<api.TableListTables> o) {
+checkUnnamed282(core.List<api.TableListTables> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableListTables(o[0]);
   checkTableListTables(o[1]);
@@ -1239,7 +1239,7 @@
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.tables = buildUnnamed1105();
+    o.tables = buildUnnamed282();
     o.totalItems = 42;
   }
   buildCounterTableList--;
@@ -1252,7 +1252,7 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1105(o.tables);
+    checkUnnamed282(o.tables);
     unittest.expect(o.totalItems, unittest.equals(42));
   }
   buildCounterTableList--;
@@ -1281,14 +1281,14 @@
   buildCounterTableReference--;
 }
 
-buildUnnamed1106() {
+buildUnnamed283() {
   var o = new core.List<api.TableCell>();
   o.add(buildTableCell());
   o.add(buildTableCell());
   return o;
 }
 
-checkUnnamed1106(core.List<api.TableCell> o) {
+checkUnnamed283(core.List<api.TableCell> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableCell(o[0]);
   checkTableCell(o[1]);
@@ -1299,7 +1299,7 @@
   var o = new api.TableRow();
   buildCounterTableRow++;
   if (buildCounterTableRow < 3) {
-    o.f = buildUnnamed1106();
+    o.f = buildUnnamed283();
   }
   buildCounterTableRow--;
   return o;
@@ -1308,19 +1308,19 @@
 checkTableRow(api.TableRow o) {
   buildCounterTableRow++;
   if (buildCounterTableRow < 3) {
-    checkUnnamed1106(o.f);
+    checkUnnamed283(o.f);
   }
   buildCounterTableRow--;
 }
 
-buildUnnamed1107() {
+buildUnnamed284() {
   var o = new core.List<api.TableFieldSchema>();
   o.add(buildTableFieldSchema());
   o.add(buildTableFieldSchema());
   return o;
 }
 
-checkUnnamed1107(core.List<api.TableFieldSchema> o) {
+checkUnnamed284(core.List<api.TableFieldSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableFieldSchema(o[0]);
   checkTableFieldSchema(o[1]);
@@ -1331,7 +1331,7 @@
   var o = new api.TableSchema();
   buildCounterTableSchema++;
   if (buildCounterTableSchema < 3) {
-    o.fields = buildUnnamed1107();
+    o.fields = buildUnnamed284();
   }
   buildCounterTableSchema--;
   return o;
@@ -1340,7 +1340,7 @@
 checkTableSchema(api.TableSchema o) {
   buildCounterTableSchema++;
   if (buildCounterTableSchema < 3) {
-    checkUnnamed1107(o.fields);
+    checkUnnamed284(o.fields);
   }
   buildCounterTableSchema--;
 }
@@ -1364,14 +1364,14 @@
   buildCounterViewDefinition--;
 }
 
-buildUnnamed1108() {
+buildUnnamed285() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1108(core.List<core.String> o) {
+checkUnnamed285(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2295,7 +2295,7 @@
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_projection = "foo";
-      var arg_stateFilter = buildUnnamed1108();
+      var arg_stateFilter = buildUnnamed285();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
diff --git a/generated/googleapis/test/blogger/v3_test.dart b/generated/googleapis/test/blogger/v3_test.dart
index b363cc6..3027d8f 100644
--- a/generated/googleapis/test/blogger/v3_test.dart
+++ b/generated/googleapis/test/blogger/v3_test.dart
@@ -60,14 +60,14 @@
   buildCounterBlogPages--;
 }
 
-buildUnnamed712() {
+buildUnnamed286() {
   var o = new core.List<api.Post>();
   o.add(buildPost());
   o.add(buildPost());
   return o;
 }
 
-checkUnnamed712(core.List<api.Post> o) {
+checkUnnamed286(core.List<api.Post> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPost(o[0]);
   checkPost(o[1]);
@@ -78,7 +78,7 @@
   var o = new api.BlogPosts();
   buildCounterBlogPosts++;
   if (buildCounterBlogPosts < 3) {
-    o.items = buildUnnamed712();
+    o.items = buildUnnamed286();
     o.selfLink = "foo";
     o.totalItems = 42;
   }
@@ -89,7 +89,7 @@
 checkBlogPosts(api.BlogPosts o) {
   buildCounterBlogPosts++;
   if (buildCounterBlogPosts < 3) {
-    checkUnnamed712(o.items);
+    checkUnnamed286(o.items);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
   }
@@ -139,27 +139,27 @@
   buildCounterBlog--;
 }
 
-buildUnnamed713() {
+buildUnnamed287() {
   var o = new core.List<api.BlogUserInfo>();
   o.add(buildBlogUserInfo());
   o.add(buildBlogUserInfo());
   return o;
 }
 
-checkUnnamed713(core.List<api.BlogUserInfo> o) {
+checkUnnamed287(core.List<api.BlogUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBlogUserInfo(o[0]);
   checkBlogUserInfo(o[1]);
 }
 
-buildUnnamed714() {
+buildUnnamed288() {
   var o = new core.List<api.Blog>();
   o.add(buildBlog());
   o.add(buildBlog());
   return o;
 }
 
-checkUnnamed714(core.List<api.Blog> o) {
+checkUnnamed288(core.List<api.Blog> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBlog(o[0]);
   checkBlog(o[1]);
@@ -170,8 +170,8 @@
   var o = new api.BlogList();
   buildCounterBlogList++;
   if (buildCounterBlogList < 3) {
-    o.blogUserInfos = buildUnnamed713();
-    o.items = buildUnnamed714();
+    o.blogUserInfos = buildUnnamed287();
+    o.items = buildUnnamed288();
     o.kind = "foo";
   }
   buildCounterBlogList--;
@@ -181,8 +181,8 @@
 checkBlogList(api.BlogList o) {
   buildCounterBlogList++;
   if (buildCounterBlogList < 3) {
-    checkUnnamed713(o.blogUserInfos);
-    checkUnnamed714(o.items);
+    checkUnnamed287(o.blogUserInfos);
+    checkUnnamed288(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBlogList--;
@@ -380,14 +380,14 @@
   buildCounterComment--;
 }
 
-buildUnnamed715() {
+buildUnnamed289() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed715(core.List<api.Comment> o) {
+checkUnnamed289(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -398,7 +398,7 @@
   var o = new api.CommentList();
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    o.items = buildUnnamed715();
+    o.items = buildUnnamed289();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.prevPageToken = "foo";
@@ -410,7 +410,7 @@
 checkCommentList(api.CommentList o) {
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    checkUnnamed715(o.items);
+    checkUnnamed289(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.prevPageToken, unittest.equals('foo'));
@@ -522,14 +522,14 @@
   buildCounterPage--;
 }
 
-buildUnnamed716() {
+buildUnnamed290() {
   var o = new core.List<api.Page>();
   o.add(buildPage());
   o.add(buildPage());
   return o;
 }
 
-checkUnnamed716(core.List<api.Page> o) {
+checkUnnamed290(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPage(o[0]);
   checkPage(o[1]);
@@ -540,7 +540,7 @@
   var o = new api.PageList();
   buildCounterPageList++;
   if (buildCounterPageList < 3) {
-    o.items = buildUnnamed716();
+    o.items = buildUnnamed290();
     o.kind = "foo";
   }
   buildCounterPageList--;
@@ -550,7 +550,7 @@
 checkPageList(api.PageList o) {
   buildCounterPageList++;
   if (buildCounterPageList < 3) {
-    checkUnnamed716(o.items);
+    checkUnnamed290(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPageList--;
@@ -577,14 +577,14 @@
   buildCounterPageviewsCounts--;
 }
 
-buildUnnamed717() {
+buildUnnamed291() {
   var o = new core.List<api.PageviewsCounts>();
   o.add(buildPageviewsCounts());
   o.add(buildPageviewsCounts());
   return o;
 }
 
-checkUnnamed717(core.List<api.PageviewsCounts> o) {
+checkUnnamed291(core.List<api.PageviewsCounts> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPageviewsCounts(o[0]);
   checkPageviewsCounts(o[1]);
@@ -596,7 +596,7 @@
   buildCounterPageviews++;
   if (buildCounterPageviews < 3) {
     o.blogId = "foo";
-    o.counts = buildUnnamed717();
+    o.counts = buildUnnamed291();
     o.kind = "foo";
   }
   buildCounterPageviews--;
@@ -607,7 +607,7 @@
   buildCounterPageviews++;
   if (buildCounterPageviews < 3) {
     unittest.expect(o.blogId, unittest.equals('foo'));
-    checkUnnamed717(o.counts);
+    checkUnnamed291(o.counts);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPageviews--;
@@ -695,27 +695,27 @@
   buildCounterPostImages--;
 }
 
-buildUnnamed718() {
+buildUnnamed292() {
   var o = new core.List<api.PostImages>();
   o.add(buildPostImages());
   o.add(buildPostImages());
   return o;
 }
 
-checkUnnamed718(core.List<api.PostImages> o) {
+checkUnnamed292(core.List<api.PostImages> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPostImages(o[0]);
   checkPostImages(o[1]);
 }
 
-buildUnnamed719() {
+buildUnnamed293() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed719(core.List<core.String> o) {
+checkUnnamed293(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -746,14 +746,14 @@
   buildCounterPostLocation--;
 }
 
-buildUnnamed720() {
+buildUnnamed294() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed720(core.List<api.Comment> o) {
+checkUnnamed294(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -764,7 +764,7 @@
   var o = new api.PostReplies();
   buildCounterPostReplies++;
   if (buildCounterPostReplies < 3) {
-    o.items = buildUnnamed720();
+    o.items = buildUnnamed294();
     o.selfLink = "foo";
     o.totalItems = "foo";
   }
@@ -775,7 +775,7 @@
 checkPostReplies(api.PostReplies o) {
   buildCounterPostReplies++;
   if (buildCounterPostReplies < 3) {
-    checkUnnamed720(o.items);
+    checkUnnamed294(o.items);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals('foo'));
   }
@@ -793,9 +793,9 @@
     o.customMetaData = "foo";
     o.etag = "foo";
     o.id = "foo";
-    o.images = buildUnnamed718();
+    o.images = buildUnnamed292();
     o.kind = "foo";
-    o.labels = buildUnnamed719();
+    o.labels = buildUnnamed293();
     o.location = buildPostLocation();
     o.published = core.DateTime.parse("2002-02-27T14:01:02");
     o.readerComments = "foo";
@@ -820,9 +820,9 @@
     unittest.expect(o.customMetaData, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed718(o.images);
+    checkUnnamed292(o.images);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed719(o.labels);
+    checkUnnamed293(o.labels);
     checkPostLocation(o.location);
     unittest.expect(o.published, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.readerComments, unittest.equals('foo'));
@@ -837,14 +837,14 @@
   buildCounterPost--;
 }
 
-buildUnnamed721() {
+buildUnnamed295() {
   var o = new core.List<api.Post>();
   o.add(buildPost());
   o.add(buildPost());
   return o;
 }
 
-checkUnnamed721(core.List<api.Post> o) {
+checkUnnamed295(core.List<api.Post> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPost(o[0]);
   checkPost(o[1]);
@@ -855,7 +855,7 @@
   var o = new api.PostList();
   buildCounterPostList++;
   if (buildCounterPostList < 3) {
-    o.items = buildUnnamed721();
+    o.items = buildUnnamed295();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -866,7 +866,7 @@
 checkPostList(api.PostList o) {
   buildCounterPostList++;
   if (buildCounterPostList < 3) {
-    checkUnnamed721(o.items);
+    checkUnnamed295(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -923,14 +923,14 @@
   buildCounterPostUserInfo--;
 }
 
-buildUnnamed722() {
+buildUnnamed296() {
   var o = new core.List<api.PostUserInfo>();
   o.add(buildPostUserInfo());
   o.add(buildPostUserInfo());
   return o;
 }
 
-checkUnnamed722(core.List<api.PostUserInfo> o) {
+checkUnnamed296(core.List<api.PostUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPostUserInfo(o[0]);
   checkPostUserInfo(o[1]);
@@ -941,7 +941,7 @@
   var o = new api.PostUserInfosList();
   buildCounterPostUserInfosList++;
   if (buildCounterPostUserInfosList < 3) {
-    o.items = buildUnnamed722();
+    o.items = buildUnnamed296();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -952,7 +952,7 @@
 checkPostUserInfosList(api.PostUserInfosList o) {
   buildCounterPostUserInfosList++;
   if (buildCounterPostUserInfosList < 3) {
-    checkUnnamed722(o.items);
+    checkUnnamed296(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1036,92 +1036,92 @@
   buildCounterUser--;
 }
 
-buildUnnamed723() {
+buildUnnamed297() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed723(core.List<core.String> o) {
+checkUnnamed297(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed724() {
+buildUnnamed298() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed724(core.List<core.String> o) {
+checkUnnamed298(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed725() {
+buildUnnamed299() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed725(core.List<core.String> o) {
+checkUnnamed299(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed726() {
+buildUnnamed300() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed726(core.List<core.String> o) {
+checkUnnamed300(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed727() {
+buildUnnamed301() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed727(core.List<core.String> o) {
+checkUnnamed301(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed728() {
+buildUnnamed302() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed728(core.List<core.String> o) {
+checkUnnamed302(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed729() {
+buildUnnamed303() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed729(core.List<core.String> o) {
+checkUnnamed303(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1616,8 +1616,8 @@
       api.BlogsResourceApi res = new api.BloggerApi(mock).blogs;
       var arg_userId = "foo";
       var arg_fetchUserInfo = true;
-      var arg_role = buildUnnamed723();
-      var arg_status = buildUnnamed724();
+      var arg_role = buildUnnamed297();
+      var arg_status = buildUnnamed298();
       var arg_view = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1885,7 +1885,7 @@
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_startDate = core.DateTime.parse("2002-02-27T14:01:02");
-      var arg_status = buildUnnamed725();
+      var arg_status = buildUnnamed299();
       var arg_view = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2159,7 +2159,7 @@
       var mock = new common_test.HttpServerMock();
       api.PageViewsResourceApi res = new api.BloggerApi(mock).pageViews;
       var arg_blogId = "foo";
-      var arg_range = buildUnnamed726();
+      var arg_range = buildUnnamed300();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2392,7 +2392,7 @@
       api.PagesResourceApi res = new api.BloggerApi(mock).pages;
       var arg_blogId = "foo";
       var arg_fetchBodies = true;
-      var arg_status = buildUnnamed727();
+      var arg_status = buildUnnamed301();
       var arg_view = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2781,7 +2781,7 @@
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
       var arg_startDate = core.DateTime.parse("2002-02-27T14:01:02");
-      var arg_status = buildUnnamed728();
+      var arg_status = buildUnnamed302();
       var arg_view = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -3106,7 +3106,7 @@
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
       var arg_startDate = core.DateTime.parse("2002-02-27T14:01:02");
-      var arg_status = buildUnnamed729();
+      var arg_status = buildUnnamed303();
       var arg_view = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
diff --git a/generated/googleapis/test/books/v1_test.dart b/generated/googleapis/test/books/v1_test.dart
index ffc0aca..9cabfce 100644
--- a/generated/googleapis/test/books/v1_test.dart
+++ b/generated/googleapis/test/books/v1_test.dart
@@ -93,14 +93,14 @@
   buildCounterAnnotationLayerSummary--;
 }
 
-buildUnnamed509() {
+buildUnnamed304() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed509(core.List<core.String> o) {
+checkUnnamed304(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -123,7 +123,7 @@
     o.kind = "foo";
     o.layerId = "foo";
     o.layerSummary = buildAnnotationLayerSummary();
-    o.pageIds = buildUnnamed509();
+    o.pageIds = buildUnnamed304();
     o.selectedText = "foo";
     o.selfLink = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
@@ -148,7 +148,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.layerId, unittest.equals('foo'));
     checkAnnotationLayerSummary(o.layerSummary);
-    checkUnnamed509(o.pageIds);
+    checkUnnamed304(o.pageIds);
     unittest.expect(o.selectedText, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -192,14 +192,14 @@
   buildCounterAnnotationdata--;
 }
 
-buildUnnamed510() {
+buildUnnamed305() {
   var o = new core.List<api.Annotation>();
   o.add(buildAnnotation());
   o.add(buildAnnotation());
   return o;
 }
 
-checkUnnamed510(core.List<api.Annotation> o) {
+checkUnnamed305(core.List<api.Annotation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnnotation(o[0]);
   checkAnnotation(o[1]);
@@ -210,7 +210,7 @@
   var o = new api.Annotations();
   buildCounterAnnotations++;
   if (buildCounterAnnotations < 3) {
-    o.items = buildUnnamed510();
+    o.items = buildUnnamed305();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -222,7 +222,7 @@
 checkAnnotations(api.Annotations o) {
   buildCounterAnnotations++;
   if (buildCounterAnnotations < 3) {
-    checkUnnamed510(o.items);
+    checkUnnamed305(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -257,14 +257,14 @@
   buildCounterAnnotationsSummaryLayers--;
 }
 
-buildUnnamed511() {
+buildUnnamed306() {
   var o = new core.List<api.AnnotationsSummaryLayers>();
   o.add(buildAnnotationsSummaryLayers());
   o.add(buildAnnotationsSummaryLayers());
   return o;
 }
 
-checkUnnamed511(core.List<api.AnnotationsSummaryLayers> o) {
+checkUnnamed306(core.List<api.AnnotationsSummaryLayers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnnotationsSummaryLayers(o[0]);
   checkAnnotationsSummaryLayers(o[1]);
@@ -276,7 +276,7 @@
   buildCounterAnnotationsSummary++;
   if (buildCounterAnnotationsSummary < 3) {
     o.kind = "foo";
-    o.layers = buildUnnamed511();
+    o.layers = buildUnnamed306();
   }
   buildCounterAnnotationsSummary--;
   return o;
@@ -286,19 +286,19 @@
   buildCounterAnnotationsSummary++;
   if (buildCounterAnnotationsSummary < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed511(o.layers);
+    checkUnnamed306(o.layers);
   }
   buildCounterAnnotationsSummary--;
 }
 
-buildUnnamed512() {
+buildUnnamed307() {
   var o = new core.List<api.Annotationdata>();
   o.add(buildAnnotationdata());
   o.add(buildAnnotationdata());
   return o;
 }
 
-checkUnnamed512(core.List<api.Annotationdata> o) {
+checkUnnamed307(core.List<api.Annotationdata> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnnotationdata(o[0]);
   checkAnnotationdata(o[1]);
@@ -309,7 +309,7 @@
   var o = new api.Annotationsdata();
   buildCounterAnnotationsdata++;
   if (buildCounterAnnotationsdata < 3) {
-    o.items = buildUnnamed512();
+    o.items = buildUnnamed307();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -321,7 +321,7 @@
 checkAnnotationsdata(api.Annotationsdata o) {
   buildCounterAnnotationsdata++;
   if (buildCounterAnnotationsdata < 3) {
-    checkUnnamed512(o.items);
+    checkUnnamed307(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -435,14 +435,14 @@
   buildCounterBookshelf--;
 }
 
-buildUnnamed513() {
+buildUnnamed308() {
   var o = new core.List<api.Bookshelf>();
   o.add(buildBookshelf());
   o.add(buildBookshelf());
   return o;
 }
 
-checkUnnamed513(core.List<api.Bookshelf> o) {
+checkUnnamed308(core.List<api.Bookshelf> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBookshelf(o[0]);
   checkBookshelf(o[1]);
@@ -453,7 +453,7 @@
   var o = new api.Bookshelves();
   buildCounterBookshelves++;
   if (buildCounterBookshelves < 3) {
-    o.items = buildUnnamed513();
+    o.items = buildUnnamed308();
     o.kind = "foo";
   }
   buildCounterBookshelves--;
@@ -463,7 +463,7 @@
 checkBookshelves(api.Bookshelves o) {
   buildCounterBookshelves++;
   if (buildCounterBookshelves < 3) {
-    checkUnnamed513(o.items);
+    checkUnnamed308(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBookshelves--;
@@ -590,14 +590,14 @@
   buildCounterDictlayerdataDictWordsDerivatives--;
 }
 
-buildUnnamed514() {
+buildUnnamed309() {
   var o = new core.List<api.DictlayerdataDictWordsDerivatives>();
   o.add(buildDictlayerdataDictWordsDerivatives());
   o.add(buildDictlayerdataDictWordsDerivatives());
   return o;
 }
 
-checkUnnamed514(core.List<api.DictlayerdataDictWordsDerivatives> o) {
+checkUnnamed309(core.List<api.DictlayerdataDictWordsDerivatives> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsDerivatives(o[0]);
   checkDictlayerdataDictWordsDerivatives(o[1]);
@@ -645,14 +645,14 @@
   buildCounterDictlayerdataDictWordsExamples--;
 }
 
-buildUnnamed515() {
+buildUnnamed310() {
   var o = new core.List<api.DictlayerdataDictWordsExamples>();
   o.add(buildDictlayerdataDictWordsExamples());
   o.add(buildDictlayerdataDictWordsExamples());
   return o;
 }
 
-checkUnnamed515(core.List<api.DictlayerdataDictWordsExamples> o) {
+checkUnnamed310(core.List<api.DictlayerdataDictWordsExamples> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsExamples(o[0]);
   checkDictlayerdataDictWordsExamples(o[1]);
@@ -679,14 +679,14 @@
   buildCounterDictlayerdataDictWordsSensesConjugations--;
 }
 
-buildUnnamed516() {
+buildUnnamed311() {
   var o = new core.List<api.DictlayerdataDictWordsSensesConjugations>();
   o.add(buildDictlayerdataDictWordsSensesConjugations());
   o.add(buildDictlayerdataDictWordsSensesConjugations());
   return o;
 }
 
-checkUnnamed516(core.List<api.DictlayerdataDictWordsSensesConjugations> o) {
+checkUnnamed311(core.List<api.DictlayerdataDictWordsSensesConjugations> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSensesConjugations(o[0]);
   checkDictlayerdataDictWordsSensesConjugations(o[1]);
@@ -734,14 +734,14 @@
   buildCounterDictlayerdataDictWordsSensesDefinitionsExamples--;
 }
 
-buildUnnamed517() {
+buildUnnamed312() {
   var o = new core.List<api.DictlayerdataDictWordsSensesDefinitionsExamples>();
   o.add(buildDictlayerdataDictWordsSensesDefinitionsExamples());
   o.add(buildDictlayerdataDictWordsSensesDefinitionsExamples());
   return o;
 }
 
-checkUnnamed517(core.List<api.DictlayerdataDictWordsSensesDefinitionsExamples> o) {
+checkUnnamed312(core.List<api.DictlayerdataDictWordsSensesDefinitionsExamples> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSensesDefinitionsExamples(o[0]);
   checkDictlayerdataDictWordsSensesDefinitionsExamples(o[1]);
@@ -753,7 +753,7 @@
   buildCounterDictlayerdataDictWordsSensesDefinitions++;
   if (buildCounterDictlayerdataDictWordsSensesDefinitions < 3) {
     o.definition = "foo";
-    o.examples = buildUnnamed517();
+    o.examples = buildUnnamed312();
   }
   buildCounterDictlayerdataDictWordsSensesDefinitions--;
   return o;
@@ -763,19 +763,19 @@
   buildCounterDictlayerdataDictWordsSensesDefinitions++;
   if (buildCounterDictlayerdataDictWordsSensesDefinitions < 3) {
     unittest.expect(o.definition, unittest.equals('foo'));
-    checkUnnamed517(o.examples);
+    checkUnnamed312(o.examples);
   }
   buildCounterDictlayerdataDictWordsSensesDefinitions--;
 }
 
-buildUnnamed518() {
+buildUnnamed313() {
   var o = new core.List<api.DictlayerdataDictWordsSensesDefinitions>();
   o.add(buildDictlayerdataDictWordsSensesDefinitions());
   o.add(buildDictlayerdataDictWordsSensesDefinitions());
   return o;
 }
 
-checkUnnamed518(core.List<api.DictlayerdataDictWordsSensesDefinitions> o) {
+checkUnnamed313(core.List<api.DictlayerdataDictWordsSensesDefinitions> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSensesDefinitions(o[0]);
   checkDictlayerdataDictWordsSensesDefinitions(o[1]);
@@ -844,14 +844,14 @@
   buildCounterDictlayerdataDictWordsSensesSynonyms--;
 }
 
-buildUnnamed519() {
+buildUnnamed314() {
   var o = new core.List<api.DictlayerdataDictWordsSensesSynonyms>();
   o.add(buildDictlayerdataDictWordsSensesSynonyms());
   o.add(buildDictlayerdataDictWordsSensesSynonyms());
   return o;
 }
 
-checkUnnamed519(core.List<api.DictlayerdataDictWordsSensesSynonyms> o) {
+checkUnnamed314(core.List<api.DictlayerdataDictWordsSensesSynonyms> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSensesSynonyms(o[0]);
   checkDictlayerdataDictWordsSensesSynonyms(o[1]);
@@ -862,14 +862,14 @@
   var o = new api.DictlayerdataDictWordsSenses();
   buildCounterDictlayerdataDictWordsSenses++;
   if (buildCounterDictlayerdataDictWordsSenses < 3) {
-    o.conjugations = buildUnnamed516();
-    o.definitions = buildUnnamed518();
+    o.conjugations = buildUnnamed311();
+    o.definitions = buildUnnamed313();
     o.partOfSpeech = "foo";
     o.pronunciation = "foo";
     o.pronunciationUrl = "foo";
     o.source = buildDictlayerdataDictWordsSensesSource();
     o.syllabification = "foo";
-    o.synonyms = buildUnnamed519();
+    o.synonyms = buildUnnamed314();
   }
   buildCounterDictlayerdataDictWordsSenses--;
   return o;
@@ -878,26 +878,26 @@
 checkDictlayerdataDictWordsSenses(api.DictlayerdataDictWordsSenses o) {
   buildCounterDictlayerdataDictWordsSenses++;
   if (buildCounterDictlayerdataDictWordsSenses < 3) {
-    checkUnnamed516(o.conjugations);
-    checkUnnamed518(o.definitions);
+    checkUnnamed311(o.conjugations);
+    checkUnnamed313(o.definitions);
     unittest.expect(o.partOfSpeech, unittest.equals('foo'));
     unittest.expect(o.pronunciation, unittest.equals('foo'));
     unittest.expect(o.pronunciationUrl, unittest.equals('foo'));
     checkDictlayerdataDictWordsSensesSource(o.source);
     unittest.expect(o.syllabification, unittest.equals('foo'));
-    checkUnnamed519(o.synonyms);
+    checkUnnamed314(o.synonyms);
   }
   buildCounterDictlayerdataDictWordsSenses--;
 }
 
-buildUnnamed520() {
+buildUnnamed315() {
   var o = new core.List<api.DictlayerdataDictWordsSenses>();
   o.add(buildDictlayerdataDictWordsSenses());
   o.add(buildDictlayerdataDictWordsSenses());
   return o;
 }
 
-checkUnnamed520(core.List<api.DictlayerdataDictWordsSenses> o) {
+checkUnnamed315(core.List<api.DictlayerdataDictWordsSenses> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSenses(o[0]);
   checkDictlayerdataDictWordsSenses(o[1]);
@@ -929,9 +929,9 @@
   var o = new api.DictlayerdataDictWords();
   buildCounterDictlayerdataDictWords++;
   if (buildCounterDictlayerdataDictWords < 3) {
-    o.derivatives = buildUnnamed514();
-    o.examples = buildUnnamed515();
-    o.senses = buildUnnamed520();
+    o.derivatives = buildUnnamed309();
+    o.examples = buildUnnamed310();
+    o.senses = buildUnnamed315();
     o.source = buildDictlayerdataDictWordsSource();
   }
   buildCounterDictlayerdataDictWords--;
@@ -941,22 +941,22 @@
 checkDictlayerdataDictWords(api.DictlayerdataDictWords o) {
   buildCounterDictlayerdataDictWords++;
   if (buildCounterDictlayerdataDictWords < 3) {
-    checkUnnamed514(o.derivatives);
-    checkUnnamed515(o.examples);
-    checkUnnamed520(o.senses);
+    checkUnnamed309(o.derivatives);
+    checkUnnamed310(o.examples);
+    checkUnnamed315(o.senses);
     checkDictlayerdataDictWordsSource(o.source);
   }
   buildCounterDictlayerdataDictWords--;
 }
 
-buildUnnamed521() {
+buildUnnamed316() {
   var o = new core.List<api.DictlayerdataDictWords>();
   o.add(buildDictlayerdataDictWords());
   o.add(buildDictlayerdataDictWords());
   return o;
 }
 
-checkUnnamed521(core.List<api.DictlayerdataDictWords> o) {
+checkUnnamed316(core.List<api.DictlayerdataDictWords> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWords(o[0]);
   checkDictlayerdataDictWords(o[1]);
@@ -968,7 +968,7 @@
   buildCounterDictlayerdataDict++;
   if (buildCounterDictlayerdataDict < 3) {
     o.source = buildDictlayerdataDictSource();
-    o.words = buildUnnamed521();
+    o.words = buildUnnamed316();
   }
   buildCounterDictlayerdataDict--;
   return o;
@@ -978,7 +978,7 @@
   buildCounterDictlayerdataDict++;
   if (buildCounterDictlayerdataDict < 3) {
     checkDictlayerdataDictSource(o.source);
-    checkUnnamed521(o.words);
+    checkUnnamed316(o.words);
   }
   buildCounterDictlayerdataDict--;
 }
@@ -1047,14 +1047,14 @@
   buildCounterDownloadAccessRestriction--;
 }
 
-buildUnnamed522() {
+buildUnnamed317() {
   var o = new core.List<api.DownloadAccessRestriction>();
   o.add(buildDownloadAccessRestriction());
   o.add(buildDownloadAccessRestriction());
   return o;
 }
 
-checkUnnamed522(core.List<api.DownloadAccessRestriction> o) {
+checkUnnamed317(core.List<api.DownloadAccessRestriction> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDownloadAccessRestriction(o[0]);
   checkDownloadAccessRestriction(o[1]);
@@ -1065,7 +1065,7 @@
   var o = new api.DownloadAccesses();
   buildCounterDownloadAccesses++;
   if (buildCounterDownloadAccesses < 3) {
-    o.downloadAccessList = buildUnnamed522();
+    o.downloadAccessList = buildUnnamed317();
     o.kind = "foo";
   }
   buildCounterDownloadAccesses--;
@@ -1075,7 +1075,7 @@
 checkDownloadAccesses(api.DownloadAccesses o) {
   buildCounterDownloadAccesses++;
   if (buildCounterDownloadAccesses < 3) {
-    checkUnnamed522(o.downloadAccessList);
+    checkUnnamed317(o.downloadAccessList);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDownloadAccesses--;
@@ -1129,30 +1129,30 @@
   buildCounterGeolayerdataGeoBoundary--;
 }
 
-buildUnnamed523() {
+buildUnnamed318() {
   var o = new core.List<api.GeolayerdataGeoBoundary>();
   o.add(buildGeolayerdataGeoBoundary());
   o.add(buildGeolayerdataGeoBoundary());
   return o;
 }
 
-checkUnnamed523(core.List<api.GeolayerdataGeoBoundary> o) {
+checkUnnamed318(core.List<api.GeolayerdataGeoBoundary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeolayerdataGeoBoundary(o[0]);
   checkGeolayerdataGeoBoundary(o[1]);
 }
 
-buildUnnamed524() {
+buildUnnamed319() {
   var o = new core.List<core.List<api.GeolayerdataGeoBoundary>>();
-  o.add(buildUnnamed523());
-  o.add(buildUnnamed523());
+  o.add(buildUnnamed318());
+  o.add(buildUnnamed318());
   return o;
 }
 
-checkUnnamed524(core.List<core.List<api.GeolayerdataGeoBoundary>> o) {
+checkUnnamed319(core.List<core.List<api.GeolayerdataGeoBoundary>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed523(o[0]);
-  checkUnnamed523(o[1]);
+  checkUnnamed318(o[0]);
+  checkUnnamed318(o[1]);
 }
 
 core.int buildCounterGeolayerdataGeoViewportHi = 0;
@@ -1223,7 +1223,7 @@
   var o = new api.GeolayerdataGeo();
   buildCounterGeolayerdataGeo++;
   if (buildCounterGeolayerdataGeo < 3) {
-    o.boundary = buildUnnamed524();
+    o.boundary = buildUnnamed319();
     o.cachePolicy = "foo";
     o.countryCode = "foo";
     o.latitude = 42.0;
@@ -1239,7 +1239,7 @@
 checkGeolayerdataGeo(api.GeolayerdataGeo o) {
   buildCounterGeolayerdataGeo++;
   if (buildCounterGeolayerdataGeo < 3) {
-    checkUnnamed524(o.boundary);
+    checkUnnamed319(o.boundary);
     unittest.expect(o.cachePolicy, unittest.equals('foo'));
     unittest.expect(o.countryCode, unittest.equals('foo'));
     unittest.expect(o.latitude, unittest.equals(42.0));
@@ -1274,14 +1274,14 @@
   buildCounterGeolayerdata--;
 }
 
-buildUnnamed525() {
+buildUnnamed320() {
   var o = new core.List<api.Layersummary>();
   o.add(buildLayersummary());
   o.add(buildLayersummary());
   return o;
 }
 
-checkUnnamed525(core.List<api.Layersummary> o) {
+checkUnnamed320(core.List<api.Layersummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLayersummary(o[0]);
   checkLayersummary(o[1]);
@@ -1292,7 +1292,7 @@
   var o = new api.Layersummaries();
   buildCounterLayersummaries++;
   if (buildCounterLayersummaries < 3) {
-    o.items = buildUnnamed525();
+    o.items = buildUnnamed320();
     o.kind = "foo";
     o.totalItems = 42;
   }
@@ -1303,21 +1303,21 @@
 checkLayersummaries(api.Layersummaries o) {
   buildCounterLayersummaries++;
   if (buildCounterLayersummaries < 3) {
-    checkUnnamed525(o.items);
+    checkUnnamed320(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
   }
   buildCounterLayersummaries--;
 }
 
-buildUnnamed526() {
+buildUnnamed321() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed526(core.List<core.String> o) {
+checkUnnamed321(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1329,7 +1329,7 @@
   buildCounterLayersummary++;
   if (buildCounterLayersummary < 3) {
     o.annotationCount = 42;
-    o.annotationTypes = buildUnnamed526();
+    o.annotationTypes = buildUnnamed321();
     o.annotationsDataLink = "foo";
     o.annotationsLink = "foo";
     o.contentVersion = "foo";
@@ -1350,7 +1350,7 @@
   buildCounterLayersummary++;
   if (buildCounterLayersummary < 3) {
     unittest.expect(o.annotationCount, unittest.equals(42));
-    checkUnnamed526(o.annotationTypes);
+    checkUnnamed321(o.annotationTypes);
     unittest.expect(o.annotationsDataLink, unittest.equals('foo'));
     unittest.expect(o.annotationsLink, unittest.equals('foo'));
     unittest.expect(o.contentVersion, unittest.equals('foo'));
@@ -1395,14 +1395,14 @@
   buildCounterOffersItemsItems--;
 }
 
-buildUnnamed527() {
+buildUnnamed322() {
   var o = new core.List<api.OffersItemsItems>();
   o.add(buildOffersItemsItems());
   o.add(buildOffersItemsItems());
   return o;
 }
 
-checkUnnamed527(core.List<api.OffersItemsItems> o) {
+checkUnnamed322(core.List<api.OffersItemsItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffersItemsItems(o[0]);
   checkOffersItemsItems(o[1]);
@@ -1415,7 +1415,7 @@
   if (buildCounterOffersItems < 3) {
     o.artUrl = "foo";
     o.id = "foo";
-    o.items = buildUnnamed527();
+    o.items = buildUnnamed322();
   }
   buildCounterOffersItems--;
   return o;
@@ -1426,19 +1426,19 @@
   if (buildCounterOffersItems < 3) {
     unittest.expect(o.artUrl, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed527(o.items);
+    checkUnnamed322(o.items);
   }
   buildCounterOffersItems--;
 }
 
-buildUnnamed528() {
+buildUnnamed323() {
   var o = new core.List<api.OffersItems>();
   o.add(buildOffersItems());
   o.add(buildOffersItems());
   return o;
 }
 
-checkUnnamed528(core.List<api.OffersItems> o) {
+checkUnnamed323(core.List<api.OffersItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffersItems(o[0]);
   checkOffersItems(o[1]);
@@ -1449,7 +1449,7 @@
   var o = new api.Offers();
   buildCounterOffers++;
   if (buildCounterOffers < 3) {
-    o.items = buildUnnamed528();
+    o.items = buildUnnamed323();
     o.kind = "foo";
   }
   buildCounterOffers--;
@@ -1459,7 +1459,7 @@
 checkOffers(api.Offers o) {
   buildCounterOffers++;
   if (buildCounterOffers < 3) {
-    checkUnnamed528(o.items);
+    checkUnnamed323(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterOffers--;
@@ -1710,14 +1710,14 @@
   buildCounterVolumeLayerInfoLayers--;
 }
 
-buildUnnamed529() {
+buildUnnamed324() {
   var o = new core.List<api.VolumeLayerInfoLayers>();
   o.add(buildVolumeLayerInfoLayers());
   o.add(buildVolumeLayerInfoLayers());
   return o;
 }
 
-checkUnnamed529(core.List<api.VolumeLayerInfoLayers> o) {
+checkUnnamed324(core.List<api.VolumeLayerInfoLayers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolumeLayerInfoLayers(o[0]);
   checkVolumeLayerInfoLayers(o[1]);
@@ -1728,7 +1728,7 @@
   var o = new api.VolumeLayerInfo();
   buildCounterVolumeLayerInfo++;
   if (buildCounterVolumeLayerInfo < 3) {
-    o.layers = buildUnnamed529();
+    o.layers = buildUnnamed324();
   }
   buildCounterVolumeLayerInfo--;
   return o;
@@ -1737,7 +1737,7 @@
 checkVolumeLayerInfo(api.VolumeLayerInfo o) {
   buildCounterVolumeLayerInfo++;
   if (buildCounterVolumeLayerInfo < 3) {
-    checkUnnamed529(o.layers);
+    checkUnnamed324(o.layers);
   }
   buildCounterVolumeLayerInfo--;
 }
@@ -1870,14 +1870,14 @@
   buildCounterVolumeSaleInfoOffers--;
 }
 
-buildUnnamed530() {
+buildUnnamed325() {
   var o = new core.List<api.VolumeSaleInfoOffers>();
   o.add(buildVolumeSaleInfoOffers());
   o.add(buildVolumeSaleInfoOffers());
   return o;
 }
 
-checkUnnamed530(core.List<api.VolumeSaleInfoOffers> o) {
+checkUnnamed325(core.List<api.VolumeSaleInfoOffers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolumeSaleInfoOffers(o[0]);
   checkVolumeSaleInfoOffers(o[1]);
@@ -1913,7 +1913,7 @@
     o.country = "foo";
     o.isEbook = true;
     o.listPrice = buildVolumeSaleInfoListPrice();
-    o.offers = buildUnnamed530();
+    o.offers = buildUnnamed325();
     o.onSaleDate = core.DateTime.parse("2002-02-27T14:01:02");
     o.retailPrice = buildVolumeSaleInfoRetailPrice();
     o.saleability = "foo";
@@ -1929,7 +1929,7 @@
     unittest.expect(o.country, unittest.equals('foo'));
     unittest.expect(o.isEbook, unittest.isTrue);
     checkVolumeSaleInfoListPrice(o.listPrice);
-    checkUnnamed530(o.offers);
+    checkUnnamed325(o.offers);
     unittest.expect(o.onSaleDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkVolumeSaleInfoRetailPrice(o.retailPrice);
     unittest.expect(o.saleability, unittest.equals('foo'));
@@ -2060,27 +2060,27 @@
   buildCounterVolumeUserInfo--;
 }
 
-buildUnnamed531() {
+buildUnnamed326() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed531(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'));
 }
 
-buildUnnamed532() {
+buildUnnamed327() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed532(core.List<core.String> o) {
+checkUnnamed327(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2159,14 +2159,14 @@
   buildCounterVolumeVolumeInfoIndustryIdentifiers--;
 }
 
-buildUnnamed533() {
+buildUnnamed328() {
   var o = new core.List<api.VolumeVolumeInfoIndustryIdentifiers>();
   o.add(buildVolumeVolumeInfoIndustryIdentifiers());
   o.add(buildVolumeVolumeInfoIndustryIdentifiers());
   return o;
 }
 
-checkUnnamed533(core.List<api.VolumeVolumeInfoIndustryIdentifiers> o) {
+checkUnnamed328(core.List<api.VolumeVolumeInfoIndustryIdentifiers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolumeVolumeInfoIndustryIdentifiers(o[0]);
   checkVolumeVolumeInfoIndustryIdentifiers(o[1]);
@@ -2177,15 +2177,15 @@
   var o = new api.VolumeVolumeInfo();
   buildCounterVolumeVolumeInfo++;
   if (buildCounterVolumeVolumeInfo < 3) {
-    o.authors = buildUnnamed531();
+    o.authors = buildUnnamed326();
     o.averageRating = 42.0;
     o.canonicalVolumeLink = "foo";
-    o.categories = buildUnnamed532();
+    o.categories = buildUnnamed327();
     o.contentVersion = "foo";
     o.description = "foo";
     o.dimensions = buildVolumeVolumeInfoDimensions();
     o.imageLinks = buildVolumeVolumeInfoImageLinks();
-    o.industryIdentifiers = buildUnnamed533();
+    o.industryIdentifiers = buildUnnamed328();
     o.infoLink = "foo";
     o.language = "foo";
     o.mainCategory = "foo";
@@ -2207,15 +2207,15 @@
 checkVolumeVolumeInfo(api.VolumeVolumeInfo o) {
   buildCounterVolumeVolumeInfo++;
   if (buildCounterVolumeVolumeInfo < 3) {
-    checkUnnamed531(o.authors);
+    checkUnnamed326(o.authors);
     unittest.expect(o.averageRating, unittest.equals(42.0));
     unittest.expect(o.canonicalVolumeLink, unittest.equals('foo'));
-    checkUnnamed532(o.categories);
+    checkUnnamed327(o.categories);
     unittest.expect(o.contentVersion, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     checkVolumeVolumeInfoDimensions(o.dimensions);
     checkVolumeVolumeInfoImageLinks(o.imageLinks);
-    checkUnnamed533(o.industryIdentifiers);
+    checkUnnamed328(o.industryIdentifiers);
     unittest.expect(o.infoLink, unittest.equals('foo'));
     unittest.expect(o.language, unittest.equals('foo'));
     unittest.expect(o.mainCategory, unittest.equals('foo'));
@@ -2297,14 +2297,14 @@
   buildCounterVolumeannotationContentRanges--;
 }
 
-buildUnnamed534() {
+buildUnnamed329() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed534(core.List<core.String> o) {
+checkUnnamed329(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2324,7 +2324,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.layerId = "foo";
-    o.pageIds = buildUnnamed534();
+    o.pageIds = buildUnnamed329();
     o.selectedText = "foo";
     o.selfLink = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
@@ -2346,7 +2346,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.layerId, unittest.equals('foo'));
-    checkUnnamed534(o.pageIds);
+    checkUnnamed329(o.pageIds);
     unittest.expect(o.selectedText, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -2355,14 +2355,14 @@
   buildCounterVolumeannotation--;
 }
 
-buildUnnamed535() {
+buildUnnamed330() {
   var o = new core.List<api.Volumeannotation>();
   o.add(buildVolumeannotation());
   o.add(buildVolumeannotation());
   return o;
 }
 
-checkUnnamed535(core.List<api.Volumeannotation> o) {
+checkUnnamed330(core.List<api.Volumeannotation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolumeannotation(o[0]);
   checkVolumeannotation(o[1]);
@@ -2373,7 +2373,7 @@
   var o = new api.Volumeannotations();
   buildCounterVolumeannotations++;
   if (buildCounterVolumeannotations < 3) {
-    o.items = buildUnnamed535();
+    o.items = buildUnnamed330();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -2386,7 +2386,7 @@
 checkVolumeannotations(api.Volumeannotations o) {
   buildCounterVolumeannotations++;
   if (buildCounterVolumeannotations < 3) {
-    checkUnnamed535(o.items);
+    checkUnnamed330(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -2395,14 +2395,14 @@
   buildCounterVolumeannotations--;
 }
 
-buildUnnamed536() {
+buildUnnamed331() {
   var o = new core.List<api.Volume>();
   o.add(buildVolume());
   o.add(buildVolume());
   return o;
 }
 
-checkUnnamed536(core.List<api.Volume> o) {
+checkUnnamed331(core.List<api.Volume> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolume(o[0]);
   checkVolume(o[1]);
@@ -2413,7 +2413,7 @@
   var o = new api.Volumes();
   buildCounterVolumes++;
   if (buildCounterVolumes < 3) {
-    o.items = buildUnnamed536();
+    o.items = buildUnnamed331();
     o.kind = "foo";
     o.totalItems = 42;
   }
@@ -2424,151 +2424,151 @@
 checkVolumes(api.Volumes o) {
   buildCounterVolumes++;
   if (buildCounterVolumes < 3) {
-    checkUnnamed536(o.items);
+    checkUnnamed331(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
   }
   buildCounterVolumes--;
 }
 
-buildUnnamed537() {
+buildUnnamed332() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed537(core.List<core.String> o) {
+checkUnnamed332(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed538() {
+buildUnnamed333() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed538(core.List<core.String> o) {
+checkUnnamed333(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed539() {
+buildUnnamed334() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed539(core.List<core.String> o) {
+checkUnnamed334(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed540() {
+buildUnnamed335() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed540(core.List<core.String> o) {
+checkUnnamed335(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed541() {
+buildUnnamed336() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed541(core.List<core.String> o) {
+checkUnnamed336(core.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() {
+buildUnnamed337() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed542(core.List<core.String> o) {
+checkUnnamed337(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed543() {
+buildUnnamed338() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed543(core.List<core.String> o) {
+checkUnnamed338(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed544() {
+buildUnnamed339() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed544(core.List<core.String> o) {
+checkUnnamed339(core.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() {
+buildUnnamed340() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed545(core.List<core.String> o) {
+checkUnnamed340(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed546() {
+buildUnnamed341() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed546(core.List<core.String> o) {
+checkUnnamed341(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed547() {
+buildUnnamed342() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed547(core.List<core.String> o) {
+checkUnnamed342(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3842,7 +3842,7 @@
       var arg_volumeId = "foo";
       var arg_layerId = "foo";
       var arg_contentVersion = "foo";
-      var arg_annotationDataId = buildUnnamed537();
+      var arg_annotationDataId = buildUnnamed332();
       var arg_h = 42;
       var arg_locale = "foo";
       var arg_maxResults = 42;
@@ -4082,7 +4082,7 @@
 
       var mock = new common_test.HttpServerMock();
       api.MyconfigResourceApi res = new api.BooksApi(mock).myconfig;
-      var arg_volumeIds = buildUnnamed538();
+      var arg_volumeIds = buildUnnamed333();
       var arg_cpksver = "foo";
       var arg_locale = "foo";
       var arg_source = "foo";
@@ -4195,10 +4195,10 @@
       var arg_source = "foo";
       var arg_nonce = "foo";
       var arg_cpksver = "foo";
-      var arg_features = buildUnnamed539();
+      var arg_features = buildUnnamed334();
       var arg_locale = "foo";
       var arg_showPreorders = true;
-      var arg_volumeIds = buildUnnamed540();
+      var arg_volumeIds = buildUnnamed335();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4410,9 +4410,9 @@
       api.MylibraryAnnotationsResourceApi res = new api.BooksApi(mock).mylibrary.annotations;
       var arg_contentVersion = "foo";
       var arg_layerId = "foo";
-      var arg_layerIds = buildUnnamed541();
+      var arg_layerIds = buildUnnamed336();
       var arg_maxResults = 42;
-      var arg_pageIds = buildUnnamed542();
+      var arg_pageIds = buildUnnamed337();
       var arg_pageToken = "foo";
       var arg_showDeleted = true;
       var arg_source = "foo";
@@ -4475,7 +4475,7 @@
 
       var mock = new common_test.HttpServerMock();
       api.MylibraryAnnotationsResourceApi res = new api.BooksApi(mock).mylibrary.annotations;
-      var arg_layerIds = buildUnnamed543();
+      var arg_layerIds = buildUnnamed338();
       var arg_volumeId = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -5468,10 +5468,10 @@
 
       var mock = new common_test.HttpServerMock();
       api.VolumesMybooksResourceApi res = new api.BooksApi(mock).volumes.mybooks;
-      var arg_acquireMethod = buildUnnamed544();
+      var arg_acquireMethod = buildUnnamed339();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_processingState = buildUnnamed545();
+      var arg_processingState = buildUnnamed340();
       var arg_source = "foo";
       var arg_startIndex = 42;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
@@ -5637,10 +5637,10 @@
       api.VolumesUseruploadedResourceApi res = new api.BooksApi(mock).volumes.useruploaded;
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_processingState = buildUnnamed546();
+      var arg_processingState = buildUnnamed341();
       var arg_source = "foo";
       var arg_startIndex = 42;
-      var arg_volumeId = buildUnnamed547();
+      var arg_volumeId = buildUnnamed342();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
diff --git a/generated/googleapis/test/calendar/v3_test.dart b/generated/googleapis/test/calendar/v3_test.dart
index 7811a7c..03880c9 100644
--- a/generated/googleapis/test/calendar/v3_test.dart
+++ b/generated/googleapis/test/calendar/v3_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed675() {
+buildUnnamed343() {
   var o = new core.List<api.AclRule>();
   o.add(buildAclRule());
   o.add(buildAclRule());
   return o;
 }
 
-checkUnnamed675(core.List<api.AclRule> o) {
+checkUnnamed343(core.List<api.AclRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAclRule(o[0]);
   checkAclRule(o[1]);
@@ -35,7 +35,7 @@
   buildCounterAcl++;
   if (buildCounterAcl < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed675();
+    o.items = buildUnnamed343();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.nextSyncToken = "foo";
@@ -48,7 +48,7 @@
   buildCounterAcl++;
   if (buildCounterAcl < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed675(o.items);
+    checkUnnamed343(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.nextSyncToken, unittest.equals('foo'));
@@ -135,14 +135,14 @@
   buildCounterCalendar--;
 }
 
-buildUnnamed676() {
+buildUnnamed344() {
   var o = new core.List<api.CalendarListEntry>();
   o.add(buildCalendarListEntry());
   o.add(buildCalendarListEntry());
   return o;
 }
 
-checkUnnamed676(core.List<api.CalendarListEntry> o) {
+checkUnnamed344(core.List<api.CalendarListEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCalendarListEntry(o[0]);
   checkCalendarListEntry(o[1]);
@@ -154,7 +154,7 @@
   buildCounterCalendarList++;
   if (buildCounterCalendarList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed676();
+    o.items = buildUnnamed344();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.nextSyncToken = "foo";
@@ -167,7 +167,7 @@
   buildCounterCalendarList++;
   if (buildCounterCalendarList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed676(o.items);
+    checkUnnamed344(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.nextSyncToken, unittest.equals('foo'));
@@ -175,27 +175,27 @@
   buildCounterCalendarList--;
 }
 
-buildUnnamed677() {
+buildUnnamed345() {
   var o = new core.List<api.EventReminder>();
   o.add(buildEventReminder());
   o.add(buildEventReminder());
   return o;
 }
 
-checkUnnamed677(core.List<api.EventReminder> o) {
+checkUnnamed345(core.List<api.EventReminder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventReminder(o[0]);
   checkEventReminder(o[1]);
 }
 
-buildUnnamed678() {
+buildUnnamed346() {
   var o = new core.List<api.CalendarNotification>();
   o.add(buildCalendarNotification());
   o.add(buildCalendarNotification());
   return o;
 }
 
-checkUnnamed678(core.List<api.CalendarNotification> o) {
+checkUnnamed346(core.List<api.CalendarNotification> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCalendarNotification(o[0]);
   checkCalendarNotification(o[1]);
@@ -206,7 +206,7 @@
   var o = new api.CalendarListEntryNotificationSettings();
   buildCounterCalendarListEntryNotificationSettings++;
   if (buildCounterCalendarListEntryNotificationSettings < 3) {
-    o.notifications = buildUnnamed678();
+    o.notifications = buildUnnamed346();
   }
   buildCounterCalendarListEntryNotificationSettings--;
   return o;
@@ -215,7 +215,7 @@
 checkCalendarListEntryNotificationSettings(api.CalendarListEntryNotificationSettings o) {
   buildCounterCalendarListEntryNotificationSettings++;
   if (buildCounterCalendarListEntryNotificationSettings < 3) {
-    checkUnnamed678(o.notifications);
+    checkUnnamed346(o.notifications);
   }
   buildCounterCalendarListEntryNotificationSettings--;
 }
@@ -228,7 +228,7 @@
     o.accessRole = "foo";
     o.backgroundColor = "foo";
     o.colorId = "foo";
-    o.defaultReminders = buildUnnamed677();
+    o.defaultReminders = buildUnnamed345();
     o.deleted = true;
     o.description = "foo";
     o.etag = "foo";
@@ -254,7 +254,7 @@
     unittest.expect(o.accessRole, unittest.equals('foo'));
     unittest.expect(o.backgroundColor, unittest.equals('foo'));
     unittest.expect(o.colorId, unittest.equals('foo'));
-    checkUnnamed677(o.defaultReminders);
+    checkUnnamed345(o.defaultReminders);
     unittest.expect(o.deleted, unittest.isTrue);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
@@ -294,14 +294,14 @@
   buildCounterCalendarNotification--;
 }
 
-buildUnnamed679() {
+buildUnnamed347() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed679(core.Map<core.String, core.String> o) {
+checkUnnamed347(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'));
@@ -316,7 +316,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed679();
+    o.params = buildUnnamed347();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -334,7 +334,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed679(o.params);
+    checkUnnamed347(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -365,27 +365,27 @@
   buildCounterColorDefinition--;
 }
 
-buildUnnamed680() {
+buildUnnamed348() {
   var o = new core.Map<core.String, api.ColorDefinition>();
   o["x"] = buildColorDefinition();
   o["y"] = buildColorDefinition();
   return o;
 }
 
-checkUnnamed680(core.Map<core.String, api.ColorDefinition> o) {
+checkUnnamed348(core.Map<core.String, api.ColorDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColorDefinition(o["x"]);
   checkColorDefinition(o["y"]);
 }
 
-buildUnnamed681() {
+buildUnnamed349() {
   var o = new core.Map<core.String, api.ColorDefinition>();
   o["x"] = buildColorDefinition();
   o["y"] = buildColorDefinition();
   return o;
 }
 
-checkUnnamed681(core.Map<core.String, api.ColorDefinition> o) {
+checkUnnamed349(core.Map<core.String, api.ColorDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColorDefinition(o["x"]);
   checkColorDefinition(o["y"]);
@@ -396,8 +396,8 @@
   var o = new api.Colors();
   buildCounterColors++;
   if (buildCounterColors < 3) {
-    o.calendar = buildUnnamed680();
-    o.event = buildUnnamed681();
+    o.calendar = buildUnnamed348();
+    o.event = buildUnnamed349();
     o.kind = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
   }
@@ -408,8 +408,8 @@
 checkColors(api.Colors o) {
   buildCounterColors++;
   if (buildCounterColors < 3) {
-    checkUnnamed680(o.calendar);
-    checkUnnamed681(o.event);
+    checkUnnamed348(o.calendar);
+    checkUnnamed349(o.event);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
@@ -437,14 +437,14 @@
   buildCounterError--;
 }
 
-buildUnnamed682() {
+buildUnnamed350() {
   var o = new core.List<api.EventAttendee>();
   o.add(buildEventAttendee());
   o.add(buildEventAttendee());
   return o;
 }
 
-checkUnnamed682(core.List<api.EventAttendee> o) {
+checkUnnamed350(core.List<api.EventAttendee> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventAttendee(o[0]);
   checkEventAttendee(o[1]);
@@ -475,27 +475,27 @@
   buildCounterEventCreator--;
 }
 
-buildUnnamed683() {
+buildUnnamed351() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed683(core.Map<core.String, core.String> o) {
+checkUnnamed351(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'));
 }
 
-buildUnnamed684() {
+buildUnnamed352() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed684(core.Map<core.String, core.String> o) {
+checkUnnamed352(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'));
@@ -506,8 +506,8 @@
   var o = new api.EventExtendedProperties();
   buildCounterEventExtendedProperties++;
   if (buildCounterEventExtendedProperties < 3) {
-    o.private = buildUnnamed683();
-    o.shared = buildUnnamed684();
+    o.private = buildUnnamed351();
+    o.shared = buildUnnamed352();
   }
   buildCounterEventExtendedProperties--;
   return o;
@@ -516,20 +516,20 @@
 checkEventExtendedProperties(api.EventExtendedProperties o) {
   buildCounterEventExtendedProperties++;
   if (buildCounterEventExtendedProperties < 3) {
-    checkUnnamed683(o.private);
-    checkUnnamed684(o.shared);
+    checkUnnamed351(o.private);
+    checkUnnamed352(o.shared);
   }
   buildCounterEventExtendedProperties--;
 }
 
-buildUnnamed685() {
+buildUnnamed353() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed685(core.Map<core.String, core.String> o) {
+checkUnnamed353(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'));
@@ -544,7 +544,7 @@
     o.height = 42;
     o.iconLink = "foo";
     o.link = "foo";
-    o.preferences = buildUnnamed685();
+    o.preferences = buildUnnamed353();
     o.title = "foo";
     o.type = "foo";
     o.width = 42;
@@ -560,7 +560,7 @@
     unittest.expect(o.height, unittest.equals(42));
     unittest.expect(o.iconLink, unittest.equals('foo'));
     unittest.expect(o.link, unittest.equals('foo'));
-    checkUnnamed685(o.preferences);
+    checkUnnamed353(o.preferences);
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.width, unittest.equals(42));
@@ -593,27 +593,27 @@
   buildCounterEventOrganizer--;
 }
 
-buildUnnamed686() {
+buildUnnamed354() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed686(core.List<core.String> o) {
+checkUnnamed354(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed687() {
+buildUnnamed355() {
   var o = new core.List<api.EventReminder>();
   o.add(buildEventReminder());
   o.add(buildEventReminder());
   return o;
 }
 
-checkUnnamed687(core.List<api.EventReminder> o) {
+checkUnnamed355(core.List<api.EventReminder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventReminder(o[0]);
   checkEventReminder(o[1]);
@@ -624,7 +624,7 @@
   var o = new api.EventReminders();
   buildCounterEventReminders++;
   if (buildCounterEventReminders < 3) {
-    o.overrides = buildUnnamed687();
+    o.overrides = buildUnnamed355();
     o.useDefault = true;
   }
   buildCounterEventReminders--;
@@ -634,7 +634,7 @@
 checkEventReminders(api.EventReminders o) {
   buildCounterEventReminders++;
   if (buildCounterEventReminders < 3) {
-    checkUnnamed687(o.overrides);
+    checkUnnamed355(o.overrides);
     unittest.expect(o.useDefault, unittest.isTrue);
   }
   buildCounterEventReminders--;
@@ -667,7 +667,7 @@
   buildCounterEvent++;
   if (buildCounterEvent < 3) {
     o.anyoneCanAddSelf = true;
-    o.attendees = buildUnnamed682();
+    o.attendees = buildUnnamed350();
     o.attendeesOmitted = true;
     o.colorId = "foo";
     o.created = core.DateTime.parse("2002-02-27T14:01:02");
@@ -691,7 +691,7 @@
     o.organizer = buildEventOrganizer();
     o.originalStartTime = buildEventDateTime();
     o.privateCopy = true;
-    o.recurrence = buildUnnamed686();
+    o.recurrence = buildUnnamed354();
     o.recurringEventId = "foo";
     o.reminders = buildEventReminders();
     o.sequence = 42;
@@ -711,7 +711,7 @@
   buildCounterEvent++;
   if (buildCounterEvent < 3) {
     unittest.expect(o.anyoneCanAddSelf, unittest.isTrue);
-    checkUnnamed682(o.attendees);
+    checkUnnamed350(o.attendees);
     unittest.expect(o.attendeesOmitted, unittest.isTrue);
     unittest.expect(o.colorId, unittest.equals('foo'));
     unittest.expect(o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -735,7 +735,7 @@
     checkEventOrganizer(o.organizer);
     checkEventDateTime(o.originalStartTime);
     unittest.expect(o.privateCopy, unittest.isTrue);
-    checkUnnamed686(o.recurrence);
+    checkUnnamed354(o.recurrence);
     unittest.expect(o.recurringEventId, unittest.equals('foo'));
     checkEventReminders(o.reminders);
     unittest.expect(o.sequence, unittest.equals(42));
@@ -750,6 +750,25 @@
   buildCounterEvent--;
 }
 
+core.int buildCounterEventAttachment = 0;
+buildEventAttachment() {
+  var o = new api.EventAttachment();
+  buildCounterEventAttachment++;
+  if (buildCounterEventAttachment < 3) {
+    o.title = "foo";
+  }
+  buildCounterEventAttachment--;
+  return o;
+}
+
+checkEventAttachment(api.EventAttachment o) {
+  buildCounterEventAttachment++;
+  if (buildCounterEventAttachment < 3) {
+    unittest.expect(o.title, unittest.equals('foo'));
+  }
+  buildCounterEventAttachment--;
+}
+
 core.int buildCounterEventAttendee = 0;
 buildEventAttendee() {
   var o = new api.EventAttendee();
@@ -831,27 +850,27 @@
   buildCounterEventReminder--;
 }
 
-buildUnnamed688() {
+buildUnnamed356() {
   var o = new core.List<api.EventReminder>();
   o.add(buildEventReminder());
   o.add(buildEventReminder());
   return o;
 }
 
-checkUnnamed688(core.List<api.EventReminder> o) {
+checkUnnamed356(core.List<api.EventReminder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventReminder(o[0]);
   checkEventReminder(o[1]);
 }
 
-buildUnnamed689() {
+buildUnnamed357() {
   var o = new core.List<api.Event>();
   o.add(buildEvent());
   o.add(buildEvent());
   return o;
 }
 
-checkUnnamed689(core.List<api.Event> o) {
+checkUnnamed357(core.List<api.Event> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEvent(o[0]);
   checkEvent(o[1]);
@@ -863,10 +882,10 @@
   buildCounterEvents++;
   if (buildCounterEvents < 3) {
     o.accessRole = "foo";
-    o.defaultReminders = buildUnnamed688();
+    o.defaultReminders = buildUnnamed356();
     o.description = "foo";
     o.etag = "foo";
-    o.items = buildUnnamed689();
+    o.items = buildUnnamed357();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.nextSyncToken = "foo";
@@ -882,10 +901,10 @@
   buildCounterEvents++;
   if (buildCounterEvents < 3) {
     unittest.expect(o.accessRole, unittest.equals('foo'));
-    checkUnnamed688(o.defaultReminders);
+    checkUnnamed356(o.defaultReminders);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed689(o.items);
+    checkUnnamed357(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.nextSyncToken, unittest.equals('foo'));
@@ -896,27 +915,27 @@
   buildCounterEvents--;
 }
 
-buildUnnamed690() {
+buildUnnamed358() {
   var o = new core.List<api.TimePeriod>();
   o.add(buildTimePeriod());
   o.add(buildTimePeriod());
   return o;
 }
 
-checkUnnamed690(core.List<api.TimePeriod> o) {
+checkUnnamed358(core.List<api.TimePeriod> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTimePeriod(o[0]);
   checkTimePeriod(o[1]);
 }
 
-buildUnnamed691() {
+buildUnnamed359() {
   var o = new core.List<api.Error>();
   o.add(buildError());
   o.add(buildError());
   return o;
 }
 
-checkUnnamed691(core.List<api.Error> o) {
+checkUnnamed359(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkError(o[0]);
   checkError(o[1]);
@@ -927,8 +946,8 @@
   var o = new api.FreeBusyCalendar();
   buildCounterFreeBusyCalendar++;
   if (buildCounterFreeBusyCalendar < 3) {
-    o.busy = buildUnnamed690();
-    o.errors = buildUnnamed691();
+    o.busy = buildUnnamed358();
+    o.errors = buildUnnamed359();
   }
   buildCounterFreeBusyCalendar--;
   return o;
@@ -937,33 +956,33 @@
 checkFreeBusyCalendar(api.FreeBusyCalendar o) {
   buildCounterFreeBusyCalendar++;
   if (buildCounterFreeBusyCalendar < 3) {
-    checkUnnamed690(o.busy);
-    checkUnnamed691(o.errors);
+    checkUnnamed358(o.busy);
+    checkUnnamed359(o.errors);
   }
   buildCounterFreeBusyCalendar--;
 }
 
-buildUnnamed692() {
+buildUnnamed360() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed692(core.List<core.String> o) {
+checkUnnamed360(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed693() {
+buildUnnamed361() {
   var o = new core.List<api.Error>();
   o.add(buildError());
   o.add(buildError());
   return o;
 }
 
-checkUnnamed693(core.List<api.Error> o) {
+checkUnnamed361(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkError(o[0]);
   checkError(o[1]);
@@ -974,8 +993,8 @@
   var o = new api.FreeBusyGroup();
   buildCounterFreeBusyGroup++;
   if (buildCounterFreeBusyGroup < 3) {
-    o.calendars = buildUnnamed692();
-    o.errors = buildUnnamed693();
+    o.calendars = buildUnnamed360();
+    o.errors = buildUnnamed361();
   }
   buildCounterFreeBusyGroup--;
   return o;
@@ -984,20 +1003,20 @@
 checkFreeBusyGroup(api.FreeBusyGroup o) {
   buildCounterFreeBusyGroup++;
   if (buildCounterFreeBusyGroup < 3) {
-    checkUnnamed692(o.calendars);
-    checkUnnamed693(o.errors);
+    checkUnnamed360(o.calendars);
+    checkUnnamed361(o.errors);
   }
   buildCounterFreeBusyGroup--;
 }
 
-buildUnnamed694() {
+buildUnnamed362() {
   var o = new core.List<api.FreeBusyRequestItem>();
   o.add(buildFreeBusyRequestItem());
   o.add(buildFreeBusyRequestItem());
   return o;
 }
 
-checkUnnamed694(core.List<api.FreeBusyRequestItem> o) {
+checkUnnamed362(core.List<api.FreeBusyRequestItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFreeBusyRequestItem(o[0]);
   checkFreeBusyRequestItem(o[1]);
@@ -1010,7 +1029,7 @@
   if (buildCounterFreeBusyRequest < 3) {
     o.calendarExpansionMax = 42;
     o.groupExpansionMax = 42;
-    o.items = buildUnnamed694();
+    o.items = buildUnnamed362();
     o.timeMax = core.DateTime.parse("2002-02-27T14:01:02");
     o.timeMin = core.DateTime.parse("2002-02-27T14:01:02");
     o.timeZone = "foo";
@@ -1024,7 +1043,7 @@
   if (buildCounterFreeBusyRequest < 3) {
     unittest.expect(o.calendarExpansionMax, unittest.equals(42));
     unittest.expect(o.groupExpansionMax, unittest.equals(42));
-    checkUnnamed694(o.items);
+    checkUnnamed362(o.items);
     unittest.expect(o.timeMax, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.timeMin, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.timeZone, unittest.equals('foo'));
@@ -1051,27 +1070,27 @@
   buildCounterFreeBusyRequestItem--;
 }
 
-buildUnnamed695() {
+buildUnnamed363() {
   var o = new core.Map<core.String, api.FreeBusyCalendar>();
   o["x"] = buildFreeBusyCalendar();
   o["y"] = buildFreeBusyCalendar();
   return o;
 }
 
-checkUnnamed695(core.Map<core.String, api.FreeBusyCalendar> o) {
+checkUnnamed363(core.Map<core.String, api.FreeBusyCalendar> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFreeBusyCalendar(o["x"]);
   checkFreeBusyCalendar(o["y"]);
 }
 
-buildUnnamed696() {
+buildUnnamed364() {
   var o = new core.Map<core.String, api.FreeBusyGroup>();
   o["x"] = buildFreeBusyGroup();
   o["y"] = buildFreeBusyGroup();
   return o;
 }
 
-checkUnnamed696(core.Map<core.String, api.FreeBusyGroup> o) {
+checkUnnamed364(core.Map<core.String, api.FreeBusyGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFreeBusyGroup(o["x"]);
   checkFreeBusyGroup(o["y"]);
@@ -1082,8 +1101,8 @@
   var o = new api.FreeBusyResponse();
   buildCounterFreeBusyResponse++;
   if (buildCounterFreeBusyResponse < 3) {
-    o.calendars = buildUnnamed695();
-    o.groups = buildUnnamed696();
+    o.calendars = buildUnnamed363();
+    o.groups = buildUnnamed364();
     o.kind = "foo";
     o.timeMax = core.DateTime.parse("2002-02-27T14:01:02");
     o.timeMin = core.DateTime.parse("2002-02-27T14:01:02");
@@ -1095,8 +1114,8 @@
 checkFreeBusyResponse(api.FreeBusyResponse o) {
   buildCounterFreeBusyResponse++;
   if (buildCounterFreeBusyResponse < 3) {
-    checkUnnamed695(o.calendars);
-    checkUnnamed696(o.groups);
+    checkUnnamed363(o.calendars);
+    checkUnnamed364(o.groups);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.timeMax, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.timeMin, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -1129,14 +1148,14 @@
   buildCounterSetting--;
 }
 
-buildUnnamed697() {
+buildUnnamed365() {
   var o = new core.List<api.Setting>();
   o.add(buildSetting());
   o.add(buildSetting());
   return o;
 }
 
-checkUnnamed697(core.List<api.Setting> o) {
+checkUnnamed365(core.List<api.Setting> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSetting(o[0]);
   checkSetting(o[1]);
@@ -1148,7 +1167,7 @@
   buildCounterSettings++;
   if (buildCounterSettings < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed697();
+    o.items = buildUnnamed365();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.nextSyncToken = "foo";
@@ -1161,7 +1180,7 @@
   buildCounterSettings++;
   if (buildCounterSettings < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed697(o.items);
+    checkUnnamed365(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.nextSyncToken, unittest.equals('foo'));
@@ -1190,53 +1209,53 @@
   buildCounterTimePeriod--;
 }
 
-buildUnnamed698() {
+buildUnnamed366() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed698(core.List<core.String> o) {
+checkUnnamed366(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed699() {
+buildUnnamed367() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed699(core.List<core.String> o) {
+checkUnnamed367(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed700() {
+buildUnnamed368() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed700(core.List<core.String> o) {
+checkUnnamed368(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed701() {
+buildUnnamed369() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed701(core.List<core.String> o) {
+checkUnnamed369(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1415,6 +1434,15 @@
   });
 
 
+  unittest.group("obj-schema-EventAttachment", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildEventAttachment();
+      var od = new api.EventAttachment.fromJson(o.toJson());
+      checkEventAttachment(od);
+    });
+  });
+
+
   unittest.group("obj-schema-EventAttendee", () {
     unittest.test("to-json--from-json", () {
       var o = buildEventAttendee();
@@ -3058,9 +3086,9 @@
       var arg_maxResults = 42;
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
-      var arg_privateExtendedProperty = buildUnnamed698();
+      var arg_privateExtendedProperty = buildUnnamed366();
       var arg_q = "foo";
-      var arg_sharedExtendedProperty = buildUnnamed699();
+      var arg_sharedExtendedProperty = buildUnnamed367();
       var arg_showDeleted = true;
       var arg_showHiddenInvitations = true;
       var arg_singleEvents = true;
@@ -3402,9 +3430,9 @@
       var arg_maxResults = 42;
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
-      var arg_privateExtendedProperty = buildUnnamed700();
+      var arg_privateExtendedProperty = buildUnnamed368();
       var arg_q = "foo";
-      var arg_sharedExtendedProperty = buildUnnamed701();
+      var arg_sharedExtendedProperty = buildUnnamed369();
       var arg_showDeleted = true;
       var arg_showHiddenInvitations = true;
       var arg_singleEvents = true;
diff --git a/generated/googleapis/test/civicinfo/us_v1_test.dart b/generated/googleapis/test/civicinfo/us_v1_test.dart
index 6da838b..eb87924 100644
--- a/generated/googleapis/test/civicinfo/us_v1_test.dart
+++ b/generated/googleapis/test/civicinfo/us_v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed815() {
+buildUnnamed370() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed815(core.List<api.Source> o) {
+checkUnnamed370(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -38,7 +38,7 @@
     o.id = "foo";
     o.localJurisdiction = buildAdministrationRegion();
     o.name = "foo";
-    o.sources = buildUnnamed815();
+    o.sources = buildUnnamed370();
   }
   buildCounterAdministrationRegion--;
   return o;
@@ -51,32 +51,32 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkAdministrationRegion(o.localJurisdiction);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed815(o.sources);
+    checkUnnamed370(o.sources);
   }
   buildCounterAdministrationRegion--;
 }
 
-buildUnnamed816() {
+buildUnnamed371() {
   var o = new core.List<api.ElectionOfficial>();
   o.add(buildElectionOfficial());
   o.add(buildElectionOfficial());
   return o;
 }
 
-checkUnnamed816(core.List<api.ElectionOfficial> o) {
+checkUnnamed371(core.List<api.ElectionOfficial> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElectionOfficial(o[0]);
   checkElectionOfficial(o[1]);
 }
 
-buildUnnamed817() {
+buildUnnamed372() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed817(core.List<core.String> o) {
+checkUnnamed372(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -91,14 +91,14 @@
     o.ballotInfoUrl = "foo";
     o.correspondenceAddress = buildSimpleAddressType();
     o.electionInfoUrl = "foo";
-    o.electionOfficials = buildUnnamed816();
+    o.electionOfficials = buildUnnamed371();
     o.electionRegistrationConfirmationUrl = "foo";
     o.electionRegistrationUrl = "foo";
     o.electionRulesUrl = "foo";
     o.hoursOfOperation = "foo";
     o.name = "foo";
     o.physicalAddress = buildSimpleAddressType();
-    o.voterServices = buildUnnamed817();
+    o.voterServices = buildUnnamed372();
     o.votingLocationFinderUrl = "foo";
   }
   buildCounterAdministrativeBody--;
@@ -112,27 +112,27 @@
     unittest.expect(o.ballotInfoUrl, unittest.equals('foo'));
     checkSimpleAddressType(o.correspondenceAddress);
     unittest.expect(o.electionInfoUrl, unittest.equals('foo'));
-    checkUnnamed816(o.electionOfficials);
+    checkUnnamed371(o.electionOfficials);
     unittest.expect(o.electionRegistrationConfirmationUrl, unittest.equals('foo'));
     unittest.expect(o.electionRegistrationUrl, unittest.equals('foo'));
     unittest.expect(o.electionRulesUrl, unittest.equals('foo'));
     unittest.expect(o.hoursOfOperation, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkSimpleAddressType(o.physicalAddress);
-    checkUnnamed817(o.voterServices);
+    checkUnnamed372(o.voterServices);
     unittest.expect(o.votingLocationFinderUrl, unittest.equals('foo'));
   }
   buildCounterAdministrativeBody--;
 }
 
-buildUnnamed818() {
+buildUnnamed373() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed818(core.List<api.Channel> o) {
+checkUnnamed373(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
@@ -144,7 +144,7 @@
   buildCounterCandidate++;
   if (buildCounterCandidate < 3) {
     o.candidateUrl = "foo";
-    o.channels = buildUnnamed818();
+    o.channels = buildUnnamed373();
     o.email = "foo";
     o.name = "foo";
     o.orderOnBallot = "foo";
@@ -160,7 +160,7 @@
   buildCounterCandidate++;
   if (buildCounterCandidate < 3) {
     unittest.expect(o.candidateUrl, unittest.equals('foo'));
-    checkUnnamed818(o.channels);
+    checkUnnamed373(o.channels);
     unittest.expect(o.email, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.orderOnBallot, unittest.equals('foo'));
@@ -192,27 +192,27 @@
   buildCounterChannel--;
 }
 
-buildUnnamed819() {
+buildUnnamed374() {
   var o = new core.List<api.Candidate>();
   o.add(buildCandidate());
   o.add(buildCandidate());
   return o;
 }
 
-checkUnnamed819(core.List<api.Candidate> o) {
+checkUnnamed374(core.List<api.Candidate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCandidate(o[0]);
   checkCandidate(o[1]);
 }
 
-buildUnnamed820() {
+buildUnnamed375() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed820(core.List<api.Source> o) {
+checkUnnamed375(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -224,7 +224,7 @@
   buildCounterContest++;
   if (buildCounterContest < 3) {
     o.ballotPlacement = "foo";
-    o.candidates = buildUnnamed819();
+    o.candidates = buildUnnamed374();
     o.district = buildElectoralDistrict();
     o.electorateSpecifications = "foo";
     o.id = "foo";
@@ -236,7 +236,7 @@
     o.referendumSubtitle = "foo";
     o.referendumTitle = "foo";
     o.referendumUrl = "foo";
-    o.sources = buildUnnamed820();
+    o.sources = buildUnnamed375();
     o.special = "foo";
     o.type = "foo";
   }
@@ -248,7 +248,7 @@
   buildCounterContest++;
   if (buildCounterContest < 3) {
     unittest.expect(o.ballotPlacement, unittest.equals('foo'));
-    checkUnnamed819(o.candidates);
+    checkUnnamed374(o.candidates);
     checkElectoralDistrict(o.district);
     unittest.expect(o.electorateSpecifications, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -260,21 +260,21 @@
     unittest.expect(o.referendumSubtitle, unittest.equals('foo'));
     unittest.expect(o.referendumTitle, unittest.equals('foo'));
     unittest.expect(o.referendumUrl, unittest.equals('foo'));
-    checkUnnamed820(o.sources);
+    checkUnnamed375(o.sources);
     unittest.expect(o.special, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterContest--;
 }
 
-buildUnnamed821() {
+buildUnnamed376() {
   var o = new core.List<api.DivisionSearchResult>();
   o.add(buildDivisionSearchResult());
   o.add(buildDivisionSearchResult());
   return o;
 }
 
-checkUnnamed821(core.List<api.DivisionSearchResult> o) {
+checkUnnamed376(core.List<api.DivisionSearchResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDivisionSearchResult(o[0]);
   checkDivisionSearchResult(o[1]);
@@ -286,7 +286,7 @@
   buildCounterDivisionSearchResponse++;
   if (buildCounterDivisionSearchResponse < 3) {
     o.kind = "foo";
-    o.results = buildUnnamed821();
+    o.results = buildUnnamed376();
     o.status = "foo";
   }
   buildCounterDivisionSearchResponse--;
@@ -297,20 +297,20 @@
   buildCounterDivisionSearchResponse++;
   if (buildCounterDivisionSearchResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed821(o.results);
+    checkUnnamed376(o.results);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterDivisionSearchResponse--;
 }
 
-buildUnnamed822() {
+buildUnnamed377() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed822(core.List<core.String> o) {
+checkUnnamed377(core.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,7 +321,7 @@
   var o = new api.DivisionSearchResult();
   buildCounterDivisionSearchResult++;
   if (buildCounterDivisionSearchResult < 3) {
-    o.aliases = buildUnnamed822();
+    o.aliases = buildUnnamed377();
     o.name = "foo";
     o.ocdId = "foo";
   }
@@ -332,7 +332,7 @@
 checkDivisionSearchResult(api.DivisionSearchResult o) {
   buildCounterDivisionSearchResult++;
   if (buildCounterDivisionSearchResult < 3) {
-    checkUnnamed822(o.aliases);
+    checkUnnamed377(o.aliases);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.ocdId, unittest.equals('foo'));
   }
@@ -389,14 +389,14 @@
   buildCounterElectionOfficial--;
 }
 
-buildUnnamed823() {
+buildUnnamed378() {
   var o = new core.List<api.Election>();
   o.add(buildElection());
   o.add(buildElection());
   return o;
 }
 
-checkUnnamed823(core.List<api.Election> o) {
+checkUnnamed378(core.List<api.Election> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElection(o[0]);
   checkElection(o[1]);
@@ -407,7 +407,7 @@
   var o = new api.ElectionsQueryResponse();
   buildCounterElectionsQueryResponse++;
   if (buildCounterElectionsQueryResponse < 3) {
-    o.elections = buildUnnamed823();
+    o.elections = buildUnnamed378();
     o.kind = "foo";
   }
   buildCounterElectionsQueryResponse--;
@@ -417,7 +417,7 @@
 checkElectionsQueryResponse(api.ElectionsQueryResponse o) {
   buildCounterElectionsQueryResponse++;
   if (buildCounterElectionsQueryResponse < 3) {
-    checkUnnamed823(o.elections);
+    checkUnnamed378(o.elections);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterElectionsQueryResponse--;
@@ -446,27 +446,27 @@
   buildCounterElectoralDistrict--;
 }
 
-buildUnnamed824() {
+buildUnnamed379() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed824(core.List<core.String> o) {
+checkUnnamed379(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed825() {
+buildUnnamed380() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed825(core.List<core.String> o) {
+checkUnnamed380(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -477,9 +477,9 @@
   var o = new api.GeographicDivision();
   buildCounterGeographicDivision++;
   if (buildCounterGeographicDivision < 3) {
-    o.alsoKnownAs = buildUnnamed824();
+    o.alsoKnownAs = buildUnnamed379();
     o.name = "foo";
-    o.officeIds = buildUnnamed825();
+    o.officeIds = buildUnnamed380();
     o.scope = "foo";
   }
   buildCounterGeographicDivision--;
@@ -489,35 +489,35 @@
 checkGeographicDivision(api.GeographicDivision o) {
   buildCounterGeographicDivision++;
   if (buildCounterGeographicDivision < 3) {
-    checkUnnamed824(o.alsoKnownAs);
+    checkUnnamed379(o.alsoKnownAs);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed825(o.officeIds);
+    checkUnnamed380(o.officeIds);
     unittest.expect(o.scope, unittest.equals('foo'));
   }
   buildCounterGeographicDivision--;
 }
 
-buildUnnamed826() {
+buildUnnamed381() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed826(core.List<core.String> o) {
+checkUnnamed381(core.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() {
+buildUnnamed382() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed827(core.List<api.Source> o) {
+checkUnnamed382(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -531,8 +531,8 @@
     o.divisionId = "foo";
     o.level = "foo";
     o.name = "foo";
-    o.officialIds = buildUnnamed826();
-    o.sources = buildUnnamed827();
+    o.officialIds = buildUnnamed381();
+    o.sources = buildUnnamed382();
   }
   buildCounterOffice--;
   return o;
@@ -544,72 +544,72 @@
     unittest.expect(o.divisionId, unittest.equals('foo'));
     unittest.expect(o.level, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed826(o.officialIds);
-    checkUnnamed827(o.sources);
+    checkUnnamed381(o.officialIds);
+    checkUnnamed382(o.sources);
   }
   buildCounterOffice--;
 }
 
-buildUnnamed828() {
+buildUnnamed383() {
   var o = new core.List<api.SimpleAddressType>();
   o.add(buildSimpleAddressType());
   o.add(buildSimpleAddressType());
   return o;
 }
 
-checkUnnamed828(core.List<api.SimpleAddressType> o) {
+checkUnnamed383(core.List<api.SimpleAddressType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSimpleAddressType(o[0]);
   checkSimpleAddressType(o[1]);
 }
 
-buildUnnamed829() {
+buildUnnamed384() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed829(core.List<api.Channel> o) {
+checkUnnamed384(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
 }
 
-buildUnnamed830() {
+buildUnnamed385() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed830(core.List<core.String> o) {
+checkUnnamed385(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed831() {
+buildUnnamed386() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed831(core.List<core.String> o) {
+checkUnnamed386(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed832() {
+buildUnnamed387() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed832(core.List<core.String> o) {
+checkUnnamed387(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -620,14 +620,14 @@
   var o = new api.Official();
   buildCounterOfficial++;
   if (buildCounterOfficial < 3) {
-    o.address = buildUnnamed828();
-    o.channels = buildUnnamed829();
-    o.emails = buildUnnamed830();
+    o.address = buildUnnamed383();
+    o.channels = buildUnnamed384();
+    o.emails = buildUnnamed385();
     o.name = "foo";
     o.party = "foo";
-    o.phones = buildUnnamed831();
+    o.phones = buildUnnamed386();
     o.photoUrl = "foo";
-    o.urls = buildUnnamed832();
+    o.urls = buildUnnamed387();
   }
   buildCounterOfficial--;
   return o;
@@ -636,26 +636,26 @@
 checkOfficial(api.Official o) {
   buildCounterOfficial++;
   if (buildCounterOfficial < 3) {
-    checkUnnamed828(o.address);
-    checkUnnamed829(o.channels);
-    checkUnnamed830(o.emails);
+    checkUnnamed383(o.address);
+    checkUnnamed384(o.channels);
+    checkUnnamed385(o.emails);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.party, unittest.equals('foo'));
-    checkUnnamed831(o.phones);
+    checkUnnamed386(o.phones);
     unittest.expect(o.photoUrl, unittest.equals('foo'));
-    checkUnnamed832(o.urls);
+    checkUnnamed387(o.urls);
   }
   buildCounterOfficial--;
 }
 
-buildUnnamed833() {
+buildUnnamed388() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed833(core.List<api.Source> o) {
+checkUnnamed388(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -672,7 +672,7 @@
     o.name = "foo";
     o.notes = "foo";
     o.pollingHours = "foo";
-    o.sources = buildUnnamed833();
+    o.sources = buildUnnamed388();
     o.startDate = "foo";
     o.voterServices = "foo";
   }
@@ -689,7 +689,7 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
     unittest.expect(o.pollingHours, unittest.equals('foo'));
-    checkUnnamed833(o.sources);
+    checkUnnamed388(o.sources);
     unittest.expect(o.startDate, unittest.equals('foo'));
     unittest.expect(o.voterServices, unittest.equals('foo'));
   }
@@ -715,40 +715,40 @@
   buildCounterRepresentativeInfoRequest--;
 }
 
-buildUnnamed834() {
+buildUnnamed389() {
   var o = new core.Map<core.String, api.GeographicDivision>();
   o["x"] = buildGeographicDivision();
   o["y"] = buildGeographicDivision();
   return o;
 }
 
-checkUnnamed834(core.Map<core.String, api.GeographicDivision> o) {
+checkUnnamed389(core.Map<core.String, api.GeographicDivision> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeographicDivision(o["x"]);
   checkGeographicDivision(o["y"]);
 }
 
-buildUnnamed835() {
+buildUnnamed390() {
   var o = new core.Map<core.String, api.Office>();
   o["x"] = buildOffice();
   o["y"] = buildOffice();
   return o;
 }
 
-checkUnnamed835(core.Map<core.String, api.Office> o) {
+checkUnnamed390(core.Map<core.String, api.Office> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffice(o["x"]);
   checkOffice(o["y"]);
 }
 
-buildUnnamed836() {
+buildUnnamed391() {
   var o = new core.Map<core.String, api.Official>();
   o["x"] = buildOfficial();
   o["y"] = buildOfficial();
   return o;
 }
 
-checkUnnamed836(core.Map<core.String, api.Official> o) {
+checkUnnamed391(core.Map<core.String, api.Official> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOfficial(o["x"]);
   checkOfficial(o["y"]);
@@ -759,11 +759,11 @@
   var o = new api.RepresentativeInfoResponse();
   buildCounterRepresentativeInfoResponse++;
   if (buildCounterRepresentativeInfoResponse < 3) {
-    o.divisions = buildUnnamed834();
+    o.divisions = buildUnnamed389();
     o.kind = "foo";
     o.normalizedInput = buildSimpleAddressType();
-    o.offices = buildUnnamed835();
-    o.officials = buildUnnamed836();
+    o.offices = buildUnnamed390();
+    o.officials = buildUnnamed391();
     o.status = "foo";
   }
   buildCounterRepresentativeInfoResponse--;
@@ -773,11 +773,11 @@
 checkRepresentativeInfoResponse(api.RepresentativeInfoResponse o) {
   buildCounterRepresentativeInfoResponse++;
   if (buildCounterRepresentativeInfoResponse < 3) {
-    checkUnnamed834(o.divisions);
+    checkUnnamed389(o.divisions);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkSimpleAddressType(o.normalizedInput);
-    checkUnnamed835(o.offices);
-    checkUnnamed836(o.officials);
+    checkUnnamed390(o.offices);
+    checkUnnamed391(o.officials);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterRepresentativeInfoResponse--;
@@ -854,53 +854,66 @@
   buildCounterVoterInfoRequest--;
 }
 
-buildUnnamed837() {
+buildUnnamed392() {
   var o = new core.List<api.Contest>();
   o.add(buildContest());
   o.add(buildContest());
   return o;
 }
 
-checkUnnamed837(core.List<api.Contest> o) {
+checkUnnamed392(core.List<api.Contest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContest(o[0]);
   checkContest(o[1]);
 }
 
-buildUnnamed838() {
+buildUnnamed393() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed838(core.List<api.PollingLocation> o) {
+checkUnnamed393(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed839() {
+buildUnnamed394() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed839(core.List<api.PollingLocation> o) {
+checkUnnamed394(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed840() {
+buildUnnamed395() {
+  var o = new core.List<api.PollingLocation>();
+  o.add(buildPollingLocation());
+  o.add(buildPollingLocation());
+  return o;
+}
+
+checkUnnamed395(core.List<api.PollingLocation> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkPollingLocation(o[0]);
+  checkPollingLocation(o[1]);
+}
+
+buildUnnamed396() {
   var o = new core.List<api.AdministrationRegion>();
   o.add(buildAdministrationRegion());
   o.add(buildAdministrationRegion());
   return o;
 }
 
-checkUnnamed840(core.List<api.AdministrationRegion> o) {
+checkUnnamed396(core.List<api.AdministrationRegion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdministrationRegion(o[0]);
   checkAdministrationRegion(o[1]);
@@ -911,14 +924,15 @@
   var o = new api.VoterInfoResponse();
   buildCounterVoterInfoResponse++;
   if (buildCounterVoterInfoResponse < 3) {
-    o.contests = buildUnnamed837();
-    o.earlyVoteSites = buildUnnamed838();
+    o.contests = buildUnnamed392();
+    o.dropOffLocations = buildUnnamed393();
+    o.earlyVoteSites = buildUnnamed394();
     o.election = buildElection();
     o.kind = "foo";
     o.normalizedInput = buildSimpleAddressType();
-    o.pollingLocations = buildUnnamed839();
+    o.pollingLocations = buildUnnamed395();
     o.precinctId = "foo";
-    o.state = buildUnnamed840();
+    o.state = buildUnnamed396();
     o.status = "foo";
   }
   buildCounterVoterInfoResponse--;
@@ -928,14 +942,15 @@
 checkVoterInfoResponse(api.VoterInfoResponse o) {
   buildCounterVoterInfoResponse++;
   if (buildCounterVoterInfoResponse < 3) {
-    checkUnnamed837(o.contests);
-    checkUnnamed838(o.earlyVoteSites);
+    checkUnnamed392(o.contests);
+    checkUnnamed393(o.dropOffLocations);
+    checkUnnamed394(o.earlyVoteSites);
     checkElection(o.election);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkSimpleAddressType(o.normalizedInput);
-    checkUnnamed839(o.pollingLocations);
+    checkUnnamed395(o.pollingLocations);
     unittest.expect(o.precinctId, unittest.equals('foo'));
-    checkUnnamed840(o.state);
+    checkUnnamed396(o.state);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterVoterInfoResponse--;
diff --git a/generated/googleapis/test/civicinfo/v1_test.dart b/generated/googleapis/test/civicinfo/v1_test.dart
index 3eca67c..609c240 100644
--- a/generated/googleapis/test/civicinfo/v1_test.dart
+++ b/generated/googleapis/test/civicinfo/v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed65() {
+buildUnnamed397() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed65(core.List<api.Source> o) {
+checkUnnamed397(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -38,7 +38,7 @@
     o.id = "foo";
     o.localJurisdiction = buildAdministrationRegion();
     o.name = "foo";
-    o.sources = buildUnnamed65();
+    o.sources = buildUnnamed397();
   }
   buildCounterAdministrationRegion--;
   return o;
@@ -51,32 +51,32 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkAdministrationRegion(o.localJurisdiction);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed65(o.sources);
+    checkUnnamed397(o.sources);
   }
   buildCounterAdministrationRegion--;
 }
 
-buildUnnamed66() {
+buildUnnamed398() {
   var o = new core.List<api.ElectionOfficial>();
   o.add(buildElectionOfficial());
   o.add(buildElectionOfficial());
   return o;
 }
 
-checkUnnamed66(core.List<api.ElectionOfficial> o) {
+checkUnnamed398(core.List<api.ElectionOfficial> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElectionOfficial(o[0]);
   checkElectionOfficial(o[1]);
 }
 
-buildUnnamed67() {
+buildUnnamed399() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed67(core.List<core.String> o) {
+checkUnnamed399(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -91,14 +91,14 @@
     o.ballotInfoUrl = "foo";
     o.correspondenceAddress = buildSimpleAddressType();
     o.electionInfoUrl = "foo";
-    o.electionOfficials = buildUnnamed66();
+    o.electionOfficials = buildUnnamed398();
     o.electionRegistrationConfirmationUrl = "foo";
     o.electionRegistrationUrl = "foo";
     o.electionRulesUrl = "foo";
     o.hoursOfOperation = "foo";
     o.name = "foo";
     o.physicalAddress = buildSimpleAddressType();
-    o.voterServices = buildUnnamed67();
+    o.voterServices = buildUnnamed399();
     o.votingLocationFinderUrl = "foo";
   }
   buildCounterAdministrativeBody--;
@@ -112,27 +112,27 @@
     unittest.expect(o.ballotInfoUrl, unittest.equals('foo'));
     checkSimpleAddressType(o.correspondenceAddress);
     unittest.expect(o.electionInfoUrl, unittest.equals('foo'));
-    checkUnnamed66(o.electionOfficials);
+    checkUnnamed398(o.electionOfficials);
     unittest.expect(o.electionRegistrationConfirmationUrl, unittest.equals('foo'));
     unittest.expect(o.electionRegistrationUrl, unittest.equals('foo'));
     unittest.expect(o.electionRulesUrl, unittest.equals('foo'));
     unittest.expect(o.hoursOfOperation, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkSimpleAddressType(o.physicalAddress);
-    checkUnnamed67(o.voterServices);
+    checkUnnamed399(o.voterServices);
     unittest.expect(o.votingLocationFinderUrl, unittest.equals('foo'));
   }
   buildCounterAdministrativeBody--;
 }
 
-buildUnnamed68() {
+buildUnnamed400() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed68(core.List<api.Channel> o) {
+checkUnnamed400(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
@@ -144,7 +144,7 @@
   buildCounterCandidate++;
   if (buildCounterCandidate < 3) {
     o.candidateUrl = "foo";
-    o.channels = buildUnnamed68();
+    o.channels = buildUnnamed400();
     o.email = "foo";
     o.name = "foo";
     o.orderOnBallot = "foo";
@@ -160,7 +160,7 @@
   buildCounterCandidate++;
   if (buildCounterCandidate < 3) {
     unittest.expect(o.candidateUrl, unittest.equals('foo'));
-    checkUnnamed68(o.channels);
+    checkUnnamed400(o.channels);
     unittest.expect(o.email, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.orderOnBallot, unittest.equals('foo'));
@@ -192,27 +192,27 @@
   buildCounterChannel--;
 }
 
-buildUnnamed69() {
+buildUnnamed401() {
   var o = new core.List<api.Candidate>();
   o.add(buildCandidate());
   o.add(buildCandidate());
   return o;
 }
 
-checkUnnamed69(core.List<api.Candidate> o) {
+checkUnnamed401(core.List<api.Candidate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCandidate(o[0]);
   checkCandidate(o[1]);
 }
 
-buildUnnamed70() {
+buildUnnamed402() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed70(core.List<api.Source> o) {
+checkUnnamed402(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -224,7 +224,7 @@
   buildCounterContest++;
   if (buildCounterContest < 3) {
     o.ballotPlacement = "foo";
-    o.candidates = buildUnnamed69();
+    o.candidates = buildUnnamed401();
     o.district = buildElectoralDistrict();
     o.electorateSpecifications = "foo";
     o.id = "foo";
@@ -236,7 +236,7 @@
     o.referendumSubtitle = "foo";
     o.referendumTitle = "foo";
     o.referendumUrl = "foo";
-    o.sources = buildUnnamed70();
+    o.sources = buildUnnamed402();
     o.special = "foo";
     o.type = "foo";
   }
@@ -248,7 +248,7 @@
   buildCounterContest++;
   if (buildCounterContest < 3) {
     unittest.expect(o.ballotPlacement, unittest.equals('foo'));
-    checkUnnamed69(o.candidates);
+    checkUnnamed401(o.candidates);
     checkElectoralDistrict(o.district);
     unittest.expect(o.electorateSpecifications, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -260,21 +260,21 @@
     unittest.expect(o.referendumSubtitle, unittest.equals('foo'));
     unittest.expect(o.referendumTitle, unittest.equals('foo'));
     unittest.expect(o.referendumUrl, unittest.equals('foo'));
-    checkUnnamed70(o.sources);
+    checkUnnamed402(o.sources);
     unittest.expect(o.special, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterContest--;
 }
 
-buildUnnamed71() {
+buildUnnamed403() {
   var o = new core.List<api.DivisionSearchResult>();
   o.add(buildDivisionSearchResult());
   o.add(buildDivisionSearchResult());
   return o;
 }
 
-checkUnnamed71(core.List<api.DivisionSearchResult> o) {
+checkUnnamed403(core.List<api.DivisionSearchResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDivisionSearchResult(o[0]);
   checkDivisionSearchResult(o[1]);
@@ -286,7 +286,7 @@
   buildCounterDivisionSearchResponse++;
   if (buildCounterDivisionSearchResponse < 3) {
     o.kind = "foo";
-    o.results = buildUnnamed71();
+    o.results = buildUnnamed403();
     o.status = "foo";
   }
   buildCounterDivisionSearchResponse--;
@@ -297,20 +297,20 @@
   buildCounterDivisionSearchResponse++;
   if (buildCounterDivisionSearchResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed71(o.results);
+    checkUnnamed403(o.results);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterDivisionSearchResponse--;
 }
 
-buildUnnamed72() {
+buildUnnamed404() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed72(core.List<core.String> o) {
+checkUnnamed404(core.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,7 +321,7 @@
   var o = new api.DivisionSearchResult();
   buildCounterDivisionSearchResult++;
   if (buildCounterDivisionSearchResult < 3) {
-    o.aliases = buildUnnamed72();
+    o.aliases = buildUnnamed404();
     o.name = "foo";
     o.ocdId = "foo";
   }
@@ -332,7 +332,7 @@
 checkDivisionSearchResult(api.DivisionSearchResult o) {
   buildCounterDivisionSearchResult++;
   if (buildCounterDivisionSearchResult < 3) {
-    checkUnnamed72(o.aliases);
+    checkUnnamed404(o.aliases);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.ocdId, unittest.equals('foo'));
   }
@@ -389,14 +389,14 @@
   buildCounterElectionOfficial--;
 }
 
-buildUnnamed73() {
+buildUnnamed405() {
   var o = new core.List<api.Election>();
   o.add(buildElection());
   o.add(buildElection());
   return o;
 }
 
-checkUnnamed73(core.List<api.Election> o) {
+checkUnnamed405(core.List<api.Election> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElection(o[0]);
   checkElection(o[1]);
@@ -407,7 +407,7 @@
   var o = new api.ElectionsQueryResponse();
   buildCounterElectionsQueryResponse++;
   if (buildCounterElectionsQueryResponse < 3) {
-    o.elections = buildUnnamed73();
+    o.elections = buildUnnamed405();
     o.kind = "foo";
   }
   buildCounterElectionsQueryResponse--;
@@ -417,7 +417,7 @@
 checkElectionsQueryResponse(api.ElectionsQueryResponse o) {
   buildCounterElectionsQueryResponse++;
   if (buildCounterElectionsQueryResponse < 3) {
-    checkUnnamed73(o.elections);
+    checkUnnamed405(o.elections);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterElectionsQueryResponse--;
@@ -446,27 +446,27 @@
   buildCounterElectoralDistrict--;
 }
 
-buildUnnamed74() {
+buildUnnamed406() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed74(core.List<core.String> o) {
+checkUnnamed406(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed75() {
+buildUnnamed407() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed75(core.List<core.String> o) {
+checkUnnamed407(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -477,9 +477,9 @@
   var o = new api.GeographicDivision();
   buildCounterGeographicDivision++;
   if (buildCounterGeographicDivision < 3) {
-    o.alsoKnownAs = buildUnnamed74();
+    o.alsoKnownAs = buildUnnamed406();
     o.name = "foo";
-    o.officeIds = buildUnnamed75();
+    o.officeIds = buildUnnamed407();
     o.scope = "foo";
   }
   buildCounterGeographicDivision--;
@@ -489,35 +489,35 @@
 checkGeographicDivision(api.GeographicDivision o) {
   buildCounterGeographicDivision++;
   if (buildCounterGeographicDivision < 3) {
-    checkUnnamed74(o.alsoKnownAs);
+    checkUnnamed406(o.alsoKnownAs);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed75(o.officeIds);
+    checkUnnamed407(o.officeIds);
     unittest.expect(o.scope, unittest.equals('foo'));
   }
   buildCounterGeographicDivision--;
 }
 
-buildUnnamed76() {
+buildUnnamed408() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed76(core.List<core.String> o) {
+checkUnnamed408(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed77() {
+buildUnnamed409() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed77(core.List<api.Source> o) {
+checkUnnamed409(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -531,8 +531,8 @@
     o.divisionId = "foo";
     o.level = "foo";
     o.name = "foo";
-    o.officialIds = buildUnnamed76();
-    o.sources = buildUnnamed77();
+    o.officialIds = buildUnnamed408();
+    o.sources = buildUnnamed409();
   }
   buildCounterOffice--;
   return o;
@@ -544,72 +544,72 @@
     unittest.expect(o.divisionId, unittest.equals('foo'));
     unittest.expect(o.level, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed76(o.officialIds);
-    checkUnnamed77(o.sources);
+    checkUnnamed408(o.officialIds);
+    checkUnnamed409(o.sources);
   }
   buildCounterOffice--;
 }
 
-buildUnnamed78() {
+buildUnnamed410() {
   var o = new core.List<api.SimpleAddressType>();
   o.add(buildSimpleAddressType());
   o.add(buildSimpleAddressType());
   return o;
 }
 
-checkUnnamed78(core.List<api.SimpleAddressType> o) {
+checkUnnamed410(core.List<api.SimpleAddressType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSimpleAddressType(o[0]);
   checkSimpleAddressType(o[1]);
 }
 
-buildUnnamed79() {
+buildUnnamed411() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed79(core.List<api.Channel> o) {
+checkUnnamed411(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
 }
 
-buildUnnamed80() {
+buildUnnamed412() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed80(core.List<core.String> o) {
+checkUnnamed412(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed81() {
+buildUnnamed413() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed81(core.List<core.String> o) {
+checkUnnamed413(core.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() {
+buildUnnamed414() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed82(core.List<core.String> o) {
+checkUnnamed414(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -620,14 +620,14 @@
   var o = new api.Official();
   buildCounterOfficial++;
   if (buildCounterOfficial < 3) {
-    o.address = buildUnnamed78();
-    o.channels = buildUnnamed79();
-    o.emails = buildUnnamed80();
+    o.address = buildUnnamed410();
+    o.channels = buildUnnamed411();
+    o.emails = buildUnnamed412();
     o.name = "foo";
     o.party = "foo";
-    o.phones = buildUnnamed81();
+    o.phones = buildUnnamed413();
     o.photoUrl = "foo";
-    o.urls = buildUnnamed82();
+    o.urls = buildUnnamed414();
   }
   buildCounterOfficial--;
   return o;
@@ -636,26 +636,26 @@
 checkOfficial(api.Official o) {
   buildCounterOfficial++;
   if (buildCounterOfficial < 3) {
-    checkUnnamed78(o.address);
-    checkUnnamed79(o.channels);
-    checkUnnamed80(o.emails);
+    checkUnnamed410(o.address);
+    checkUnnamed411(o.channels);
+    checkUnnamed412(o.emails);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.party, unittest.equals('foo'));
-    checkUnnamed81(o.phones);
+    checkUnnamed413(o.phones);
     unittest.expect(o.photoUrl, unittest.equals('foo'));
-    checkUnnamed82(o.urls);
+    checkUnnamed414(o.urls);
   }
   buildCounterOfficial--;
 }
 
-buildUnnamed83() {
+buildUnnamed415() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed83(core.List<api.Source> o) {
+checkUnnamed415(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -672,7 +672,7 @@
     o.name = "foo";
     o.notes = "foo";
     o.pollingHours = "foo";
-    o.sources = buildUnnamed83();
+    o.sources = buildUnnamed415();
     o.startDate = "foo";
     o.voterServices = "foo";
   }
@@ -689,7 +689,7 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
     unittest.expect(o.pollingHours, unittest.equals('foo'));
-    checkUnnamed83(o.sources);
+    checkUnnamed415(o.sources);
     unittest.expect(o.startDate, unittest.equals('foo'));
     unittest.expect(o.voterServices, unittest.equals('foo'));
   }
@@ -715,40 +715,40 @@
   buildCounterRepresentativeInfoRequest--;
 }
 
-buildUnnamed84() {
+buildUnnamed416() {
   var o = new core.Map<core.String, api.GeographicDivision>();
   o["x"] = buildGeographicDivision();
   o["y"] = buildGeographicDivision();
   return o;
 }
 
-checkUnnamed84(core.Map<core.String, api.GeographicDivision> o) {
+checkUnnamed416(core.Map<core.String, api.GeographicDivision> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeographicDivision(o["x"]);
   checkGeographicDivision(o["y"]);
 }
 
-buildUnnamed85() {
+buildUnnamed417() {
   var o = new core.Map<core.String, api.Office>();
   o["x"] = buildOffice();
   o["y"] = buildOffice();
   return o;
 }
 
-checkUnnamed85(core.Map<core.String, api.Office> o) {
+checkUnnamed417(core.Map<core.String, api.Office> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffice(o["x"]);
   checkOffice(o["y"]);
 }
 
-buildUnnamed86() {
+buildUnnamed418() {
   var o = new core.Map<core.String, api.Official>();
   o["x"] = buildOfficial();
   o["y"] = buildOfficial();
   return o;
 }
 
-checkUnnamed86(core.Map<core.String, api.Official> o) {
+checkUnnamed418(core.Map<core.String, api.Official> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOfficial(o["x"]);
   checkOfficial(o["y"]);
@@ -759,11 +759,11 @@
   var o = new api.RepresentativeInfoResponse();
   buildCounterRepresentativeInfoResponse++;
   if (buildCounterRepresentativeInfoResponse < 3) {
-    o.divisions = buildUnnamed84();
+    o.divisions = buildUnnamed416();
     o.kind = "foo";
     o.normalizedInput = buildSimpleAddressType();
-    o.offices = buildUnnamed85();
-    o.officials = buildUnnamed86();
+    o.offices = buildUnnamed417();
+    o.officials = buildUnnamed418();
     o.status = "foo";
   }
   buildCounterRepresentativeInfoResponse--;
@@ -773,11 +773,11 @@
 checkRepresentativeInfoResponse(api.RepresentativeInfoResponse o) {
   buildCounterRepresentativeInfoResponse++;
   if (buildCounterRepresentativeInfoResponse < 3) {
-    checkUnnamed84(o.divisions);
+    checkUnnamed416(o.divisions);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkSimpleAddressType(o.normalizedInput);
-    checkUnnamed85(o.offices);
-    checkUnnamed86(o.officials);
+    checkUnnamed417(o.offices);
+    checkUnnamed418(o.officials);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterRepresentativeInfoResponse--;
@@ -854,53 +854,66 @@
   buildCounterVoterInfoRequest--;
 }
 
-buildUnnamed87() {
+buildUnnamed419() {
   var o = new core.List<api.Contest>();
   o.add(buildContest());
   o.add(buildContest());
   return o;
 }
 
-checkUnnamed87(core.List<api.Contest> o) {
+checkUnnamed419(core.List<api.Contest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContest(o[0]);
   checkContest(o[1]);
 }
 
-buildUnnamed88() {
+buildUnnamed420() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed88(core.List<api.PollingLocation> o) {
+checkUnnamed420(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed89() {
+buildUnnamed421() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed89(core.List<api.PollingLocation> o) {
+checkUnnamed421(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed90() {
+buildUnnamed422() {
+  var o = new core.List<api.PollingLocation>();
+  o.add(buildPollingLocation());
+  o.add(buildPollingLocation());
+  return o;
+}
+
+checkUnnamed422(core.List<api.PollingLocation> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkPollingLocation(o[0]);
+  checkPollingLocation(o[1]);
+}
+
+buildUnnamed423() {
   var o = new core.List<api.AdministrationRegion>();
   o.add(buildAdministrationRegion());
   o.add(buildAdministrationRegion());
   return o;
 }
 
-checkUnnamed90(core.List<api.AdministrationRegion> o) {
+checkUnnamed423(core.List<api.AdministrationRegion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdministrationRegion(o[0]);
   checkAdministrationRegion(o[1]);
@@ -911,14 +924,15 @@
   var o = new api.VoterInfoResponse();
   buildCounterVoterInfoResponse++;
   if (buildCounterVoterInfoResponse < 3) {
-    o.contests = buildUnnamed87();
-    o.earlyVoteSites = buildUnnamed88();
+    o.contests = buildUnnamed419();
+    o.dropOffLocations = buildUnnamed420();
+    o.earlyVoteSites = buildUnnamed421();
     o.election = buildElection();
     o.kind = "foo";
     o.normalizedInput = buildSimpleAddressType();
-    o.pollingLocations = buildUnnamed89();
+    o.pollingLocations = buildUnnamed422();
     o.precinctId = "foo";
-    o.state = buildUnnamed90();
+    o.state = buildUnnamed423();
     o.status = "foo";
   }
   buildCounterVoterInfoResponse--;
@@ -928,14 +942,15 @@
 checkVoterInfoResponse(api.VoterInfoResponse o) {
   buildCounterVoterInfoResponse++;
   if (buildCounterVoterInfoResponse < 3) {
-    checkUnnamed87(o.contests);
-    checkUnnamed88(o.earlyVoteSites);
+    checkUnnamed419(o.contests);
+    checkUnnamed420(o.dropOffLocations);
+    checkUnnamed421(o.earlyVoteSites);
     checkElection(o.election);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkSimpleAddressType(o.normalizedInput);
-    checkUnnamed89(o.pollingLocations);
+    checkUnnamed422(o.pollingLocations);
     unittest.expect(o.precinctId, unittest.equals('foo'));
-    checkUnnamed90(o.state);
+    checkUnnamed423(o.state);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterVoterInfoResponse--;
diff --git a/generated/googleapis/test/civicinfo/v2_test.dart b/generated/googleapis/test/civicinfo/v2_test.dart
index 735c213..0dd4b12 100644
--- a/generated/googleapis/test/civicinfo/v2_test.dart
+++ b/generated/googleapis/test/civicinfo/v2_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed981() {
+buildUnnamed424() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed981(core.List<api.Source> o) {
+checkUnnamed424(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -38,7 +38,7 @@
     o.id = "foo";
     o.localJurisdiction = buildAdministrationRegion();
     o.name = "foo";
-    o.sources = buildUnnamed981();
+    o.sources = buildUnnamed424();
   }
   buildCounterAdministrationRegion--;
   return o;
@@ -51,32 +51,32 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkAdministrationRegion(o.localJurisdiction);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed981(o.sources);
+    checkUnnamed424(o.sources);
   }
   buildCounterAdministrationRegion--;
 }
 
-buildUnnamed982() {
+buildUnnamed425() {
   var o = new core.List<api.ElectionOfficial>();
   o.add(buildElectionOfficial());
   o.add(buildElectionOfficial());
   return o;
 }
 
-checkUnnamed982(core.List<api.ElectionOfficial> o) {
+checkUnnamed425(core.List<api.ElectionOfficial> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElectionOfficial(o[0]);
   checkElectionOfficial(o[1]);
 }
 
-buildUnnamed983() {
+buildUnnamed426() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed983(core.List<core.String> o) {
+checkUnnamed426(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -91,14 +91,14 @@
     o.ballotInfoUrl = "foo";
     o.correspondenceAddress = buildSimpleAddressType();
     o.electionInfoUrl = "foo";
-    o.electionOfficials = buildUnnamed982();
+    o.electionOfficials = buildUnnamed425();
     o.electionRegistrationConfirmationUrl = "foo";
     o.electionRegistrationUrl = "foo";
     o.electionRulesUrl = "foo";
     o.hoursOfOperation = "foo";
     o.name = "foo";
     o.physicalAddress = buildSimpleAddressType();
-    o.voterServices = buildUnnamed983();
+    o.voterServices = buildUnnamed426();
     o.votingLocationFinderUrl = "foo";
   }
   buildCounterAdministrativeBody--;
@@ -112,27 +112,27 @@
     unittest.expect(o.ballotInfoUrl, unittest.equals('foo'));
     checkSimpleAddressType(o.correspondenceAddress);
     unittest.expect(o.electionInfoUrl, unittest.equals('foo'));
-    checkUnnamed982(o.electionOfficials);
+    checkUnnamed425(o.electionOfficials);
     unittest.expect(o.electionRegistrationConfirmationUrl, unittest.equals('foo'));
     unittest.expect(o.electionRegistrationUrl, unittest.equals('foo'));
     unittest.expect(o.electionRulesUrl, unittest.equals('foo'));
     unittest.expect(o.hoursOfOperation, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkSimpleAddressType(o.physicalAddress);
-    checkUnnamed983(o.voterServices);
+    checkUnnamed426(o.voterServices);
     unittest.expect(o.votingLocationFinderUrl, unittest.equals('foo'));
   }
   buildCounterAdministrativeBody--;
 }
 
-buildUnnamed984() {
+buildUnnamed427() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed984(core.List<api.Channel> o) {
+checkUnnamed427(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
@@ -144,7 +144,7 @@
   buildCounterCandidate++;
   if (buildCounterCandidate < 3) {
     o.candidateUrl = "foo";
-    o.channels = buildUnnamed984();
+    o.channels = buildUnnamed427();
     o.email = "foo";
     o.name = "foo";
     o.orderOnBallot = "foo";
@@ -160,7 +160,7 @@
   buildCounterCandidate++;
   if (buildCounterCandidate < 3) {
     unittest.expect(o.candidateUrl, unittest.equals('foo'));
-    checkUnnamed984(o.channels);
+    checkUnnamed427(o.channels);
     unittest.expect(o.email, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.orderOnBallot, unittest.equals('foo'));
@@ -192,53 +192,53 @@
   buildCounterChannel--;
 }
 
-buildUnnamed985() {
+buildUnnamed428() {
   var o = new core.List<api.Candidate>();
   o.add(buildCandidate());
   o.add(buildCandidate());
   return o;
 }
 
-checkUnnamed985(core.List<api.Candidate> o) {
+checkUnnamed428(core.List<api.Candidate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCandidate(o[0]);
   checkCandidate(o[1]);
 }
 
-buildUnnamed986() {
+buildUnnamed429() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed986(core.List<core.String> o) {
+checkUnnamed429(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed987() {
+buildUnnamed430() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed987(core.List<core.String> o) {
+checkUnnamed430(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed988() {
+buildUnnamed431() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed988(core.List<api.Source> o) {
+checkUnnamed431(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -250,11 +250,11 @@
   buildCounterContest++;
   if (buildCounterContest < 3) {
     o.ballotPlacement = "foo";
-    o.candidates = buildUnnamed985();
+    o.candidates = buildUnnamed428();
     o.district = buildElectoralDistrict();
     o.electorateSpecifications = "foo";
     o.id = "foo";
-    o.level = buildUnnamed986();
+    o.level = buildUnnamed429();
     o.numberElected = "foo";
     o.numberVotingFor = "foo";
     o.office = "foo";
@@ -262,8 +262,8 @@
     o.referendumSubtitle = "foo";
     o.referendumTitle = "foo";
     o.referendumUrl = "foo";
-    o.roles = buildUnnamed987();
-    o.sources = buildUnnamed988();
+    o.roles = buildUnnamed430();
+    o.sources = buildUnnamed431();
     o.special = "foo";
     o.type = "foo";
   }
@@ -275,11 +275,11 @@
   buildCounterContest++;
   if (buildCounterContest < 3) {
     unittest.expect(o.ballotPlacement, unittest.equals('foo'));
-    checkUnnamed985(o.candidates);
+    checkUnnamed428(o.candidates);
     checkElectoralDistrict(o.district);
     unittest.expect(o.electorateSpecifications, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed986(o.level);
+    checkUnnamed429(o.level);
     unittest.expect(o.numberElected, unittest.equals('foo'));
     unittest.expect(o.numberVotingFor, unittest.equals('foo'));
     unittest.expect(o.office, unittest.equals('foo'));
@@ -287,22 +287,22 @@
     unittest.expect(o.referendumSubtitle, unittest.equals('foo'));
     unittest.expect(o.referendumTitle, unittest.equals('foo'));
     unittest.expect(o.referendumUrl, unittest.equals('foo'));
-    checkUnnamed987(o.roles);
-    checkUnnamed988(o.sources);
+    checkUnnamed430(o.roles);
+    checkUnnamed431(o.sources);
     unittest.expect(o.special, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterContest--;
 }
 
-buildUnnamed989() {
+buildUnnamed432() {
   var o = new core.List<api.DivisionSearchResult>();
   o.add(buildDivisionSearchResult());
   o.add(buildDivisionSearchResult());
   return o;
 }
 
-checkUnnamed989(core.List<api.DivisionSearchResult> o) {
+checkUnnamed432(core.List<api.DivisionSearchResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDivisionSearchResult(o[0]);
   checkDivisionSearchResult(o[1]);
@@ -314,7 +314,7 @@
   buildCounterDivisionSearchResponse++;
   if (buildCounterDivisionSearchResponse < 3) {
     o.kind = "foo";
-    o.results = buildUnnamed989();
+    o.results = buildUnnamed432();
   }
   buildCounterDivisionSearchResponse--;
   return o;
@@ -324,19 +324,19 @@
   buildCounterDivisionSearchResponse++;
   if (buildCounterDivisionSearchResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed989(o.results);
+    checkUnnamed432(o.results);
   }
   buildCounterDivisionSearchResponse--;
 }
 
-buildUnnamed990() {
+buildUnnamed433() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed990(core.List<core.String> o) {
+checkUnnamed433(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -347,7 +347,7 @@
   var o = new api.DivisionSearchResult();
   buildCounterDivisionSearchResult++;
   if (buildCounterDivisionSearchResult < 3) {
-    o.aliases = buildUnnamed990();
+    o.aliases = buildUnnamed433();
     o.name = "foo";
     o.ocdId = "foo";
   }
@@ -358,7 +358,7 @@
 checkDivisionSearchResult(api.DivisionSearchResult o) {
   buildCounterDivisionSearchResult++;
   if (buildCounterDivisionSearchResult < 3) {
-    checkUnnamed990(o.aliases);
+    checkUnnamed433(o.aliases);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.ocdId, unittest.equals('foo'));
   }
@@ -415,14 +415,14 @@
   buildCounterElectionOfficial--;
 }
 
-buildUnnamed991() {
+buildUnnamed434() {
   var o = new core.List<api.Election>();
   o.add(buildElection());
   o.add(buildElection());
   return o;
 }
 
-checkUnnamed991(core.List<api.Election> o) {
+checkUnnamed434(core.List<api.Election> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElection(o[0]);
   checkElection(o[1]);
@@ -433,7 +433,7 @@
   var o = new api.ElectionsQueryResponse();
   buildCounterElectionsQueryResponse++;
   if (buildCounterElectionsQueryResponse < 3) {
-    o.elections = buildUnnamed991();
+    o.elections = buildUnnamed434();
     o.kind = "foo";
   }
   buildCounterElectionsQueryResponse--;
@@ -443,7 +443,7 @@
 checkElectionsQueryResponse(api.ElectionsQueryResponse o) {
   buildCounterElectionsQueryResponse++;
   if (buildCounterElectionsQueryResponse < 3) {
-    checkUnnamed991(o.elections);
+    checkUnnamed434(o.elections);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterElectionsQueryResponse--;
@@ -472,27 +472,27 @@
   buildCounterElectoralDistrict--;
 }
 
-buildUnnamed992() {
+buildUnnamed435() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed992(core.List<core.String> o) {
+checkUnnamed435(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed993() {
+buildUnnamed436() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed993(core.List<core.int> o) {
+checkUnnamed436(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));
@@ -503,9 +503,9 @@
   var o = new api.GeographicDivision();
   buildCounterGeographicDivision++;
   if (buildCounterGeographicDivision < 3) {
-    o.alsoKnownAs = buildUnnamed992();
+    o.alsoKnownAs = buildUnnamed435();
     o.name = "foo";
-    o.officeIndices = buildUnnamed993();
+    o.officeIndices = buildUnnamed436();
   }
   buildCounterGeographicDivision--;
   return o;
@@ -514,60 +514,60 @@
 checkGeographicDivision(api.GeographicDivision o) {
   buildCounterGeographicDivision++;
   if (buildCounterGeographicDivision < 3) {
-    checkUnnamed992(o.alsoKnownAs);
+    checkUnnamed435(o.alsoKnownAs);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed993(o.officeIndices);
+    checkUnnamed436(o.officeIndices);
   }
   buildCounterGeographicDivision--;
 }
 
-buildUnnamed994() {
+buildUnnamed437() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed994(core.List<core.String> o) {
+checkUnnamed437(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed995() {
+buildUnnamed438() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed995(core.List<core.int> o) {
+checkUnnamed438(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));
 }
 
-buildUnnamed996() {
+buildUnnamed439() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed996(core.List<core.String> o) {
+checkUnnamed439(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed997() {
+buildUnnamed440() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed997(core.List<api.Source> o) {
+checkUnnamed440(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -579,11 +579,11 @@
   buildCounterOffice++;
   if (buildCounterOffice < 3) {
     o.divisionId = "foo";
-    o.levels = buildUnnamed994();
+    o.levels = buildUnnamed437();
     o.name = "foo";
-    o.officialIndices = buildUnnamed995();
-    o.roles = buildUnnamed996();
-    o.sources = buildUnnamed997();
+    o.officialIndices = buildUnnamed438();
+    o.roles = buildUnnamed439();
+    o.sources = buildUnnamed440();
   }
   buildCounterOffice--;
   return o;
@@ -593,75 +593,75 @@
   buildCounterOffice++;
   if (buildCounterOffice < 3) {
     unittest.expect(o.divisionId, unittest.equals('foo'));
-    checkUnnamed994(o.levels);
+    checkUnnamed437(o.levels);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed995(o.officialIndices);
-    checkUnnamed996(o.roles);
-    checkUnnamed997(o.sources);
+    checkUnnamed438(o.officialIndices);
+    checkUnnamed439(o.roles);
+    checkUnnamed440(o.sources);
   }
   buildCounterOffice--;
 }
 
-buildUnnamed998() {
+buildUnnamed441() {
   var o = new core.List<api.SimpleAddressType>();
   o.add(buildSimpleAddressType());
   o.add(buildSimpleAddressType());
   return o;
 }
 
-checkUnnamed998(core.List<api.SimpleAddressType> o) {
+checkUnnamed441(core.List<api.SimpleAddressType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSimpleAddressType(o[0]);
   checkSimpleAddressType(o[1]);
 }
 
-buildUnnamed999() {
+buildUnnamed442() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed999(core.List<api.Channel> o) {
+checkUnnamed442(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
 }
 
-buildUnnamed1000() {
+buildUnnamed443() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1000(core.List<core.String> o) {
+checkUnnamed443(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1001() {
+buildUnnamed444() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1001(core.List<core.String> o) {
+checkUnnamed444(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1002() {
+buildUnnamed445() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1002(core.List<core.String> o) {
+checkUnnamed445(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -672,14 +672,14 @@
   var o = new api.Official();
   buildCounterOfficial++;
   if (buildCounterOfficial < 3) {
-    o.address = buildUnnamed998();
-    o.channels = buildUnnamed999();
-    o.emails = buildUnnamed1000();
+    o.address = buildUnnamed441();
+    o.channels = buildUnnamed442();
+    o.emails = buildUnnamed443();
     o.name = "foo";
     o.party = "foo";
-    o.phones = buildUnnamed1001();
+    o.phones = buildUnnamed444();
     o.photoUrl = "foo";
-    o.urls = buildUnnamed1002();
+    o.urls = buildUnnamed445();
   }
   buildCounterOfficial--;
   return o;
@@ -688,26 +688,26 @@
 checkOfficial(api.Official o) {
   buildCounterOfficial++;
   if (buildCounterOfficial < 3) {
-    checkUnnamed998(o.address);
-    checkUnnamed999(o.channels);
-    checkUnnamed1000(o.emails);
+    checkUnnamed441(o.address);
+    checkUnnamed442(o.channels);
+    checkUnnamed443(o.emails);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.party, unittest.equals('foo'));
-    checkUnnamed1001(o.phones);
+    checkUnnamed444(o.phones);
     unittest.expect(o.photoUrl, unittest.equals('foo'));
-    checkUnnamed1002(o.urls);
+    checkUnnamed445(o.urls);
   }
   buildCounterOfficial--;
 }
 
-buildUnnamed1003() {
+buildUnnamed446() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed1003(core.List<api.Source> o) {
+checkUnnamed446(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -724,7 +724,7 @@
     o.name = "foo";
     o.notes = "foo";
     o.pollingHours = "foo";
-    o.sources = buildUnnamed1003();
+    o.sources = buildUnnamed446();
     o.startDate = "foo";
     o.voterServices = "foo";
   }
@@ -741,47 +741,47 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
     unittest.expect(o.pollingHours, unittest.equals('foo'));
-    checkUnnamed1003(o.sources);
+    checkUnnamed446(o.sources);
     unittest.expect(o.startDate, unittest.equals('foo'));
     unittest.expect(o.voterServices, unittest.equals('foo'));
   }
   buildCounterPollingLocation--;
 }
 
-buildUnnamed1004() {
+buildUnnamed447() {
   var o = new core.Map<core.String, api.GeographicDivision>();
   o["x"] = buildGeographicDivision();
   o["y"] = buildGeographicDivision();
   return o;
 }
 
-checkUnnamed1004(core.Map<core.String, api.GeographicDivision> o) {
+checkUnnamed447(core.Map<core.String, api.GeographicDivision> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeographicDivision(o["x"]);
   checkGeographicDivision(o["y"]);
 }
 
-buildUnnamed1005() {
+buildUnnamed448() {
   var o = new core.List<api.Office>();
   o.add(buildOffice());
   o.add(buildOffice());
   return o;
 }
 
-checkUnnamed1005(core.List<api.Office> o) {
+checkUnnamed448(core.List<api.Office> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffice(o[0]);
   checkOffice(o[1]);
 }
 
-buildUnnamed1006() {
+buildUnnamed449() {
   var o = new core.List<api.Official>();
   o.add(buildOfficial());
   o.add(buildOfficial());
   return o;
 }
 
-checkUnnamed1006(core.List<api.Official> o) {
+checkUnnamed449(core.List<api.Official> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOfficial(o[0]);
   checkOfficial(o[1]);
@@ -792,9 +792,9 @@
   var o = new api.RepresentativeInfoData();
   buildCounterRepresentativeInfoData++;
   if (buildCounterRepresentativeInfoData < 3) {
-    o.divisions = buildUnnamed1004();
-    o.offices = buildUnnamed1005();
-    o.officials = buildUnnamed1006();
+    o.divisions = buildUnnamed447();
+    o.offices = buildUnnamed448();
+    o.officials = buildUnnamed449();
   }
   buildCounterRepresentativeInfoData--;
   return o;
@@ -803,47 +803,47 @@
 checkRepresentativeInfoData(api.RepresentativeInfoData o) {
   buildCounterRepresentativeInfoData++;
   if (buildCounterRepresentativeInfoData < 3) {
-    checkUnnamed1004(o.divisions);
-    checkUnnamed1005(o.offices);
-    checkUnnamed1006(o.officials);
+    checkUnnamed447(o.divisions);
+    checkUnnamed448(o.offices);
+    checkUnnamed449(o.officials);
   }
   buildCounterRepresentativeInfoData--;
 }
 
-buildUnnamed1007() {
+buildUnnamed450() {
   var o = new core.Map<core.String, api.GeographicDivision>();
   o["x"] = buildGeographicDivision();
   o["y"] = buildGeographicDivision();
   return o;
 }
 
-checkUnnamed1007(core.Map<core.String, api.GeographicDivision> o) {
+checkUnnamed450(core.Map<core.String, api.GeographicDivision> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeographicDivision(o["x"]);
   checkGeographicDivision(o["y"]);
 }
 
-buildUnnamed1008() {
+buildUnnamed451() {
   var o = new core.List<api.Office>();
   o.add(buildOffice());
   o.add(buildOffice());
   return o;
 }
 
-checkUnnamed1008(core.List<api.Office> o) {
+checkUnnamed451(core.List<api.Office> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffice(o[0]);
   checkOffice(o[1]);
 }
 
-buildUnnamed1009() {
+buildUnnamed452() {
   var o = new core.List<api.Official>();
   o.add(buildOfficial());
   o.add(buildOfficial());
   return o;
 }
 
-checkUnnamed1009(core.List<api.Official> o) {
+checkUnnamed452(core.List<api.Official> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOfficial(o[0]);
   checkOfficial(o[1]);
@@ -854,11 +854,11 @@
   var o = new api.RepresentativeInfoResponse();
   buildCounterRepresentativeInfoResponse++;
   if (buildCounterRepresentativeInfoResponse < 3) {
-    o.divisions = buildUnnamed1007();
+    o.divisions = buildUnnamed450();
     o.kind = "foo";
     o.normalizedInput = buildSimpleAddressType();
-    o.offices = buildUnnamed1008();
-    o.officials = buildUnnamed1009();
+    o.offices = buildUnnamed451();
+    o.officials = buildUnnamed452();
   }
   buildCounterRepresentativeInfoResponse--;
   return o;
@@ -867,11 +867,11 @@
 checkRepresentativeInfoResponse(api.RepresentativeInfoResponse o) {
   buildCounterRepresentativeInfoResponse++;
   if (buildCounterRepresentativeInfoResponse < 3) {
-    checkUnnamed1007(o.divisions);
+    checkUnnamed450(o.divisions);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkSimpleAddressType(o.normalizedInput);
-    checkUnnamed1008(o.offices);
-    checkUnnamed1009(o.officials);
+    checkUnnamed451(o.offices);
+    checkUnnamed452(o.officials);
   }
   buildCounterRepresentativeInfoResponse--;
 }
@@ -928,66 +928,79 @@
   buildCounterSource--;
 }
 
-buildUnnamed1010() {
+buildUnnamed453() {
   var o = new core.List<api.Contest>();
   o.add(buildContest());
   o.add(buildContest());
   return o;
 }
 
-checkUnnamed1010(core.List<api.Contest> o) {
+checkUnnamed453(core.List<api.Contest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContest(o[0]);
   checkContest(o[1]);
 }
 
-buildUnnamed1011() {
+buildUnnamed454() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed1011(core.List<api.PollingLocation> o) {
+checkUnnamed454(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed1012() {
+buildUnnamed455() {
+  var o = new core.List<api.PollingLocation>();
+  o.add(buildPollingLocation());
+  o.add(buildPollingLocation());
+  return o;
+}
+
+checkUnnamed455(core.List<api.PollingLocation> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkPollingLocation(o[0]);
+  checkPollingLocation(o[1]);
+}
+
+buildUnnamed456() {
   var o = new core.List<api.Election>();
   o.add(buildElection());
   o.add(buildElection());
   return o;
 }
 
-checkUnnamed1012(core.List<api.Election> o) {
+checkUnnamed456(core.List<api.Election> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElection(o[0]);
   checkElection(o[1]);
 }
 
-buildUnnamed1013() {
+buildUnnamed457() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed1013(core.List<api.PollingLocation> o) {
+checkUnnamed457(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed1014() {
+buildUnnamed458() {
   var o = new core.List<api.AdministrationRegion>();
   o.add(buildAdministrationRegion());
   o.add(buildAdministrationRegion());
   return o;
 }
 
-checkUnnamed1014(core.List<api.AdministrationRegion> o) {
+checkUnnamed458(core.List<api.AdministrationRegion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdministrationRegion(o[0]);
   checkAdministrationRegion(o[1]);
@@ -998,15 +1011,16 @@
   var o = new api.VoterInfoResponse();
   buildCounterVoterInfoResponse++;
   if (buildCounterVoterInfoResponse < 3) {
-    o.contests = buildUnnamed1010();
-    o.earlyVoteSites = buildUnnamed1011();
+    o.contests = buildUnnamed453();
+    o.dropOffLocations = buildUnnamed454();
+    o.earlyVoteSites = buildUnnamed455();
     o.election = buildElection();
     o.kind = "foo";
     o.normalizedInput = buildSimpleAddressType();
-    o.otherElections = buildUnnamed1012();
-    o.pollingLocations = buildUnnamed1013();
+    o.otherElections = buildUnnamed456();
+    o.pollingLocations = buildUnnamed457();
     o.precinctId = "foo";
-    o.state = buildUnnamed1014();
+    o.state = buildUnnamed458();
   }
   buildCounterVoterInfoResponse--;
   return o;
@@ -1015,66 +1029,67 @@
 checkVoterInfoResponse(api.VoterInfoResponse o) {
   buildCounterVoterInfoResponse++;
   if (buildCounterVoterInfoResponse < 3) {
-    checkUnnamed1010(o.contests);
-    checkUnnamed1011(o.earlyVoteSites);
+    checkUnnamed453(o.contests);
+    checkUnnamed454(o.dropOffLocations);
+    checkUnnamed455(o.earlyVoteSites);
     checkElection(o.election);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkSimpleAddressType(o.normalizedInput);
-    checkUnnamed1012(o.otherElections);
-    checkUnnamed1013(o.pollingLocations);
+    checkUnnamed456(o.otherElections);
+    checkUnnamed457(o.pollingLocations);
     unittest.expect(o.precinctId, unittest.equals('foo'));
-    checkUnnamed1014(o.state);
+    checkUnnamed458(o.state);
   }
   buildCounterVoterInfoResponse--;
 }
 
-buildUnnamed1015() {
+buildUnnamed459() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1015(core.List<core.String> o) {
+checkUnnamed459(core.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() {
+buildUnnamed460() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1016(core.List<core.String> o) {
+checkUnnamed460(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1017() {
+buildUnnamed461() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1017(core.List<core.String> o) {
+checkUnnamed461(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1018() {
+buildUnnamed462() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1018(core.List<core.String> o) {
+checkUnnamed462(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1420,8 +1435,8 @@
       api.RepresentativesResourceApi res = new api.CivicinfoApi(mock).representatives;
       var arg_address = "foo";
       var arg_includeOffices = true;
-      var arg_levels = buildUnnamed1015();
-      var arg_roles = buildUnnamed1016();
+      var arg_levels = buildUnnamed459();
+      var arg_roles = buildUnnamed460();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1472,9 +1487,9 @@
       var mock = new common_test.HttpServerMock();
       api.RepresentativesResourceApi res = new api.CivicinfoApi(mock).representatives;
       var arg_ocdId = "foo";
-      var arg_levels = buildUnnamed1017();
+      var arg_levels = buildUnnamed461();
       var arg_recursive = true;
-      var arg_roles = buildUnnamed1018();
+      var arg_roles = buildUnnamed462();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
diff --git a/generated/googleapis/test/compute/v1_test.dart b/generated/googleapis/test/compute/v1_test.dart
index df2adbe..44f0db1 100644
--- a/generated/googleapis/test/compute/v1_test.dart
+++ b/generated/googleapis/test/compute/v1_test.dart
@@ -41,14 +41,14 @@
   buildCounterAccessConfig--;
 }
 
-buildUnnamed873() {
+buildUnnamed463() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed873(core.List<core.String> o) {
+checkUnnamed463(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -68,7 +68,7 @@
     o.region = "foo";
     o.selfLink = "foo";
     o.status = "foo";
-    o.users = buildUnnamed873();
+    o.users = buildUnnamed463();
   }
   buildCounterAddress--;
   return o;
@@ -86,19 +86,19 @@
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed873(o.users);
+    checkUnnamed463(o.users);
   }
   buildCounterAddress--;
 }
 
-buildUnnamed874() {
+buildUnnamed464() {
   var o = new core.Map<core.String, api.AddressesScopedList>();
   o["x"] = buildAddressesScopedList();
   o["y"] = buildAddressesScopedList();
   return o;
 }
 
-checkUnnamed874(core.Map<core.String, api.AddressesScopedList> o) {
+checkUnnamed464(core.Map<core.String, api.AddressesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddressesScopedList(o["x"]);
   checkAddressesScopedList(o["y"]);
@@ -110,7 +110,7 @@
   buildCounterAddressAggregatedList++;
   if (buildCounterAddressAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed874();
+    o.items = buildUnnamed464();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -123,7 +123,7 @@
   buildCounterAddressAggregatedList++;
   if (buildCounterAddressAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed874(o.items);
+    checkUnnamed464(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -131,14 +131,14 @@
   buildCounterAddressAggregatedList--;
 }
 
-buildUnnamed875() {
+buildUnnamed465() {
   var o = new core.List<api.Address>();
   o.add(buildAddress());
   o.add(buildAddress());
   return o;
 }
 
-checkUnnamed875(core.List<api.Address> o) {
+checkUnnamed465(core.List<api.Address> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddress(o[0]);
   checkAddress(o[1]);
@@ -150,7 +150,7 @@
   buildCounterAddressList++;
   if (buildCounterAddressList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed875();
+    o.items = buildUnnamed465();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -163,7 +163,7 @@
   buildCounterAddressList++;
   if (buildCounterAddressList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed875(o.items);
+    checkUnnamed465(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -171,14 +171,14 @@
   buildCounterAddressList--;
 }
 
-buildUnnamed876() {
+buildUnnamed466() {
   var o = new core.List<api.Address>();
   o.add(buildAddress());
   o.add(buildAddress());
   return o;
 }
 
-checkUnnamed876(core.List<api.Address> o) {
+checkUnnamed466(core.List<api.Address> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddress(o[0]);
   checkAddress(o[1]);
@@ -205,14 +205,14 @@
   buildCounterAddressesScopedListWarningData--;
 }
 
-buildUnnamed877() {
+buildUnnamed467() {
   var o = new core.List<api.AddressesScopedListWarningData>();
   o.add(buildAddressesScopedListWarningData());
   o.add(buildAddressesScopedListWarningData());
   return o;
 }
 
-checkUnnamed877(core.List<api.AddressesScopedListWarningData> o) {
+checkUnnamed467(core.List<api.AddressesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddressesScopedListWarningData(o[0]);
   checkAddressesScopedListWarningData(o[1]);
@@ -224,7 +224,7 @@
   buildCounterAddressesScopedListWarning++;
   if (buildCounterAddressesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed877();
+    o.data = buildUnnamed467();
     o.message = "foo";
   }
   buildCounterAddressesScopedListWarning--;
@@ -235,7 +235,7 @@
   buildCounterAddressesScopedListWarning++;
   if (buildCounterAddressesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed877(o.data);
+    checkUnnamed467(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterAddressesScopedListWarning--;
@@ -246,7 +246,7 @@
   var o = new api.AddressesScopedList();
   buildCounterAddressesScopedList++;
   if (buildCounterAddressesScopedList < 3) {
-    o.addresses = buildUnnamed876();
+    o.addresses = buildUnnamed466();
     o.warning = buildAddressesScopedListWarning();
   }
   buildCounterAddressesScopedList--;
@@ -256,20 +256,20 @@
 checkAddressesScopedList(api.AddressesScopedList o) {
   buildCounterAddressesScopedList++;
   if (buildCounterAddressesScopedList < 3) {
-    checkUnnamed876(o.addresses);
+    checkUnnamed466(o.addresses);
     checkAddressesScopedListWarning(o.warning);
   }
   buildCounterAddressesScopedList--;
 }
 
-buildUnnamed878() {
+buildUnnamed468() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed878(core.List<core.String> o) {
+checkUnnamed468(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -285,8 +285,9 @@
     o.deviceName = "foo";
     o.index = 42;
     o.initializeParams = buildAttachedDiskInitializeParams();
+    o.interface = "foo";
     o.kind = "foo";
-    o.licenses = buildUnnamed878();
+    o.licenses = buildUnnamed468();
     o.mode = "foo";
     o.source = "foo";
     o.type = "foo";
@@ -303,8 +304,9 @@
     unittest.expect(o.deviceName, unittest.equals('foo'));
     unittest.expect(o.index, unittest.equals(42));
     checkAttachedDiskInitializeParams(o.initializeParams);
+    unittest.expect(o.interface, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed878(o.licenses);
+    checkUnnamed468(o.licenses);
     unittest.expect(o.mode, unittest.equals('foo'));
     unittest.expect(o.source, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -368,27 +370,27 @@
   buildCounterBackend--;
 }
 
-buildUnnamed879() {
+buildUnnamed469() {
   var o = new core.List<api.Backend>();
   o.add(buildBackend());
   o.add(buildBackend());
   return o;
 }
 
-checkUnnamed879(core.List<api.Backend> o) {
+checkUnnamed469(core.List<api.Backend> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackend(o[0]);
   checkBackend(o[1]);
 }
 
-buildUnnamed880() {
+buildUnnamed470() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed880(core.List<core.String> o) {
+checkUnnamed470(core.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,11 +401,11 @@
   var o = new api.BackendService();
   buildCounterBackendService++;
   if (buildCounterBackendService < 3) {
-    o.backends = buildUnnamed879();
+    o.backends = buildUnnamed469();
     o.creationTimestamp = "foo";
     o.description = "foo";
     o.fingerprint = "foo";
-    o.healthChecks = buildUnnamed880();
+    o.healthChecks = buildUnnamed470();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
@@ -420,11 +422,11 @@
 checkBackendService(api.BackendService o) {
   buildCounterBackendService++;
   if (buildCounterBackendService < 3) {
-    checkUnnamed879(o.backends);
+    checkUnnamed469(o.backends);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed880(o.healthChecks);
+    checkUnnamed470(o.healthChecks);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -437,14 +439,14 @@
   buildCounterBackendService--;
 }
 
-buildUnnamed881() {
+buildUnnamed471() {
   var o = new core.List<api.HealthStatus>();
   o.add(buildHealthStatus());
   o.add(buildHealthStatus());
   return o;
 }
 
-checkUnnamed881(core.List<api.HealthStatus> o) {
+checkUnnamed471(core.List<api.HealthStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthStatus(o[0]);
   checkHealthStatus(o[1]);
@@ -455,7 +457,7 @@
   var o = new api.BackendServiceGroupHealth();
   buildCounterBackendServiceGroupHealth++;
   if (buildCounterBackendServiceGroupHealth < 3) {
-    o.healthStatus = buildUnnamed881();
+    o.healthStatus = buildUnnamed471();
     o.kind = "foo";
   }
   buildCounterBackendServiceGroupHealth--;
@@ -465,20 +467,20 @@
 checkBackendServiceGroupHealth(api.BackendServiceGroupHealth o) {
   buildCounterBackendServiceGroupHealth++;
   if (buildCounterBackendServiceGroupHealth < 3) {
-    checkUnnamed881(o.healthStatus);
+    checkUnnamed471(o.healthStatus);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBackendServiceGroupHealth--;
 }
 
-buildUnnamed882() {
+buildUnnamed472() {
   var o = new core.List<api.BackendService>();
   o.add(buildBackendService());
   o.add(buildBackendService());
   return o;
 }
 
-checkUnnamed882(core.List<api.BackendService> o) {
+checkUnnamed472(core.List<api.BackendService> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackendService(o[0]);
   checkBackendService(o[1]);
@@ -490,7 +492,7 @@
   buildCounterBackendServiceList++;
   if (buildCounterBackendServiceList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed882();
+    o.items = buildUnnamed472();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -503,7 +505,7 @@
   buildCounterBackendServiceList++;
   if (buildCounterBackendServiceList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed882(o.items);
+    checkUnnamed472(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -538,14 +540,14 @@
   buildCounterDeprecationStatus--;
 }
 
-buildUnnamed883() {
+buildUnnamed473() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed883(core.List<core.String> o) {
+checkUnnamed473(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -560,7 +562,7 @@
     o.description = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.licenses = buildUnnamed883();
+    o.licenses = buildUnnamed473();
     o.name = "foo";
     o.options = "foo";
     o.selfLink = "foo";
@@ -584,7 +586,7 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed883(o.licenses);
+    checkUnnamed473(o.licenses);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.options, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -600,14 +602,14 @@
   buildCounterDisk--;
 }
 
-buildUnnamed884() {
+buildUnnamed474() {
   var o = new core.Map<core.String, api.DisksScopedList>();
   o["x"] = buildDisksScopedList();
   o["y"] = buildDisksScopedList();
   return o;
 }
 
-checkUnnamed884(core.Map<core.String, api.DisksScopedList> o) {
+checkUnnamed474(core.Map<core.String, api.DisksScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisksScopedList(o["x"]);
   checkDisksScopedList(o["y"]);
@@ -619,7 +621,7 @@
   buildCounterDiskAggregatedList++;
   if (buildCounterDiskAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed884();
+    o.items = buildUnnamed474();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -632,7 +634,7 @@
   buildCounterDiskAggregatedList++;
   if (buildCounterDiskAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed884(o.items);
+    checkUnnamed474(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -640,14 +642,14 @@
   buildCounterDiskAggregatedList--;
 }
 
-buildUnnamed885() {
+buildUnnamed475() {
   var o = new core.List<api.Disk>();
   o.add(buildDisk());
   o.add(buildDisk());
   return o;
 }
 
-checkUnnamed885(core.List<api.Disk> o) {
+checkUnnamed475(core.List<api.Disk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisk(o[0]);
   checkDisk(o[1]);
@@ -659,7 +661,7 @@
   buildCounterDiskList++;
   if (buildCounterDiskList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed885();
+    o.items = buildUnnamed475();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -672,7 +674,7 @@
   buildCounterDiskList++;
   if (buildCounterDiskList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed885(o.items);
+    checkUnnamed475(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -717,14 +719,14 @@
   buildCounterDiskType--;
 }
 
-buildUnnamed886() {
+buildUnnamed476() {
   var o = new core.Map<core.String, api.DiskTypesScopedList>();
   o["x"] = buildDiskTypesScopedList();
   o["y"] = buildDiskTypesScopedList();
   return o;
 }
 
-checkUnnamed886(core.Map<core.String, api.DiskTypesScopedList> o) {
+checkUnnamed476(core.Map<core.String, api.DiskTypesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskTypesScopedList(o["x"]);
   checkDiskTypesScopedList(o["y"]);
@@ -736,7 +738,7 @@
   buildCounterDiskTypeAggregatedList++;
   if (buildCounterDiskTypeAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed886();
+    o.items = buildUnnamed476();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -749,7 +751,7 @@
   buildCounterDiskTypeAggregatedList++;
   if (buildCounterDiskTypeAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed886(o.items);
+    checkUnnamed476(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -757,14 +759,14 @@
   buildCounterDiskTypeAggregatedList--;
 }
 
-buildUnnamed887() {
+buildUnnamed477() {
   var o = new core.List<api.DiskType>();
   o.add(buildDiskType());
   o.add(buildDiskType());
   return o;
 }
 
-checkUnnamed887(core.List<api.DiskType> o) {
+checkUnnamed477(core.List<api.DiskType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskType(o[0]);
   checkDiskType(o[1]);
@@ -776,7 +778,7 @@
   buildCounterDiskTypeList++;
   if (buildCounterDiskTypeList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed887();
+    o.items = buildUnnamed477();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -789,7 +791,7 @@
   buildCounterDiskTypeList++;
   if (buildCounterDiskTypeList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed887(o.items);
+    checkUnnamed477(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -797,14 +799,14 @@
   buildCounterDiskTypeList--;
 }
 
-buildUnnamed888() {
+buildUnnamed478() {
   var o = new core.List<api.DiskType>();
   o.add(buildDiskType());
   o.add(buildDiskType());
   return o;
 }
 
-checkUnnamed888(core.List<api.DiskType> o) {
+checkUnnamed478(core.List<api.DiskType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskType(o[0]);
   checkDiskType(o[1]);
@@ -831,14 +833,14 @@
   buildCounterDiskTypesScopedListWarningData--;
 }
 
-buildUnnamed889() {
+buildUnnamed479() {
   var o = new core.List<api.DiskTypesScopedListWarningData>();
   o.add(buildDiskTypesScopedListWarningData());
   o.add(buildDiskTypesScopedListWarningData());
   return o;
 }
 
-checkUnnamed889(core.List<api.DiskTypesScopedListWarningData> o) {
+checkUnnamed479(core.List<api.DiskTypesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskTypesScopedListWarningData(o[0]);
   checkDiskTypesScopedListWarningData(o[1]);
@@ -850,7 +852,7 @@
   buildCounterDiskTypesScopedListWarning++;
   if (buildCounterDiskTypesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed889();
+    o.data = buildUnnamed479();
     o.message = "foo";
   }
   buildCounterDiskTypesScopedListWarning--;
@@ -861,7 +863,7 @@
   buildCounterDiskTypesScopedListWarning++;
   if (buildCounterDiskTypesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed889(o.data);
+    checkUnnamed479(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterDiskTypesScopedListWarning--;
@@ -872,7 +874,7 @@
   var o = new api.DiskTypesScopedList();
   buildCounterDiskTypesScopedList++;
   if (buildCounterDiskTypesScopedList < 3) {
-    o.diskTypes = buildUnnamed888();
+    o.diskTypes = buildUnnamed478();
     o.warning = buildDiskTypesScopedListWarning();
   }
   buildCounterDiskTypesScopedList--;
@@ -882,20 +884,20 @@
 checkDiskTypesScopedList(api.DiskTypesScopedList o) {
   buildCounterDiskTypesScopedList++;
   if (buildCounterDiskTypesScopedList < 3) {
-    checkUnnamed888(o.diskTypes);
+    checkUnnamed478(o.diskTypes);
     checkDiskTypesScopedListWarning(o.warning);
   }
   buildCounterDiskTypesScopedList--;
 }
 
-buildUnnamed890() {
+buildUnnamed480() {
   var o = new core.List<api.Disk>();
   o.add(buildDisk());
   o.add(buildDisk());
   return o;
 }
 
-checkUnnamed890(core.List<api.Disk> o) {
+checkUnnamed480(core.List<api.Disk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisk(o[0]);
   checkDisk(o[1]);
@@ -922,14 +924,14 @@
   buildCounterDisksScopedListWarningData--;
 }
 
-buildUnnamed891() {
+buildUnnamed481() {
   var o = new core.List<api.DisksScopedListWarningData>();
   o.add(buildDisksScopedListWarningData());
   o.add(buildDisksScopedListWarningData());
   return o;
 }
 
-checkUnnamed891(core.List<api.DisksScopedListWarningData> o) {
+checkUnnamed481(core.List<api.DisksScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisksScopedListWarningData(o[0]);
   checkDisksScopedListWarningData(o[1]);
@@ -941,7 +943,7 @@
   buildCounterDisksScopedListWarning++;
   if (buildCounterDisksScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed891();
+    o.data = buildUnnamed481();
     o.message = "foo";
   }
   buildCounterDisksScopedListWarning--;
@@ -952,7 +954,7 @@
   buildCounterDisksScopedListWarning++;
   if (buildCounterDisksScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed891(o.data);
+    checkUnnamed481(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterDisksScopedListWarning--;
@@ -963,7 +965,7 @@
   var o = new api.DisksScopedList();
   buildCounterDisksScopedList++;
   if (buildCounterDisksScopedList < 3) {
-    o.disks = buildUnnamed890();
+    o.disks = buildUnnamed480();
     o.warning = buildDisksScopedListWarning();
   }
   buildCounterDisksScopedList--;
@@ -973,20 +975,20 @@
 checkDisksScopedList(api.DisksScopedList o) {
   buildCounterDisksScopedList++;
   if (buildCounterDisksScopedList < 3) {
-    checkUnnamed890(o.disks);
+    checkUnnamed480(o.disks);
     checkDisksScopedListWarning(o.warning);
   }
   buildCounterDisksScopedList--;
 }
 
-buildUnnamed892() {
+buildUnnamed482() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed892(core.List<core.String> o) {
+checkUnnamed482(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -998,7 +1000,7 @@
   buildCounterFirewallAllowed++;
   if (buildCounterFirewallAllowed < 3) {
     o.IPProtocol = "foo";
-    o.ports = buildUnnamed892();
+    o.ports = buildUnnamed482();
   }
   buildCounterFirewallAllowed--;
   return o;
@@ -1008,58 +1010,58 @@
   buildCounterFirewallAllowed++;
   if (buildCounterFirewallAllowed < 3) {
     unittest.expect(o.IPProtocol, unittest.equals('foo'));
-    checkUnnamed892(o.ports);
+    checkUnnamed482(o.ports);
   }
   buildCounterFirewallAllowed--;
 }
 
-buildUnnamed893() {
+buildUnnamed483() {
   var o = new core.List<api.FirewallAllowed>();
   o.add(buildFirewallAllowed());
   o.add(buildFirewallAllowed());
   return o;
 }
 
-checkUnnamed893(core.List<api.FirewallAllowed> o) {
+checkUnnamed483(core.List<api.FirewallAllowed> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFirewallAllowed(o[0]);
   checkFirewallAllowed(o[1]);
 }
 
-buildUnnamed894() {
+buildUnnamed484() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed894(core.List<core.String> o) {
+checkUnnamed484(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed895() {
+buildUnnamed485() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed895(core.List<core.String> o) {
+checkUnnamed485(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed896() {
+buildUnnamed486() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed896(core.List<core.String> o) {
+checkUnnamed486(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1070,7 +1072,7 @@
   var o = new api.Firewall();
   buildCounterFirewall++;
   if (buildCounterFirewall < 3) {
-    o.allowed = buildUnnamed893();
+    o.allowed = buildUnnamed483();
     o.creationTimestamp = "foo";
     o.description = "foo";
     o.id = "foo";
@@ -1078,9 +1080,9 @@
     o.name = "foo";
     o.network = "foo";
     o.selfLink = "foo";
-    o.sourceRanges = buildUnnamed894();
-    o.sourceTags = buildUnnamed895();
-    o.targetTags = buildUnnamed896();
+    o.sourceRanges = buildUnnamed484();
+    o.sourceTags = buildUnnamed485();
+    o.targetTags = buildUnnamed486();
   }
   buildCounterFirewall--;
   return o;
@@ -1089,7 +1091,7 @@
 checkFirewall(api.Firewall o) {
   buildCounterFirewall++;
   if (buildCounterFirewall < 3) {
-    checkUnnamed893(o.allowed);
+    checkUnnamed483(o.allowed);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -1097,21 +1099,21 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed894(o.sourceRanges);
-    checkUnnamed895(o.sourceTags);
-    checkUnnamed896(o.targetTags);
+    checkUnnamed484(o.sourceRanges);
+    checkUnnamed485(o.sourceTags);
+    checkUnnamed486(o.targetTags);
   }
   buildCounterFirewall--;
 }
 
-buildUnnamed897() {
+buildUnnamed487() {
   var o = new core.List<api.Firewall>();
   o.add(buildFirewall());
   o.add(buildFirewall());
   return o;
 }
 
-checkUnnamed897(core.List<api.Firewall> o) {
+checkUnnamed487(core.List<api.Firewall> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFirewall(o[0]);
   checkFirewall(o[1]);
@@ -1123,7 +1125,7 @@
   buildCounterFirewallList++;
   if (buildCounterFirewallList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed897();
+    o.items = buildUnnamed487();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1136,7 +1138,7 @@
   buildCounterFirewallList++;
   if (buildCounterFirewallList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed897(o.items);
+    checkUnnamed487(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1183,14 +1185,14 @@
   buildCounterForwardingRule--;
 }
 
-buildUnnamed898() {
+buildUnnamed488() {
   var o = new core.Map<core.String, api.ForwardingRulesScopedList>();
   o["x"] = buildForwardingRulesScopedList();
   o["y"] = buildForwardingRulesScopedList();
   return o;
 }
 
-checkUnnamed898(core.Map<core.String, api.ForwardingRulesScopedList> o) {
+checkUnnamed488(core.Map<core.String, api.ForwardingRulesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRulesScopedList(o["x"]);
   checkForwardingRulesScopedList(o["y"]);
@@ -1202,7 +1204,7 @@
   buildCounterForwardingRuleAggregatedList++;
   if (buildCounterForwardingRuleAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed898();
+    o.items = buildUnnamed488();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1215,7 +1217,7 @@
   buildCounterForwardingRuleAggregatedList++;
   if (buildCounterForwardingRuleAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed898(o.items);
+    checkUnnamed488(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1223,14 +1225,14 @@
   buildCounterForwardingRuleAggregatedList--;
 }
 
-buildUnnamed899() {
+buildUnnamed489() {
   var o = new core.List<api.ForwardingRule>();
   o.add(buildForwardingRule());
   o.add(buildForwardingRule());
   return o;
 }
 
-checkUnnamed899(core.List<api.ForwardingRule> o) {
+checkUnnamed489(core.List<api.ForwardingRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRule(o[0]);
   checkForwardingRule(o[1]);
@@ -1242,7 +1244,7 @@
   buildCounterForwardingRuleList++;
   if (buildCounterForwardingRuleList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed899();
+    o.items = buildUnnamed489();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1255,7 +1257,7 @@
   buildCounterForwardingRuleList++;
   if (buildCounterForwardingRuleList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed899(o.items);
+    checkUnnamed489(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1263,14 +1265,14 @@
   buildCounterForwardingRuleList--;
 }
 
-buildUnnamed900() {
+buildUnnamed490() {
   var o = new core.List<api.ForwardingRule>();
   o.add(buildForwardingRule());
   o.add(buildForwardingRule());
   return o;
 }
 
-checkUnnamed900(core.List<api.ForwardingRule> o) {
+checkUnnamed490(core.List<api.ForwardingRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRule(o[0]);
   checkForwardingRule(o[1]);
@@ -1297,14 +1299,14 @@
   buildCounterForwardingRulesScopedListWarningData--;
 }
 
-buildUnnamed901() {
+buildUnnamed491() {
   var o = new core.List<api.ForwardingRulesScopedListWarningData>();
   o.add(buildForwardingRulesScopedListWarningData());
   o.add(buildForwardingRulesScopedListWarningData());
   return o;
 }
 
-checkUnnamed901(core.List<api.ForwardingRulesScopedListWarningData> o) {
+checkUnnamed491(core.List<api.ForwardingRulesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRulesScopedListWarningData(o[0]);
   checkForwardingRulesScopedListWarningData(o[1]);
@@ -1316,7 +1318,7 @@
   buildCounterForwardingRulesScopedListWarning++;
   if (buildCounterForwardingRulesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed901();
+    o.data = buildUnnamed491();
     o.message = "foo";
   }
   buildCounterForwardingRulesScopedListWarning--;
@@ -1327,7 +1329,7 @@
   buildCounterForwardingRulesScopedListWarning++;
   if (buildCounterForwardingRulesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed901(o.data);
+    checkUnnamed491(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterForwardingRulesScopedListWarning--;
@@ -1338,7 +1340,7 @@
   var o = new api.ForwardingRulesScopedList();
   buildCounterForwardingRulesScopedList++;
   if (buildCounterForwardingRulesScopedList < 3) {
-    o.forwardingRules = buildUnnamed900();
+    o.forwardingRules = buildUnnamed490();
     o.warning = buildForwardingRulesScopedListWarning();
   }
   buildCounterForwardingRulesScopedList--;
@@ -1348,7 +1350,7 @@
 checkForwardingRulesScopedList(api.ForwardingRulesScopedList o) {
   buildCounterForwardingRulesScopedList++;
   if (buildCounterForwardingRulesScopedList < 3) {
-    checkUnnamed900(o.forwardingRules);
+    checkUnnamed490(o.forwardingRules);
     checkForwardingRulesScopedListWarning(o.warning);
   }
   buildCounterForwardingRulesScopedList--;
@@ -1398,14 +1400,14 @@
   buildCounterHealthStatus--;
 }
 
-buildUnnamed902() {
+buildUnnamed492() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed902(core.List<core.String> o) {
+checkUnnamed492(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1417,7 +1419,7 @@
   buildCounterHostRule++;
   if (buildCounterHostRule < 3) {
     o.description = "foo";
-    o.hosts = buildUnnamed902();
+    o.hosts = buildUnnamed492();
     o.pathMatcher = "foo";
   }
   buildCounterHostRule--;
@@ -1428,7 +1430,7 @@
   buildCounterHostRule++;
   if (buildCounterHostRule < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed902(o.hosts);
+    checkUnnamed492(o.hosts);
     unittest.expect(o.pathMatcher, unittest.equals('foo'));
   }
   buildCounterHostRule--;
@@ -1477,14 +1479,14 @@
   buildCounterHttpHealthCheck--;
 }
 
-buildUnnamed903() {
+buildUnnamed493() {
   var o = new core.List<api.HttpHealthCheck>();
   o.add(buildHttpHealthCheck());
   o.add(buildHttpHealthCheck());
   return o;
 }
 
-checkUnnamed903(core.List<api.HttpHealthCheck> o) {
+checkUnnamed493(core.List<api.HttpHealthCheck> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHttpHealthCheck(o[0]);
   checkHttpHealthCheck(o[1]);
@@ -1496,7 +1498,7 @@
   buildCounterHttpHealthCheckList++;
   if (buildCounterHttpHealthCheckList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed903();
+    o.items = buildUnnamed493();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1509,7 +1511,7 @@
   buildCounterHttpHealthCheckList++;
   if (buildCounterHttpHealthCheckList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed903(o.items);
+    checkUnnamed493(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1517,14 +1519,14 @@
   buildCounterHttpHealthCheckList--;
 }
 
-buildUnnamed904() {
+buildUnnamed494() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed904(core.List<core.String> o) {
+checkUnnamed494(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1565,7 +1567,7 @@
     o.diskSizeGb = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.licenses = buildUnnamed904();
+    o.licenses = buildUnnamed494();
     o.name = "foo";
     o.rawDisk = buildImageRawDisk();
     o.selfLink = "foo";
@@ -1588,7 +1590,7 @@
     unittest.expect(o.diskSizeGb, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed904(o.licenses);
+    checkUnnamed494(o.licenses);
     unittest.expect(o.name, unittest.equals('foo'));
     checkImageRawDisk(o.rawDisk);
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1600,14 +1602,14 @@
   buildCounterImage--;
 }
 
-buildUnnamed905() {
+buildUnnamed495() {
   var o = new core.List<api.Image>();
   o.add(buildImage());
   o.add(buildImage());
   return o;
 }
 
-checkUnnamed905(core.List<api.Image> o) {
+checkUnnamed495(core.List<api.Image> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImage(o[0]);
   checkImage(o[1]);
@@ -1619,7 +1621,7 @@
   buildCounterImageList++;
   if (buildCounterImageList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed905();
+    o.items = buildUnnamed495();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1632,7 +1634,7 @@
   buildCounterImageList++;
   if (buildCounterImageList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed905(o.items);
+    checkUnnamed495(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1640,40 +1642,40 @@
   buildCounterImageList--;
 }
 
-buildUnnamed906() {
+buildUnnamed496() {
   var o = new core.List<api.AttachedDisk>();
   o.add(buildAttachedDisk());
   o.add(buildAttachedDisk());
   return o;
 }
 
-checkUnnamed906(core.List<api.AttachedDisk> o) {
+checkUnnamed496(core.List<api.AttachedDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachedDisk(o[0]);
   checkAttachedDisk(o[1]);
 }
 
-buildUnnamed907() {
+buildUnnamed497() {
   var o = new core.List<api.NetworkInterface>();
   o.add(buildNetworkInterface());
   o.add(buildNetworkInterface());
   return o;
 }
 
-checkUnnamed907(core.List<api.NetworkInterface> o) {
+checkUnnamed497(core.List<api.NetworkInterface> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetworkInterface(o[0]);
   checkNetworkInterface(o[1]);
 }
 
-buildUnnamed908() {
+buildUnnamed498() {
   var o = new core.List<api.ServiceAccount>();
   o.add(buildServiceAccount());
   o.add(buildServiceAccount());
   return o;
 }
 
-checkUnnamed908(core.List<api.ServiceAccount> o) {
+checkUnnamed498(core.List<api.ServiceAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceAccount(o[0]);
   checkServiceAccount(o[1]);
@@ -1687,16 +1689,16 @@
     o.canIpForward = true;
     o.creationTimestamp = "foo";
     o.description = "foo";
-    o.disks = buildUnnamed906();
+    o.disks = buildUnnamed496();
     o.id = "foo";
     o.kind = "foo";
     o.machineType = "foo";
     o.metadata = buildMetadata();
     o.name = "foo";
-    o.networkInterfaces = buildUnnamed907();
+    o.networkInterfaces = buildUnnamed497();
     o.scheduling = buildScheduling();
     o.selfLink = "foo";
-    o.serviceAccounts = buildUnnamed908();
+    o.serviceAccounts = buildUnnamed498();
     o.status = "foo";
     o.statusMessage = "foo";
     o.tags = buildTags();
@@ -1712,16 +1714,16 @@
     unittest.expect(o.canIpForward, unittest.isTrue);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed906(o.disks);
+    checkUnnamed496(o.disks);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.machineType, unittest.equals('foo'));
     checkMetadata(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed907(o.networkInterfaces);
+    checkUnnamed497(o.networkInterfaces);
     checkScheduling(o.scheduling);
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed908(o.serviceAccounts);
+    checkUnnamed498(o.serviceAccounts);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.statusMessage, unittest.equals('foo'));
     checkTags(o.tags);
@@ -1730,14 +1732,14 @@
   buildCounterInstance--;
 }
 
-buildUnnamed909() {
+buildUnnamed499() {
   var o = new core.Map<core.String, api.InstancesScopedList>();
   o["x"] = buildInstancesScopedList();
   o["y"] = buildInstancesScopedList();
   return o;
 }
 
-checkUnnamed909(core.Map<core.String, api.InstancesScopedList> o) {
+checkUnnamed499(core.Map<core.String, api.InstancesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstancesScopedList(o["x"]);
   checkInstancesScopedList(o["y"]);
@@ -1749,7 +1751,7 @@
   buildCounterInstanceAggregatedList++;
   if (buildCounterInstanceAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed909();
+    o.items = buildUnnamed499();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1762,7 +1764,7 @@
   buildCounterInstanceAggregatedList++;
   if (buildCounterInstanceAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed909(o.items);
+    checkUnnamed499(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1770,14 +1772,14 @@
   buildCounterInstanceAggregatedList--;
 }
 
-buildUnnamed910() {
+buildUnnamed500() {
   var o = new core.List<api.Instance>();
   o.add(buildInstance());
   o.add(buildInstance());
   return o;
 }
 
-checkUnnamed910(core.List<api.Instance> o) {
+checkUnnamed500(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstance(o[0]);
   checkInstance(o[1]);
@@ -1789,7 +1791,7 @@
   buildCounterInstanceList++;
   if (buildCounterInstanceList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed910();
+    o.items = buildUnnamed500();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1802,7 +1804,7 @@
   buildCounterInstanceList++;
   if (buildCounterInstanceList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed910(o.items);
+    checkUnnamed500(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1810,40 +1812,40 @@
   buildCounterInstanceList--;
 }
 
-buildUnnamed911() {
+buildUnnamed501() {
   var o = new core.List<api.AttachedDisk>();
   o.add(buildAttachedDisk());
   o.add(buildAttachedDisk());
   return o;
 }
 
-checkUnnamed911(core.List<api.AttachedDisk> o) {
+checkUnnamed501(core.List<api.AttachedDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachedDisk(o[0]);
   checkAttachedDisk(o[1]);
 }
 
-buildUnnamed912() {
+buildUnnamed502() {
   var o = new core.List<api.NetworkInterface>();
   o.add(buildNetworkInterface());
   o.add(buildNetworkInterface());
   return o;
 }
 
-checkUnnamed912(core.List<api.NetworkInterface> o) {
+checkUnnamed502(core.List<api.NetworkInterface> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetworkInterface(o[0]);
   checkNetworkInterface(o[1]);
 }
 
-buildUnnamed913() {
+buildUnnamed503() {
   var o = new core.List<api.ServiceAccount>();
   o.add(buildServiceAccount());
   o.add(buildServiceAccount());
   return o;
 }
 
-checkUnnamed913(core.List<api.ServiceAccount> o) {
+checkUnnamed503(core.List<api.ServiceAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceAccount(o[0]);
   checkServiceAccount(o[1]);
@@ -1856,12 +1858,12 @@
   if (buildCounterInstanceProperties < 3) {
     o.canIpForward = true;
     o.description = "foo";
-    o.disks = buildUnnamed911();
+    o.disks = buildUnnamed501();
     o.machineType = "foo";
     o.metadata = buildMetadata();
-    o.networkInterfaces = buildUnnamed912();
+    o.networkInterfaces = buildUnnamed502();
     o.scheduling = buildScheduling();
-    o.serviceAccounts = buildUnnamed913();
+    o.serviceAccounts = buildUnnamed503();
     o.tags = buildTags();
   }
   buildCounterInstanceProperties--;
@@ -1873,12 +1875,12 @@
   if (buildCounterInstanceProperties < 3) {
     unittest.expect(o.canIpForward, unittest.isTrue);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed911(o.disks);
+    checkUnnamed501(o.disks);
     unittest.expect(o.machineType, unittest.equals('foo'));
     checkMetadata(o.metadata);
-    checkUnnamed912(o.networkInterfaces);
+    checkUnnamed502(o.networkInterfaces);
     checkScheduling(o.scheduling);
-    checkUnnamed913(o.serviceAccounts);
+    checkUnnamed503(o.serviceAccounts);
     checkTags(o.tags);
   }
   buildCounterInstanceProperties--;
@@ -1934,14 +1936,14 @@
   buildCounterInstanceTemplate--;
 }
 
-buildUnnamed914() {
+buildUnnamed504() {
   var o = new core.List<api.InstanceTemplate>();
   o.add(buildInstanceTemplate());
   o.add(buildInstanceTemplate());
   return o;
 }
 
-checkUnnamed914(core.List<api.InstanceTemplate> o) {
+checkUnnamed504(core.List<api.InstanceTemplate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceTemplate(o[0]);
   checkInstanceTemplate(o[1]);
@@ -1953,7 +1955,7 @@
   buildCounterInstanceTemplateList++;
   if (buildCounterInstanceTemplateList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed914();
+    o.items = buildUnnamed504();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1966,7 +1968,7 @@
   buildCounterInstanceTemplateList++;
   if (buildCounterInstanceTemplateList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed914(o.items);
+    checkUnnamed504(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1974,14 +1976,14 @@
   buildCounterInstanceTemplateList--;
 }
 
-buildUnnamed915() {
+buildUnnamed505() {
   var o = new core.List<api.Instance>();
   o.add(buildInstance());
   o.add(buildInstance());
   return o;
 }
 
-checkUnnamed915(core.List<api.Instance> o) {
+checkUnnamed505(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstance(o[0]);
   checkInstance(o[1]);
@@ -2008,14 +2010,14 @@
   buildCounterInstancesScopedListWarningData--;
 }
 
-buildUnnamed916() {
+buildUnnamed506() {
   var o = new core.List<api.InstancesScopedListWarningData>();
   o.add(buildInstancesScopedListWarningData());
   o.add(buildInstancesScopedListWarningData());
   return o;
 }
 
-checkUnnamed916(core.List<api.InstancesScopedListWarningData> o) {
+checkUnnamed506(core.List<api.InstancesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstancesScopedListWarningData(o[0]);
   checkInstancesScopedListWarningData(o[1]);
@@ -2027,7 +2029,7 @@
   buildCounterInstancesScopedListWarning++;
   if (buildCounterInstancesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed916();
+    o.data = buildUnnamed506();
     o.message = "foo";
   }
   buildCounterInstancesScopedListWarning--;
@@ -2038,7 +2040,7 @@
   buildCounterInstancesScopedListWarning++;
   if (buildCounterInstancesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed916(o.data);
+    checkUnnamed506(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterInstancesScopedListWarning--;
@@ -2049,7 +2051,7 @@
   var o = new api.InstancesScopedList();
   buildCounterInstancesScopedList++;
   if (buildCounterInstancesScopedList < 3) {
-    o.instances = buildUnnamed915();
+    o.instances = buildUnnamed505();
     o.warning = buildInstancesScopedListWarning();
   }
   buildCounterInstancesScopedList--;
@@ -2059,7 +2061,7 @@
 checkInstancesScopedList(api.InstancesScopedList o) {
   buildCounterInstancesScopedList++;
   if (buildCounterInstancesScopedList < 3) {
-    checkUnnamed915(o.instances);
+    checkUnnamed505(o.instances);
     checkInstancesScopedListWarning(o.warning);
   }
   buildCounterInstancesScopedList--;
@@ -2109,14 +2111,14 @@
   buildCounterMachineTypeScratchDisks--;
 }
 
-buildUnnamed917() {
+buildUnnamed507() {
   var o = new core.List<api.MachineTypeScratchDisks>();
   o.add(buildMachineTypeScratchDisks());
   o.add(buildMachineTypeScratchDisks());
   return o;
 }
 
-checkUnnamed917(core.List<api.MachineTypeScratchDisks> o) {
+checkUnnamed507(core.List<api.MachineTypeScratchDisks> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineTypeScratchDisks(o[0]);
   checkMachineTypeScratchDisks(o[1]);
@@ -2138,7 +2140,7 @@
     o.maximumPersistentDisksSizeGb = "foo";
     o.memoryMb = 42;
     o.name = "foo";
-    o.scratchDisks = buildUnnamed917();
+    o.scratchDisks = buildUnnamed507();
     o.selfLink = "foo";
     o.zone = "foo";
   }
@@ -2160,21 +2162,21 @@
     unittest.expect(o.maximumPersistentDisksSizeGb, unittest.equals('foo'));
     unittest.expect(o.memoryMb, unittest.equals(42));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed917(o.scratchDisks);
+    checkUnnamed507(o.scratchDisks);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterMachineType--;
 }
 
-buildUnnamed918() {
+buildUnnamed508() {
   var o = new core.Map<core.String, api.MachineTypesScopedList>();
   o["x"] = buildMachineTypesScopedList();
   o["y"] = buildMachineTypesScopedList();
   return o;
 }
 
-checkUnnamed918(core.Map<core.String, api.MachineTypesScopedList> o) {
+checkUnnamed508(core.Map<core.String, api.MachineTypesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineTypesScopedList(o["x"]);
   checkMachineTypesScopedList(o["y"]);
@@ -2186,7 +2188,7 @@
   buildCounterMachineTypeAggregatedList++;
   if (buildCounterMachineTypeAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed918();
+    o.items = buildUnnamed508();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2199,7 +2201,7 @@
   buildCounterMachineTypeAggregatedList++;
   if (buildCounterMachineTypeAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed918(o.items);
+    checkUnnamed508(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2207,14 +2209,14 @@
   buildCounterMachineTypeAggregatedList--;
 }
 
-buildUnnamed919() {
+buildUnnamed509() {
   var o = new core.List<api.MachineType>();
   o.add(buildMachineType());
   o.add(buildMachineType());
   return o;
 }
 
-checkUnnamed919(core.List<api.MachineType> o) {
+checkUnnamed509(core.List<api.MachineType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineType(o[0]);
   checkMachineType(o[1]);
@@ -2226,7 +2228,7 @@
   buildCounterMachineTypeList++;
   if (buildCounterMachineTypeList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed919();
+    o.items = buildUnnamed509();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2239,7 +2241,7 @@
   buildCounterMachineTypeList++;
   if (buildCounterMachineTypeList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed919(o.items);
+    checkUnnamed509(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2247,14 +2249,14 @@
   buildCounterMachineTypeList--;
 }
 
-buildUnnamed920() {
+buildUnnamed510() {
   var o = new core.List<api.MachineType>();
   o.add(buildMachineType());
   o.add(buildMachineType());
   return o;
 }
 
-checkUnnamed920(core.List<api.MachineType> o) {
+checkUnnamed510(core.List<api.MachineType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineType(o[0]);
   checkMachineType(o[1]);
@@ -2281,14 +2283,14 @@
   buildCounterMachineTypesScopedListWarningData--;
 }
 
-buildUnnamed921() {
+buildUnnamed511() {
   var o = new core.List<api.MachineTypesScopedListWarningData>();
   o.add(buildMachineTypesScopedListWarningData());
   o.add(buildMachineTypesScopedListWarningData());
   return o;
 }
 
-checkUnnamed921(core.List<api.MachineTypesScopedListWarningData> o) {
+checkUnnamed511(core.List<api.MachineTypesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineTypesScopedListWarningData(o[0]);
   checkMachineTypesScopedListWarningData(o[1]);
@@ -2300,7 +2302,7 @@
   buildCounterMachineTypesScopedListWarning++;
   if (buildCounterMachineTypesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed921();
+    o.data = buildUnnamed511();
     o.message = "foo";
   }
   buildCounterMachineTypesScopedListWarning--;
@@ -2311,7 +2313,7 @@
   buildCounterMachineTypesScopedListWarning++;
   if (buildCounterMachineTypesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed921(o.data);
+    checkUnnamed511(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterMachineTypesScopedListWarning--;
@@ -2322,7 +2324,7 @@
   var o = new api.MachineTypesScopedList();
   buildCounterMachineTypesScopedList++;
   if (buildCounterMachineTypesScopedList < 3) {
-    o.machineTypes = buildUnnamed920();
+    o.machineTypes = buildUnnamed510();
     o.warning = buildMachineTypesScopedListWarning();
   }
   buildCounterMachineTypesScopedList--;
@@ -2332,7 +2334,7 @@
 checkMachineTypesScopedList(api.MachineTypesScopedList o) {
   buildCounterMachineTypesScopedList++;
   if (buildCounterMachineTypesScopedList < 3) {
-    checkUnnamed920(o.machineTypes);
+    checkUnnamed510(o.machineTypes);
     checkMachineTypesScopedListWarning(o.warning);
   }
   buildCounterMachineTypesScopedList--;
@@ -2359,14 +2361,14 @@
   buildCounterMetadataItems--;
 }
 
-buildUnnamed922() {
+buildUnnamed512() {
   var o = new core.List<api.MetadataItems>();
   o.add(buildMetadataItems());
   o.add(buildMetadataItems());
   return o;
 }
 
-checkUnnamed922(core.List<api.MetadataItems> o) {
+checkUnnamed512(core.List<api.MetadataItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetadataItems(o[0]);
   checkMetadataItems(o[1]);
@@ -2378,7 +2380,7 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     o.fingerprint = "foo";
-    o.items = buildUnnamed922();
+    o.items = buildUnnamed512();
     o.kind = "foo";
   }
   buildCounterMetadata--;
@@ -2389,7 +2391,7 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed922(o.items);
+    checkUnnamed512(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterMetadata--;
@@ -2428,14 +2430,14 @@
   buildCounterNetwork--;
 }
 
-buildUnnamed923() {
+buildUnnamed513() {
   var o = new core.List<api.AccessConfig>();
   o.add(buildAccessConfig());
   o.add(buildAccessConfig());
   return o;
 }
 
-checkUnnamed923(core.List<api.AccessConfig> o) {
+checkUnnamed513(core.List<api.AccessConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccessConfig(o[0]);
   checkAccessConfig(o[1]);
@@ -2446,7 +2448,7 @@
   var o = new api.NetworkInterface();
   buildCounterNetworkInterface++;
   if (buildCounterNetworkInterface < 3) {
-    o.accessConfigs = buildUnnamed923();
+    o.accessConfigs = buildUnnamed513();
     o.name = "foo";
     o.network = "foo";
     o.networkIP = "foo";
@@ -2458,7 +2460,7 @@
 checkNetworkInterface(api.NetworkInterface o) {
   buildCounterNetworkInterface++;
   if (buildCounterNetworkInterface < 3) {
-    checkUnnamed923(o.accessConfigs);
+    checkUnnamed513(o.accessConfigs);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.networkIP, unittest.equals('foo'));
@@ -2466,14 +2468,14 @@
   buildCounterNetworkInterface--;
 }
 
-buildUnnamed924() {
+buildUnnamed514() {
   var o = new core.List<api.Network>();
   o.add(buildNetwork());
   o.add(buildNetwork());
   return o;
 }
 
-checkUnnamed924(core.List<api.Network> o) {
+checkUnnamed514(core.List<api.Network> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetwork(o[0]);
   checkNetwork(o[1]);
@@ -2485,7 +2487,7 @@
   buildCounterNetworkList++;
   if (buildCounterNetworkList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed924();
+    o.items = buildUnnamed514();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2498,7 +2500,7 @@
   buildCounterNetworkList++;
   if (buildCounterNetworkList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed924(o.items);
+    checkUnnamed514(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2529,14 +2531,14 @@
   buildCounterOperationErrorErrors--;
 }
 
-buildUnnamed925() {
+buildUnnamed515() {
   var o = new core.List<api.OperationErrorErrors>();
   o.add(buildOperationErrorErrors());
   o.add(buildOperationErrorErrors());
   return o;
 }
 
-checkUnnamed925(core.List<api.OperationErrorErrors> o) {
+checkUnnamed515(core.List<api.OperationErrorErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationErrorErrors(o[0]);
   checkOperationErrorErrors(o[1]);
@@ -2547,7 +2549,7 @@
   var o = new api.OperationError();
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    o.errors = buildUnnamed925();
+    o.errors = buildUnnamed515();
   }
   buildCounterOperationError--;
   return o;
@@ -2556,7 +2558,7 @@
 checkOperationError(api.OperationError o) {
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    checkUnnamed925(o.errors);
+    checkUnnamed515(o.errors);
   }
   buildCounterOperationError--;
 }
@@ -2582,14 +2584,14 @@
   buildCounterOperationWarningsData--;
 }
 
-buildUnnamed926() {
+buildUnnamed516() {
   var o = new core.List<api.OperationWarningsData>();
   o.add(buildOperationWarningsData());
   o.add(buildOperationWarningsData());
   return o;
 }
 
-checkUnnamed926(core.List<api.OperationWarningsData> o) {
+checkUnnamed516(core.List<api.OperationWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarningsData(o[0]);
   checkOperationWarningsData(o[1]);
@@ -2601,7 +2603,7 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed926();
+    o.data = buildUnnamed516();
     o.message = "foo";
   }
   buildCounterOperationWarnings--;
@@ -2612,20 +2614,20 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed926(o.data);
+    checkUnnamed516(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterOperationWarnings--;
 }
 
-buildUnnamed927() {
+buildUnnamed517() {
   var o = new core.List<api.OperationWarnings>();
   o.add(buildOperationWarnings());
   o.add(buildOperationWarnings());
   return o;
 }
 
-checkUnnamed927(core.List<api.OperationWarnings> o) {
+checkUnnamed517(core.List<api.OperationWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarnings(o[0]);
   checkOperationWarnings(o[1]);
@@ -2656,7 +2658,7 @@
     o.targetId = "foo";
     o.targetLink = "foo";
     o.user = "foo";
-    o.warnings = buildUnnamed927();
+    o.warnings = buildUnnamed517();
     o.zone = "foo";
   }
   buildCounterOperation--;
@@ -2686,20 +2688,20 @@
     unittest.expect(o.targetId, unittest.equals('foo'));
     unittest.expect(o.targetLink, unittest.equals('foo'));
     unittest.expect(o.user, unittest.equals('foo'));
-    checkUnnamed927(o.warnings);
+    checkUnnamed517(o.warnings);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterOperation--;
 }
 
-buildUnnamed928() {
+buildUnnamed518() {
   var o = new core.Map<core.String, api.OperationsScopedList>();
   o["x"] = buildOperationsScopedList();
   o["y"] = buildOperationsScopedList();
   return o;
 }
 
-checkUnnamed928(core.Map<core.String, api.OperationsScopedList> o) {
+checkUnnamed518(core.Map<core.String, api.OperationsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationsScopedList(o["x"]);
   checkOperationsScopedList(o["y"]);
@@ -2711,7 +2713,7 @@
   buildCounterOperationAggregatedList++;
   if (buildCounterOperationAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed928();
+    o.items = buildUnnamed518();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2724,7 +2726,7 @@
   buildCounterOperationAggregatedList++;
   if (buildCounterOperationAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed928(o.items);
+    checkUnnamed518(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2732,14 +2734,14 @@
   buildCounterOperationAggregatedList--;
 }
 
-buildUnnamed929() {
+buildUnnamed519() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed929(core.List<api.Operation> o) {
+checkUnnamed519(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -2751,7 +2753,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed929();
+    o.items = buildUnnamed519();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2764,7 +2766,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed929(o.items);
+    checkUnnamed519(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2772,14 +2774,14 @@
   buildCounterOperationList--;
 }
 
-buildUnnamed930() {
+buildUnnamed520() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed930(core.List<api.Operation> o) {
+checkUnnamed520(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -2806,14 +2808,14 @@
   buildCounterOperationsScopedListWarningData--;
 }
 
-buildUnnamed931() {
+buildUnnamed521() {
   var o = new core.List<api.OperationsScopedListWarningData>();
   o.add(buildOperationsScopedListWarningData());
   o.add(buildOperationsScopedListWarningData());
   return o;
 }
 
-checkUnnamed931(core.List<api.OperationsScopedListWarningData> o) {
+checkUnnamed521(core.List<api.OperationsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationsScopedListWarningData(o[0]);
   checkOperationsScopedListWarningData(o[1]);
@@ -2825,7 +2827,7 @@
   buildCounterOperationsScopedListWarning++;
   if (buildCounterOperationsScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed931();
+    o.data = buildUnnamed521();
     o.message = "foo";
   }
   buildCounterOperationsScopedListWarning--;
@@ -2836,7 +2838,7 @@
   buildCounterOperationsScopedListWarning++;
   if (buildCounterOperationsScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed931(o.data);
+    checkUnnamed521(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterOperationsScopedListWarning--;
@@ -2847,7 +2849,7 @@
   var o = new api.OperationsScopedList();
   buildCounterOperationsScopedList++;
   if (buildCounterOperationsScopedList < 3) {
-    o.operations = buildUnnamed930();
+    o.operations = buildUnnamed520();
     o.warning = buildOperationsScopedListWarning();
   }
   buildCounterOperationsScopedList--;
@@ -2857,20 +2859,20 @@
 checkOperationsScopedList(api.OperationsScopedList o) {
   buildCounterOperationsScopedList++;
   if (buildCounterOperationsScopedList < 3) {
-    checkUnnamed930(o.operations);
+    checkUnnamed520(o.operations);
     checkOperationsScopedListWarning(o.warning);
   }
   buildCounterOperationsScopedList--;
 }
 
-buildUnnamed932() {
+buildUnnamed522() {
   var o = new core.List<api.PathRule>();
   o.add(buildPathRule());
   o.add(buildPathRule());
   return o;
 }
 
-checkUnnamed932(core.List<api.PathRule> o) {
+checkUnnamed522(core.List<api.PathRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPathRule(o[0]);
   checkPathRule(o[1]);
@@ -2884,7 +2886,7 @@
     o.defaultService = "foo";
     o.description = "foo";
     o.name = "foo";
-    o.pathRules = buildUnnamed932();
+    o.pathRules = buildUnnamed522();
   }
   buildCounterPathMatcher--;
   return o;
@@ -2896,19 +2898,19 @@
     unittest.expect(o.defaultService, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed932(o.pathRules);
+    checkUnnamed522(o.pathRules);
   }
   buildCounterPathMatcher--;
 }
 
-buildUnnamed933() {
+buildUnnamed523() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed933(core.List<core.String> o) {
+checkUnnamed523(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2919,7 +2921,7 @@
   var o = new api.PathRule();
   buildCounterPathRule++;
   if (buildCounterPathRule < 3) {
-    o.paths = buildUnnamed933();
+    o.paths = buildUnnamed523();
     o.service = "foo";
   }
   buildCounterPathRule--;
@@ -2929,20 +2931,20 @@
 checkPathRule(api.PathRule o) {
   buildCounterPathRule++;
   if (buildCounterPathRule < 3) {
-    checkUnnamed933(o.paths);
+    checkUnnamed523(o.paths);
     unittest.expect(o.service, unittest.equals('foo'));
   }
   buildCounterPathRule--;
 }
 
-buildUnnamed934() {
+buildUnnamed524() {
   var o = new core.List<api.Quota>();
   o.add(buildQuota());
   o.add(buildQuota());
   return o;
 }
 
-checkUnnamed934(core.List<api.Quota> o) {
+checkUnnamed524(core.List<api.Quota> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuota(o[0]);
   checkQuota(o[1]);
@@ -2959,7 +2961,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.quotas = buildUnnamed934();
+    o.quotas = buildUnnamed524();
     o.selfLink = "foo";
     o.usageExportLocation = buildUsageExportLocation();
   }
@@ -2976,7 +2978,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed934(o.quotas);
+    checkUnnamed524(o.quotas);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUsageExportLocation(o.usageExportLocation);
   }
@@ -3006,27 +3008,27 @@
   buildCounterQuota--;
 }
 
-buildUnnamed935() {
+buildUnnamed525() {
   var o = new core.List<api.Quota>();
   o.add(buildQuota());
   o.add(buildQuota());
   return o;
 }
 
-checkUnnamed935(core.List<api.Quota> o) {
+checkUnnamed525(core.List<api.Quota> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuota(o[0]);
   checkQuota(o[1]);
 }
 
-buildUnnamed936() {
+buildUnnamed526() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed936(core.List<core.String> 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'));
@@ -3043,10 +3045,10 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.quotas = buildUnnamed935();
+    o.quotas = buildUnnamed525();
     o.selfLink = "foo";
     o.status = "foo";
-    o.zones = buildUnnamed936();
+    o.zones = buildUnnamed526();
   }
   buildCounterRegion--;
   return o;
@@ -3061,22 +3063,22 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed935(o.quotas);
+    checkUnnamed525(o.quotas);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed936(o.zones);
+    checkUnnamed526(o.zones);
   }
   buildCounterRegion--;
 }
 
-buildUnnamed937() {
+buildUnnamed527() {
   var o = new core.List<api.Region>();
   o.add(buildRegion());
   o.add(buildRegion());
   return o;
 }
 
-checkUnnamed937(core.List<api.Region> o) {
+checkUnnamed527(core.List<api.Region> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRegion(o[0]);
   checkRegion(o[1]);
@@ -3088,7 +3090,7 @@
   buildCounterRegionList++;
   if (buildCounterRegionList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed937();
+    o.items = buildUnnamed527();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3101,7 +3103,7 @@
   buildCounterRegionList++;
   if (buildCounterRegionList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed937(o.items);
+    checkUnnamed527(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3128,14 +3130,14 @@
   buildCounterResourceGroupReference--;
 }
 
-buildUnnamed938() {
+buildUnnamed528() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed938(core.List<core.String> o) {
+checkUnnamed528(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3162,14 +3164,14 @@
   buildCounterRouteWarningsData--;
 }
 
-buildUnnamed939() {
+buildUnnamed529() {
   var o = new core.List<api.RouteWarningsData>();
   o.add(buildRouteWarningsData());
   o.add(buildRouteWarningsData());
   return o;
 }
 
-checkUnnamed939(core.List<api.RouteWarningsData> o) {
+checkUnnamed529(core.List<api.RouteWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouteWarningsData(o[0]);
   checkRouteWarningsData(o[1]);
@@ -3181,7 +3183,7 @@
   buildCounterRouteWarnings++;
   if (buildCounterRouteWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed939();
+    o.data = buildUnnamed529();
     o.message = "foo";
   }
   buildCounterRouteWarnings--;
@@ -3192,20 +3194,20 @@
   buildCounterRouteWarnings++;
   if (buildCounterRouteWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed939(o.data);
+    checkUnnamed529(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterRouteWarnings--;
 }
 
-buildUnnamed940() {
+buildUnnamed530() {
   var o = new core.List<api.RouteWarnings>();
   o.add(buildRouteWarnings());
   o.add(buildRouteWarnings());
   return o;
 }
 
-checkUnnamed940(core.List<api.RouteWarnings> o) {
+checkUnnamed530(core.List<api.RouteWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouteWarnings(o[0]);
   checkRouteWarnings(o[1]);
@@ -3229,8 +3231,8 @@
     o.nextHopNetwork = "foo";
     o.priority = 42;
     o.selfLink = "foo";
-    o.tags = buildUnnamed938();
-    o.warnings = buildUnnamed940();
+    o.tags = buildUnnamed528();
+    o.warnings = buildUnnamed530();
   }
   buildCounterRoute--;
   return o;
@@ -3252,20 +3254,20 @@
     unittest.expect(o.nextHopNetwork, unittest.equals('foo'));
     unittest.expect(o.priority, unittest.equals(42));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed938(o.tags);
-    checkUnnamed940(o.warnings);
+    checkUnnamed528(o.tags);
+    checkUnnamed530(o.warnings);
   }
   buildCounterRoute--;
 }
 
-buildUnnamed941() {
+buildUnnamed531() {
   var o = new core.List<api.Route>();
   o.add(buildRoute());
   o.add(buildRoute());
   return o;
 }
 
-checkUnnamed941(core.List<api.Route> o) {
+checkUnnamed531(core.List<api.Route> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoute(o[0]);
   checkRoute(o[1]);
@@ -3277,7 +3279,7 @@
   buildCounterRouteList++;
   if (buildCounterRouteList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed941();
+    o.items = buildUnnamed531();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3290,7 +3292,7 @@
   buildCounterRouteList++;
   if (buildCounterRouteList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed941(o.items);
+    checkUnnamed531(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3342,14 +3344,14 @@
   buildCounterSerialPortOutput--;
 }
 
-buildUnnamed942() {
+buildUnnamed532() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed942(core.List<core.String> o) {
+checkUnnamed532(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3361,7 +3363,7 @@
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
     o.email = "foo";
-    o.scopes = buildUnnamed942();
+    o.scopes = buildUnnamed532();
   }
   buildCounterServiceAccount--;
   return o;
@@ -3371,19 +3373,19 @@
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
     unittest.expect(o.email, unittest.equals('foo'));
-    checkUnnamed942(o.scopes);
+    checkUnnamed532(o.scopes);
   }
   buildCounterServiceAccount--;
 }
 
-buildUnnamed943() {
+buildUnnamed533() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed943(core.List<core.String> o) {
+checkUnnamed533(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3399,7 +3401,7 @@
     o.diskSizeGb = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.licenses = buildUnnamed943();
+    o.licenses = buildUnnamed533();
     o.name = "foo";
     o.selfLink = "foo";
     o.sourceDisk = "foo";
@@ -3420,7 +3422,7 @@
     unittest.expect(o.diskSizeGb, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed943(o.licenses);
+    checkUnnamed533(o.licenses);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.sourceDisk, unittest.equals('foo'));
@@ -3432,14 +3434,14 @@
   buildCounterSnapshot--;
 }
 
-buildUnnamed944() {
+buildUnnamed534() {
   var o = new core.List<api.Snapshot>();
   o.add(buildSnapshot());
   o.add(buildSnapshot());
   return o;
 }
 
-checkUnnamed944(core.List<api.Snapshot> o) {
+checkUnnamed534(core.List<api.Snapshot> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSnapshot(o[0]);
   checkSnapshot(o[1]);
@@ -3451,7 +3453,7 @@
   buildCounterSnapshotList++;
   if (buildCounterSnapshotList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed944();
+    o.items = buildUnnamed534();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3464,7 +3466,7 @@
   buildCounterSnapshotList++;
   if (buildCounterSnapshotList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed944(o.items);
+    checkUnnamed534(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3472,14 +3474,14 @@
   buildCounterSnapshotList--;
 }
 
-buildUnnamed945() {
+buildUnnamed535() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed945(core.List<core.String> o) {
+checkUnnamed535(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3491,7 +3493,7 @@
   buildCounterTags++;
   if (buildCounterTags < 3) {
     o.fingerprint = "foo";
-    o.items = buildUnnamed945();
+    o.items = buildUnnamed535();
   }
   buildCounterTags--;
   return o;
@@ -3501,7 +3503,7 @@
   buildCounterTags++;
   if (buildCounterTags < 3) {
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed945(o.items);
+    checkUnnamed535(o.items);
   }
   buildCounterTags--;
 }
@@ -3537,14 +3539,14 @@
   buildCounterTargetHttpProxy--;
 }
 
-buildUnnamed946() {
+buildUnnamed536() {
   var o = new core.List<api.TargetHttpProxy>();
   o.add(buildTargetHttpProxy());
   o.add(buildTargetHttpProxy());
   return o;
 }
 
-checkUnnamed946(core.List<api.TargetHttpProxy> o) {
+checkUnnamed536(core.List<api.TargetHttpProxy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetHttpProxy(o[0]);
   checkTargetHttpProxy(o[1]);
@@ -3556,7 +3558,7 @@
   buildCounterTargetHttpProxyList++;
   if (buildCounterTargetHttpProxyList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed946();
+    o.items = buildUnnamed536();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3569,7 +3571,7 @@
   buildCounterTargetHttpProxyList++;
   if (buildCounterTargetHttpProxyList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed946(o.items);
+    checkUnnamed536(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3612,14 +3614,14 @@
   buildCounterTargetInstance--;
 }
 
-buildUnnamed947() {
+buildUnnamed537() {
   var o = new core.Map<core.String, api.TargetInstancesScopedList>();
   o["x"] = buildTargetInstancesScopedList();
   o["y"] = buildTargetInstancesScopedList();
   return o;
 }
 
-checkUnnamed947(core.Map<core.String, api.TargetInstancesScopedList> o) {
+checkUnnamed537(core.Map<core.String, api.TargetInstancesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstancesScopedList(o["x"]);
   checkTargetInstancesScopedList(o["y"]);
@@ -3631,7 +3633,7 @@
   buildCounterTargetInstanceAggregatedList++;
   if (buildCounterTargetInstanceAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed947();
+    o.items = buildUnnamed537();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3644,7 +3646,7 @@
   buildCounterTargetInstanceAggregatedList++;
   if (buildCounterTargetInstanceAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed947(o.items);
+    checkUnnamed537(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3652,14 +3654,14 @@
   buildCounterTargetInstanceAggregatedList--;
 }
 
-buildUnnamed948() {
+buildUnnamed538() {
   var o = new core.List<api.TargetInstance>();
   o.add(buildTargetInstance());
   o.add(buildTargetInstance());
   return o;
 }
 
-checkUnnamed948(core.List<api.TargetInstance> o) {
+checkUnnamed538(core.List<api.TargetInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstance(o[0]);
   checkTargetInstance(o[1]);
@@ -3671,7 +3673,7 @@
   buildCounterTargetInstanceList++;
   if (buildCounterTargetInstanceList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed948();
+    o.items = buildUnnamed538();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3684,7 +3686,7 @@
   buildCounterTargetInstanceList++;
   if (buildCounterTargetInstanceList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed948(o.items);
+    checkUnnamed538(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3692,14 +3694,14 @@
   buildCounterTargetInstanceList--;
 }
 
-buildUnnamed949() {
+buildUnnamed539() {
   var o = new core.List<api.TargetInstance>();
   o.add(buildTargetInstance());
   o.add(buildTargetInstance());
   return o;
 }
 
-checkUnnamed949(core.List<api.TargetInstance> o) {
+checkUnnamed539(core.List<api.TargetInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstance(o[0]);
   checkTargetInstance(o[1]);
@@ -3726,14 +3728,14 @@
   buildCounterTargetInstancesScopedListWarningData--;
 }
 
-buildUnnamed950() {
+buildUnnamed540() {
   var o = new core.List<api.TargetInstancesScopedListWarningData>();
   o.add(buildTargetInstancesScopedListWarningData());
   o.add(buildTargetInstancesScopedListWarningData());
   return o;
 }
 
-checkUnnamed950(core.List<api.TargetInstancesScopedListWarningData> o) {
+checkUnnamed540(core.List<api.TargetInstancesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstancesScopedListWarningData(o[0]);
   checkTargetInstancesScopedListWarningData(o[1]);
@@ -3745,7 +3747,7 @@
   buildCounterTargetInstancesScopedListWarning++;
   if (buildCounterTargetInstancesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed950();
+    o.data = buildUnnamed540();
     o.message = "foo";
   }
   buildCounterTargetInstancesScopedListWarning--;
@@ -3756,7 +3758,7 @@
   buildCounterTargetInstancesScopedListWarning++;
   if (buildCounterTargetInstancesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed950(o.data);
+    checkUnnamed540(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterTargetInstancesScopedListWarning--;
@@ -3767,7 +3769,7 @@
   var o = new api.TargetInstancesScopedList();
   buildCounterTargetInstancesScopedList++;
   if (buildCounterTargetInstancesScopedList < 3) {
-    o.targetInstances = buildUnnamed949();
+    o.targetInstances = buildUnnamed539();
     o.warning = buildTargetInstancesScopedListWarning();
   }
   buildCounterTargetInstancesScopedList--;
@@ -3777,33 +3779,33 @@
 checkTargetInstancesScopedList(api.TargetInstancesScopedList o) {
   buildCounterTargetInstancesScopedList++;
   if (buildCounterTargetInstancesScopedList < 3) {
-    checkUnnamed949(o.targetInstances);
+    checkUnnamed539(o.targetInstances);
     checkTargetInstancesScopedListWarning(o.warning);
   }
   buildCounterTargetInstancesScopedList--;
 }
 
-buildUnnamed951() {
+buildUnnamed541() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed951(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'));
 }
 
-buildUnnamed952() {
+buildUnnamed542() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed952(core.List<core.String> o) {
+checkUnnamed542(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3818,9 +3820,9 @@
     o.creationTimestamp = "foo";
     o.description = "foo";
     o.failoverRatio = 42.0;
-    o.healthChecks = buildUnnamed951();
+    o.healthChecks = buildUnnamed541();
     o.id = "foo";
-    o.instances = buildUnnamed952();
+    o.instances = buildUnnamed542();
     o.kind = "foo";
     o.name = "foo";
     o.region = "foo";
@@ -3838,9 +3840,9 @@
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.failoverRatio, unittest.equals(42.0));
-    checkUnnamed951(o.healthChecks);
+    checkUnnamed541(o.healthChecks);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed952(o.instances);
+    checkUnnamed542(o.instances);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
@@ -3850,14 +3852,14 @@
   buildCounterTargetPool--;
 }
 
-buildUnnamed953() {
+buildUnnamed543() {
   var o = new core.Map<core.String, api.TargetPoolsScopedList>();
   o["x"] = buildTargetPoolsScopedList();
   o["y"] = buildTargetPoolsScopedList();
   return o;
 }
 
-checkUnnamed953(core.Map<core.String, api.TargetPoolsScopedList> o) {
+checkUnnamed543(core.Map<core.String, api.TargetPoolsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPoolsScopedList(o["x"]);
   checkTargetPoolsScopedList(o["y"]);
@@ -3869,7 +3871,7 @@
   buildCounterTargetPoolAggregatedList++;
   if (buildCounterTargetPoolAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed953();
+    o.items = buildUnnamed543();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3882,7 +3884,7 @@
   buildCounterTargetPoolAggregatedList++;
   if (buildCounterTargetPoolAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed953(o.items);
+    checkUnnamed543(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 +3892,14 @@
   buildCounterTargetPoolAggregatedList--;
 }
 
-buildUnnamed954() {
+buildUnnamed544() {
   var o = new core.List<api.HealthStatus>();
   o.add(buildHealthStatus());
   o.add(buildHealthStatus());
   return o;
 }
 
-checkUnnamed954(core.List<api.HealthStatus> o) {
+checkUnnamed544(core.List<api.HealthStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthStatus(o[0]);
   checkHealthStatus(o[1]);
@@ -3908,7 +3910,7 @@
   var o = new api.TargetPoolInstanceHealth();
   buildCounterTargetPoolInstanceHealth++;
   if (buildCounterTargetPoolInstanceHealth < 3) {
-    o.healthStatus = buildUnnamed954();
+    o.healthStatus = buildUnnamed544();
     o.kind = "foo";
   }
   buildCounterTargetPoolInstanceHealth--;
@@ -3918,20 +3920,20 @@
 checkTargetPoolInstanceHealth(api.TargetPoolInstanceHealth o) {
   buildCounterTargetPoolInstanceHealth++;
   if (buildCounterTargetPoolInstanceHealth < 3) {
-    checkUnnamed954(o.healthStatus);
+    checkUnnamed544(o.healthStatus);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTargetPoolInstanceHealth--;
 }
 
-buildUnnamed955() {
+buildUnnamed545() {
   var o = new core.List<api.TargetPool>();
   o.add(buildTargetPool());
   o.add(buildTargetPool());
   return o;
 }
 
-checkUnnamed955(core.List<api.TargetPool> o) {
+checkUnnamed545(core.List<api.TargetPool> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPool(o[0]);
   checkTargetPool(o[1]);
@@ -3943,7 +3945,7 @@
   buildCounterTargetPoolList++;
   if (buildCounterTargetPoolList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed955();
+    o.items = buildUnnamed545();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3956,7 +3958,7 @@
   buildCounterTargetPoolList++;
   if (buildCounterTargetPoolList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed955(o.items);
+    checkUnnamed545(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3964,14 +3966,14 @@
   buildCounterTargetPoolList--;
 }
 
-buildUnnamed956() {
+buildUnnamed546() {
   var o = new core.List<api.HealthCheckReference>();
   o.add(buildHealthCheckReference());
   o.add(buildHealthCheckReference());
   return o;
 }
 
-checkUnnamed956(core.List<api.HealthCheckReference> o) {
+checkUnnamed546(core.List<api.HealthCheckReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthCheckReference(o[0]);
   checkHealthCheckReference(o[1]);
@@ -3982,7 +3984,7 @@
   var o = new api.TargetPoolsAddHealthCheckRequest();
   buildCounterTargetPoolsAddHealthCheckRequest++;
   if (buildCounterTargetPoolsAddHealthCheckRequest < 3) {
-    o.healthChecks = buildUnnamed956();
+    o.healthChecks = buildUnnamed546();
   }
   buildCounterTargetPoolsAddHealthCheckRequest--;
   return o;
@@ -3991,19 +3993,19 @@
 checkTargetPoolsAddHealthCheckRequest(api.TargetPoolsAddHealthCheckRequest o) {
   buildCounterTargetPoolsAddHealthCheckRequest++;
   if (buildCounterTargetPoolsAddHealthCheckRequest < 3) {
-    checkUnnamed956(o.healthChecks);
+    checkUnnamed546(o.healthChecks);
   }
   buildCounterTargetPoolsAddHealthCheckRequest--;
 }
 
-buildUnnamed957() {
+buildUnnamed547() {
   var o = new core.List<api.InstanceReference>();
   o.add(buildInstanceReference());
   o.add(buildInstanceReference());
   return o;
 }
 
-checkUnnamed957(core.List<api.InstanceReference> o) {
+checkUnnamed547(core.List<api.InstanceReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceReference(o[0]);
   checkInstanceReference(o[1]);
@@ -4014,7 +4016,7 @@
   var o = new api.TargetPoolsAddInstanceRequest();
   buildCounterTargetPoolsAddInstanceRequest++;
   if (buildCounterTargetPoolsAddInstanceRequest < 3) {
-    o.instances = buildUnnamed957();
+    o.instances = buildUnnamed547();
   }
   buildCounterTargetPoolsAddInstanceRequest--;
   return o;
@@ -4023,19 +4025,19 @@
 checkTargetPoolsAddInstanceRequest(api.TargetPoolsAddInstanceRequest o) {
   buildCounterTargetPoolsAddInstanceRequest++;
   if (buildCounterTargetPoolsAddInstanceRequest < 3) {
-    checkUnnamed957(o.instances);
+    checkUnnamed547(o.instances);
   }
   buildCounterTargetPoolsAddInstanceRequest--;
 }
 
-buildUnnamed958() {
+buildUnnamed548() {
   var o = new core.List<api.HealthCheckReference>();
   o.add(buildHealthCheckReference());
   o.add(buildHealthCheckReference());
   return o;
 }
 
-checkUnnamed958(core.List<api.HealthCheckReference> o) {
+checkUnnamed548(core.List<api.HealthCheckReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthCheckReference(o[0]);
   checkHealthCheckReference(o[1]);
@@ -4046,7 +4048,7 @@
   var o = new api.TargetPoolsRemoveHealthCheckRequest();
   buildCounterTargetPoolsRemoveHealthCheckRequest++;
   if (buildCounterTargetPoolsRemoveHealthCheckRequest < 3) {
-    o.healthChecks = buildUnnamed958();
+    o.healthChecks = buildUnnamed548();
   }
   buildCounterTargetPoolsRemoveHealthCheckRequest--;
   return o;
@@ -4055,19 +4057,19 @@
 checkTargetPoolsRemoveHealthCheckRequest(api.TargetPoolsRemoveHealthCheckRequest o) {
   buildCounterTargetPoolsRemoveHealthCheckRequest++;
   if (buildCounterTargetPoolsRemoveHealthCheckRequest < 3) {
-    checkUnnamed958(o.healthChecks);
+    checkUnnamed548(o.healthChecks);
   }
   buildCounterTargetPoolsRemoveHealthCheckRequest--;
 }
 
-buildUnnamed959() {
+buildUnnamed549() {
   var o = new core.List<api.InstanceReference>();
   o.add(buildInstanceReference());
   o.add(buildInstanceReference());
   return o;
 }
 
-checkUnnamed959(core.List<api.InstanceReference> o) {
+checkUnnamed549(core.List<api.InstanceReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceReference(o[0]);
   checkInstanceReference(o[1]);
@@ -4078,7 +4080,7 @@
   var o = new api.TargetPoolsRemoveInstanceRequest();
   buildCounterTargetPoolsRemoveInstanceRequest++;
   if (buildCounterTargetPoolsRemoveInstanceRequest < 3) {
-    o.instances = buildUnnamed959();
+    o.instances = buildUnnamed549();
   }
   buildCounterTargetPoolsRemoveInstanceRequest--;
   return o;
@@ -4087,19 +4089,19 @@
 checkTargetPoolsRemoveInstanceRequest(api.TargetPoolsRemoveInstanceRequest o) {
   buildCounterTargetPoolsRemoveInstanceRequest++;
   if (buildCounterTargetPoolsRemoveInstanceRequest < 3) {
-    checkUnnamed959(o.instances);
+    checkUnnamed549(o.instances);
   }
   buildCounterTargetPoolsRemoveInstanceRequest--;
 }
 
-buildUnnamed960() {
+buildUnnamed550() {
   var o = new core.List<api.TargetPool>();
   o.add(buildTargetPool());
   o.add(buildTargetPool());
   return o;
 }
 
-checkUnnamed960(core.List<api.TargetPool> o) {
+checkUnnamed550(core.List<api.TargetPool> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPool(o[0]);
   checkTargetPool(o[1]);
@@ -4126,14 +4128,14 @@
   buildCounterTargetPoolsScopedListWarningData--;
 }
 
-buildUnnamed961() {
+buildUnnamed551() {
   var o = new core.List<api.TargetPoolsScopedListWarningData>();
   o.add(buildTargetPoolsScopedListWarningData());
   o.add(buildTargetPoolsScopedListWarningData());
   return o;
 }
 
-checkUnnamed961(core.List<api.TargetPoolsScopedListWarningData> o) {
+checkUnnamed551(core.List<api.TargetPoolsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPoolsScopedListWarningData(o[0]);
   checkTargetPoolsScopedListWarningData(o[1]);
@@ -4145,7 +4147,7 @@
   buildCounterTargetPoolsScopedListWarning++;
   if (buildCounterTargetPoolsScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed961();
+    o.data = buildUnnamed551();
     o.message = "foo";
   }
   buildCounterTargetPoolsScopedListWarning--;
@@ -4156,7 +4158,7 @@
   buildCounterTargetPoolsScopedListWarning++;
   if (buildCounterTargetPoolsScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed961(o.data);
+    checkUnnamed551(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterTargetPoolsScopedListWarning--;
@@ -4167,7 +4169,7 @@
   var o = new api.TargetPoolsScopedList();
   buildCounterTargetPoolsScopedList++;
   if (buildCounterTargetPoolsScopedList < 3) {
-    o.targetPools = buildUnnamed960();
+    o.targetPools = buildUnnamed550();
     o.warning = buildTargetPoolsScopedListWarning();
   }
   buildCounterTargetPoolsScopedList--;
@@ -4177,7 +4179,7 @@
 checkTargetPoolsScopedList(api.TargetPoolsScopedList o) {
   buildCounterTargetPoolsScopedList++;
   if (buildCounterTargetPoolsScopedList < 3) {
-    checkUnnamed960(o.targetPools);
+    checkUnnamed550(o.targetPools);
     checkTargetPoolsScopedListWarning(o.warning);
   }
   buildCounterTargetPoolsScopedList--;
@@ -4227,40 +4229,40 @@
   buildCounterTestFailure--;
 }
 
-buildUnnamed962() {
+buildUnnamed552() {
   var o = new core.List<api.HostRule>();
   o.add(buildHostRule());
   o.add(buildHostRule());
   return o;
 }
 
-checkUnnamed962(core.List<api.HostRule> o) {
+checkUnnamed552(core.List<api.HostRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHostRule(o[0]);
   checkHostRule(o[1]);
 }
 
-buildUnnamed963() {
+buildUnnamed553() {
   var o = new core.List<api.PathMatcher>();
   o.add(buildPathMatcher());
   o.add(buildPathMatcher());
   return o;
 }
 
-checkUnnamed963(core.List<api.PathMatcher> o) {
+checkUnnamed553(core.List<api.PathMatcher> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPathMatcher(o[0]);
   checkPathMatcher(o[1]);
 }
 
-buildUnnamed964() {
+buildUnnamed554() {
   var o = new core.List<api.UrlMapTest>();
   o.add(buildUrlMapTest());
   o.add(buildUrlMapTest());
   return o;
 }
 
-checkUnnamed964(core.List<api.UrlMapTest> o) {
+checkUnnamed554(core.List<api.UrlMapTest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlMapTest(o[0]);
   checkUrlMapTest(o[1]);
@@ -4275,13 +4277,13 @@
     o.defaultService = "foo";
     o.description = "foo";
     o.fingerprint = "foo";
-    o.hostRules = buildUnnamed962();
+    o.hostRules = buildUnnamed552();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.pathMatchers = buildUnnamed963();
+    o.pathMatchers = buildUnnamed553();
     o.selfLink = "foo";
-    o.tests = buildUnnamed964();
+    o.tests = buildUnnamed554();
   }
   buildCounterUrlMap--;
   return o;
@@ -4294,25 +4296,25 @@
     unittest.expect(o.defaultService, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed962(o.hostRules);
+    checkUnnamed552(o.hostRules);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed963(o.pathMatchers);
+    checkUnnamed553(o.pathMatchers);
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed964(o.tests);
+    checkUnnamed554(o.tests);
   }
   buildCounterUrlMap--;
 }
 
-buildUnnamed965() {
+buildUnnamed555() {
   var o = new core.List<api.UrlMap>();
   o.add(buildUrlMap());
   o.add(buildUrlMap());
   return o;
 }
 
-checkUnnamed965(core.List<api.UrlMap> o) {
+checkUnnamed555(core.List<api.UrlMap> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlMap(o[0]);
   checkUrlMap(o[1]);
@@ -4324,7 +4326,7 @@
   buildCounterUrlMapList++;
   if (buildCounterUrlMapList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed965();
+    o.items = buildUnnamed555();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -4337,7 +4339,7 @@
   buildCounterUrlMapList++;
   if (buildCounterUrlMapList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed965(o.items);
+    checkUnnamed555(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -4389,27 +4391,27 @@
   buildCounterUrlMapTest--;
 }
 
-buildUnnamed966() {
+buildUnnamed556() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed966(core.List<core.String> 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'));
 }
 
-buildUnnamed967() {
+buildUnnamed557() {
   var o = new core.List<api.TestFailure>();
   o.add(buildTestFailure());
   o.add(buildTestFailure());
   return o;
 }
 
-checkUnnamed967(core.List<api.TestFailure> o) {
+checkUnnamed557(core.List<api.TestFailure> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTestFailure(o[0]);
   checkTestFailure(o[1]);
@@ -4420,9 +4422,9 @@
   var o = new api.UrlMapValidationResult();
   buildCounterUrlMapValidationResult++;
   if (buildCounterUrlMapValidationResult < 3) {
-    o.loadErrors = buildUnnamed966();
+    o.loadErrors = buildUnnamed556();
     o.loadSucceeded = true;
-    o.testFailures = buildUnnamed967();
+    o.testFailures = buildUnnamed557();
     o.testPassed = true;
   }
   buildCounterUrlMapValidationResult--;
@@ -4432,9 +4434,9 @@
 checkUrlMapValidationResult(api.UrlMapValidationResult o) {
   buildCounterUrlMapValidationResult++;
   if (buildCounterUrlMapValidationResult < 3) {
-    checkUnnamed966(o.loadErrors);
+    checkUnnamed556(o.loadErrors);
     unittest.expect(o.loadSucceeded, unittest.isTrue);
-    checkUnnamed967(o.testFailures);
+    checkUnnamed557(o.testFailures);
     unittest.expect(o.testPassed, unittest.isTrue);
   }
   buildCounterUrlMapValidationResult--;
@@ -4524,14 +4526,14 @@
   buildCounterZoneMaintenanceWindows--;
 }
 
-buildUnnamed968() {
+buildUnnamed558() {
   var o = new core.List<api.ZoneMaintenanceWindows>();
   o.add(buildZoneMaintenanceWindows());
   o.add(buildZoneMaintenanceWindows());
   return o;
 }
 
-checkUnnamed968(core.List<api.ZoneMaintenanceWindows> o) {
+checkUnnamed558(core.List<api.ZoneMaintenanceWindows> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkZoneMaintenanceWindows(o[0]);
   checkZoneMaintenanceWindows(o[1]);
@@ -4547,7 +4549,7 @@
     o.description = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.maintenanceWindows = buildUnnamed968();
+    o.maintenanceWindows = buildUnnamed558();
     o.name = "foo";
     o.region = "foo";
     o.selfLink = "foo";
@@ -4565,7 +4567,7 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed968(o.maintenanceWindows);
+    checkUnnamed558(o.maintenanceWindows);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -4574,14 +4576,14 @@
   buildCounterZone--;
 }
 
-buildUnnamed969() {
+buildUnnamed559() {
   var o = new core.List<api.Zone>();
   o.add(buildZone());
   o.add(buildZone());
   return o;
 }
 
-checkUnnamed969(core.List<api.Zone> o) {
+checkUnnamed559(core.List<api.Zone> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkZone(o[0]);
   checkZone(o[1]);
@@ -4593,7 +4595,7 @@
   buildCounterZoneList++;
   if (buildCounterZoneList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed969();
+    o.items = buildUnnamed559();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -4606,7 +4608,7 @@
   buildCounterZoneList++;
   if (buildCounterZoneList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed969(o.items);
+    checkUnnamed559(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
diff --git a/generated/googleapis/test/content/v2_test.dart b/generated/googleapis/test/content/v2_test.dart
index 30a9f4e..9dbb0c0 100644
--- a/generated/googleapis/test/content/v2_test.dart
+++ b/generated/googleapis/test/content/v2_test.dart
@@ -16,27 +16,27 @@
 
 
 
-buildUnnamed295() {
+buildUnnamed560() {
   var o = new core.List<api.AccountAdwordsLink>();
   o.add(buildAccountAdwordsLink());
   o.add(buildAccountAdwordsLink());
   return o;
 }
 
-checkUnnamed295(core.List<api.AccountAdwordsLink> o) {
+checkUnnamed560(core.List<api.AccountAdwordsLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountAdwordsLink(o[0]);
   checkAccountAdwordsLink(o[1]);
 }
 
-buildUnnamed296() {
+buildUnnamed561() {
   var o = new core.List<api.AccountUser>();
   o.add(buildAccountUser());
   o.add(buildAccountUser());
   return o;
 }
 
-checkUnnamed296(core.List<api.AccountUser> o) {
+checkUnnamed561(core.List<api.AccountUser> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountUser(o[0]);
   checkAccountUser(o[1]);
@@ -48,13 +48,13 @@
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
     o.adultContent = true;
-    o.adwordsLinks = buildUnnamed295();
+    o.adwordsLinks = buildUnnamed560();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
     o.reviewsUrl = "foo";
     o.sellerId = "foo";
-    o.users = buildUnnamed296();
+    o.users = buildUnnamed561();
     o.websiteUrl = "foo";
   }
   buildCounterAccount--;
@@ -65,13 +65,13 @@
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
     unittest.expect(o.adultContent, unittest.isTrue);
-    checkUnnamed295(o.adwordsLinks);
+    checkUnnamed560(o.adwordsLinks);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.reviewsUrl, unittest.equals('foo'));
     unittest.expect(o.sellerId, unittest.equals('foo'));
-    checkUnnamed296(o.users);
+    checkUnnamed561(o.users);
     unittest.expect(o.websiteUrl, unittest.equals('foo'));
   }
   buildCounterAccount--;
@@ -98,14 +98,14 @@
   buildCounterAccountAdwordsLink--;
 }
 
-buildUnnamed297() {
+buildUnnamed562() {
   var o = new core.List<api.AccountStatusDataQualityIssue>();
   o.add(buildAccountStatusDataQualityIssue());
   o.add(buildAccountStatusDataQualityIssue());
   return o;
 }
 
-checkUnnamed297(core.List<api.AccountStatusDataQualityIssue> o) {
+checkUnnamed562(core.List<api.AccountStatusDataQualityIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountStatusDataQualityIssue(o[0]);
   checkAccountStatusDataQualityIssue(o[1]);
@@ -117,7 +117,7 @@
   buildCounterAccountStatus++;
   if (buildCounterAccountStatus < 3) {
     o.accountId = "foo";
-    o.dataQualityIssues = buildUnnamed297();
+    o.dataQualityIssues = buildUnnamed562();
     o.kind = "foo";
   }
   buildCounterAccountStatus--;
@@ -128,20 +128,20 @@
   buildCounterAccountStatus++;
   if (buildCounterAccountStatus < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkUnnamed297(o.dataQualityIssues);
+    checkUnnamed562(o.dataQualityIssues);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountStatus--;
 }
 
-buildUnnamed298() {
+buildUnnamed563() {
   var o = new core.List<api.AccountStatusExampleItem>();
   o.add(buildAccountStatusExampleItem());
   o.add(buildAccountStatusExampleItem());
   return o;
 }
 
-checkUnnamed298(core.List<api.AccountStatusExampleItem> o) {
+checkUnnamed563(core.List<api.AccountStatusExampleItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountStatusExampleItem(o[0]);
   checkAccountStatusExampleItem(o[1]);
@@ -154,7 +154,7 @@
   if (buildCounterAccountStatusDataQualityIssue < 3) {
     o.country = "foo";
     o.displayedValue = "foo";
-    o.exampleItems = buildUnnamed298();
+    o.exampleItems = buildUnnamed563();
     o.id = "foo";
     o.lastChecked = "foo";
     o.numItems = 42;
@@ -170,7 +170,7 @@
   if (buildCounterAccountStatusDataQualityIssue < 3) {
     unittest.expect(o.country, unittest.equals('foo'));
     unittest.expect(o.displayedValue, unittest.equals('foo'));
-    checkUnnamed298(o.exampleItems);
+    checkUnnamed563(o.exampleItems);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.lastChecked, unittest.equals('foo'));
     unittest.expect(o.numItems, unittest.equals(42));
@@ -228,14 +228,14 @@
   buildCounterAccountUser--;
 }
 
-buildUnnamed299() {
+buildUnnamed564() {
   var o = new core.List<api.AccountsCustomBatchRequestEntry>();
   o.add(buildAccountsCustomBatchRequestEntry());
   o.add(buildAccountsCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed299(core.List<api.AccountsCustomBatchRequestEntry> o) {
+checkUnnamed564(core.List<api.AccountsCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountsCustomBatchRequestEntry(o[0]);
   checkAccountsCustomBatchRequestEntry(o[1]);
@@ -246,7 +246,7 @@
   var o = new api.AccountsCustomBatchRequest();
   buildCounterAccountsCustomBatchRequest++;
   if (buildCounterAccountsCustomBatchRequest < 3) {
-    o.entries = buildUnnamed299();
+    o.entries = buildUnnamed564();
   }
   buildCounterAccountsCustomBatchRequest--;
   return o;
@@ -255,7 +255,7 @@
 checkAccountsCustomBatchRequest(api.AccountsCustomBatchRequest o) {
   buildCounterAccountsCustomBatchRequest++;
   if (buildCounterAccountsCustomBatchRequest < 3) {
-    checkUnnamed299(o.entries);
+    checkUnnamed564(o.entries);
   }
   buildCounterAccountsCustomBatchRequest--;
 }
@@ -287,14 +287,14 @@
   buildCounterAccountsCustomBatchRequestEntry--;
 }
 
-buildUnnamed300() {
+buildUnnamed565() {
   var o = new core.List<api.AccountsCustomBatchResponseEntry>();
   o.add(buildAccountsCustomBatchResponseEntry());
   o.add(buildAccountsCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed300(core.List<api.AccountsCustomBatchResponseEntry> o) {
+checkUnnamed565(core.List<api.AccountsCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountsCustomBatchResponseEntry(o[0]);
   checkAccountsCustomBatchResponseEntry(o[1]);
@@ -305,7 +305,7 @@
   var o = new api.AccountsCustomBatchResponse();
   buildCounterAccountsCustomBatchResponse++;
   if (buildCounterAccountsCustomBatchResponse < 3) {
-    o.entries = buildUnnamed300();
+    o.entries = buildUnnamed565();
     o.kind = "foo";
   }
   buildCounterAccountsCustomBatchResponse--;
@@ -315,7 +315,7 @@
 checkAccountsCustomBatchResponse(api.AccountsCustomBatchResponse o) {
   buildCounterAccountsCustomBatchResponse++;
   if (buildCounterAccountsCustomBatchResponse < 3) {
-    checkUnnamed300(o.entries);
+    checkUnnamed565(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountsCustomBatchResponse--;
@@ -346,14 +346,14 @@
   buildCounterAccountsCustomBatchResponseEntry--;
 }
 
-buildUnnamed301() {
+buildUnnamed566() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed301(core.List<api.Account> o) {
+checkUnnamed566(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -366,7 +366,7 @@
   if (buildCounterAccountsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed301();
+    o.resources = buildUnnamed566();
   }
   buildCounterAccountsListResponse--;
   return o;
@@ -377,19 +377,19 @@
   if (buildCounterAccountsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed301(o.resources);
+    checkUnnamed566(o.resources);
   }
   buildCounterAccountsListResponse--;
 }
 
-buildUnnamed302() {
+buildUnnamed567() {
   var o = new core.List<api.AccountstatusesCustomBatchRequestEntry>();
   o.add(buildAccountstatusesCustomBatchRequestEntry());
   o.add(buildAccountstatusesCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed302(core.List<api.AccountstatusesCustomBatchRequestEntry> o) {
+checkUnnamed567(core.List<api.AccountstatusesCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountstatusesCustomBatchRequestEntry(o[0]);
   checkAccountstatusesCustomBatchRequestEntry(o[1]);
@@ -400,7 +400,7 @@
   var o = new api.AccountstatusesCustomBatchRequest();
   buildCounterAccountstatusesCustomBatchRequest++;
   if (buildCounterAccountstatusesCustomBatchRequest < 3) {
-    o.entries = buildUnnamed302();
+    o.entries = buildUnnamed567();
   }
   buildCounterAccountstatusesCustomBatchRequest--;
   return o;
@@ -409,7 +409,7 @@
 checkAccountstatusesCustomBatchRequest(api.AccountstatusesCustomBatchRequest o) {
   buildCounterAccountstatusesCustomBatchRequest++;
   if (buildCounterAccountstatusesCustomBatchRequest < 3) {
-    checkUnnamed302(o.entries);
+    checkUnnamed567(o.entries);
   }
   buildCounterAccountstatusesCustomBatchRequest--;
 }
@@ -439,14 +439,14 @@
   buildCounterAccountstatusesCustomBatchRequestEntry--;
 }
 
-buildUnnamed303() {
+buildUnnamed568() {
   var o = new core.List<api.AccountstatusesCustomBatchResponseEntry>();
   o.add(buildAccountstatusesCustomBatchResponseEntry());
   o.add(buildAccountstatusesCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed303(core.List<api.AccountstatusesCustomBatchResponseEntry> o) {
+checkUnnamed568(core.List<api.AccountstatusesCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountstatusesCustomBatchResponseEntry(o[0]);
   checkAccountstatusesCustomBatchResponseEntry(o[1]);
@@ -457,7 +457,7 @@
   var o = new api.AccountstatusesCustomBatchResponse();
   buildCounterAccountstatusesCustomBatchResponse++;
   if (buildCounterAccountstatusesCustomBatchResponse < 3) {
-    o.entries = buildUnnamed303();
+    o.entries = buildUnnamed568();
     o.kind = "foo";
   }
   buildCounterAccountstatusesCustomBatchResponse--;
@@ -467,7 +467,7 @@
 checkAccountstatusesCustomBatchResponse(api.AccountstatusesCustomBatchResponse o) {
   buildCounterAccountstatusesCustomBatchResponse++;
   if (buildCounterAccountstatusesCustomBatchResponse < 3) {
-    checkUnnamed303(o.entries);
+    checkUnnamed568(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountstatusesCustomBatchResponse--;
@@ -496,14 +496,14 @@
   buildCounterAccountstatusesCustomBatchResponseEntry--;
 }
 
-buildUnnamed304() {
+buildUnnamed569() {
   var o = new core.List<api.AccountStatus>();
   o.add(buildAccountStatus());
   o.add(buildAccountStatus());
   return o;
 }
 
-checkUnnamed304(core.List<api.AccountStatus> o) {
+checkUnnamed569(core.List<api.AccountStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountStatus(o[0]);
   checkAccountStatus(o[1]);
@@ -516,7 +516,7 @@
   if (buildCounterAccountstatusesListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed304();
+    o.resources = buildUnnamed569();
   }
   buildCounterAccountstatusesListResponse--;
   return o;
@@ -527,19 +527,19 @@
   if (buildCounterAccountstatusesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed304(o.resources);
+    checkUnnamed569(o.resources);
   }
   buildCounterAccountstatusesListResponse--;
 }
 
-buildUnnamed305() {
+buildUnnamed570() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed305(core.List<core.String> o) {
+checkUnnamed570(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -557,7 +557,7 @@
     o.fileName = "foo";
     o.format = buildDatafeedFormat();
     o.id = "foo";
-    o.intendedDestinations = buildUnnamed305();
+    o.intendedDestinations = buildUnnamed570();
     o.kind = "foo";
     o.name = "foo";
     o.targetCountry = "foo";
@@ -576,7 +576,7 @@
     unittest.expect(o.fileName, unittest.equals('foo'));
     checkDatafeedFormat(o.format);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed305(o.intendedDestinations);
+    checkUnnamed570(o.intendedDestinations);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.targetCountry, unittest.equals('foo'));
@@ -638,27 +638,27 @@
   buildCounterDatafeedFormat--;
 }
 
-buildUnnamed306() {
+buildUnnamed571() {
   var o = new core.List<api.DatafeedStatusError>();
   o.add(buildDatafeedStatusError());
   o.add(buildDatafeedStatusError());
   return o;
 }
 
-checkUnnamed306(core.List<api.DatafeedStatusError> o) {
+checkUnnamed571(core.List<api.DatafeedStatusError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedStatusError(o[0]);
   checkDatafeedStatusError(o[1]);
 }
 
-buildUnnamed307() {
+buildUnnamed572() {
   var o = new core.List<api.DatafeedStatusError>();
   o.add(buildDatafeedStatusError());
   o.add(buildDatafeedStatusError());
   return o;
 }
 
-checkUnnamed307(core.List<api.DatafeedStatusError> o) {
+checkUnnamed572(core.List<api.DatafeedStatusError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedStatusError(o[0]);
   checkDatafeedStatusError(o[1]);
@@ -670,12 +670,12 @@
   buildCounterDatafeedStatus++;
   if (buildCounterDatafeedStatus < 3) {
     o.datafeedId = "foo";
-    o.errors = buildUnnamed306();
+    o.errors = buildUnnamed571();
     o.itemsTotal = "foo";
     o.itemsValid = "foo";
     o.kind = "foo";
     o.processingStatus = "foo";
-    o.warnings = buildUnnamed307();
+    o.warnings = buildUnnamed572();
   }
   buildCounterDatafeedStatus--;
   return o;
@@ -685,24 +685,24 @@
   buildCounterDatafeedStatus++;
   if (buildCounterDatafeedStatus < 3) {
     unittest.expect(o.datafeedId, unittest.equals('foo'));
-    checkUnnamed306(o.errors);
+    checkUnnamed571(o.errors);
     unittest.expect(o.itemsTotal, unittest.equals('foo'));
     unittest.expect(o.itemsValid, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.processingStatus, unittest.equals('foo'));
-    checkUnnamed307(o.warnings);
+    checkUnnamed572(o.warnings);
   }
   buildCounterDatafeedStatus--;
 }
 
-buildUnnamed308() {
+buildUnnamed573() {
   var o = new core.List<api.DatafeedStatusExample>();
   o.add(buildDatafeedStatusExample());
   o.add(buildDatafeedStatusExample());
   return o;
 }
 
-checkUnnamed308(core.List<api.DatafeedStatusExample> o) {
+checkUnnamed573(core.List<api.DatafeedStatusExample> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedStatusExample(o[0]);
   checkDatafeedStatusExample(o[1]);
@@ -715,7 +715,7 @@
   if (buildCounterDatafeedStatusError < 3) {
     o.code = "foo";
     o.count = "foo";
-    o.examples = buildUnnamed308();
+    o.examples = buildUnnamed573();
     o.message = "foo";
   }
   buildCounterDatafeedStatusError--;
@@ -727,7 +727,7 @@
   if (buildCounterDatafeedStatusError < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
     unittest.expect(o.count, unittest.equals('foo'));
-    checkUnnamed308(o.examples);
+    checkUnnamed573(o.examples);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterDatafeedStatusError--;
@@ -756,14 +756,14 @@
   buildCounterDatafeedStatusExample--;
 }
 
-buildUnnamed309() {
+buildUnnamed574() {
   var o = new core.List<api.DatafeedsCustomBatchRequestEntry>();
   o.add(buildDatafeedsCustomBatchRequestEntry());
   o.add(buildDatafeedsCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed309(core.List<api.DatafeedsCustomBatchRequestEntry> o) {
+checkUnnamed574(core.List<api.DatafeedsCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedsCustomBatchRequestEntry(o[0]);
   checkDatafeedsCustomBatchRequestEntry(o[1]);
@@ -774,7 +774,7 @@
   var o = new api.DatafeedsCustomBatchRequest();
   buildCounterDatafeedsCustomBatchRequest++;
   if (buildCounterDatafeedsCustomBatchRequest < 3) {
-    o.entries = buildUnnamed309();
+    o.entries = buildUnnamed574();
   }
   buildCounterDatafeedsCustomBatchRequest--;
   return o;
@@ -783,7 +783,7 @@
 checkDatafeedsCustomBatchRequest(api.DatafeedsCustomBatchRequest o) {
   buildCounterDatafeedsCustomBatchRequest++;
   if (buildCounterDatafeedsCustomBatchRequest < 3) {
-    checkUnnamed309(o.entries);
+    checkUnnamed574(o.entries);
   }
   buildCounterDatafeedsCustomBatchRequest--;
 }
@@ -815,14 +815,14 @@
   buildCounterDatafeedsCustomBatchRequestEntry--;
 }
 
-buildUnnamed310() {
+buildUnnamed575() {
   var o = new core.List<api.DatafeedsCustomBatchResponseEntry>();
   o.add(buildDatafeedsCustomBatchResponseEntry());
   o.add(buildDatafeedsCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed310(core.List<api.DatafeedsCustomBatchResponseEntry> o) {
+checkUnnamed575(core.List<api.DatafeedsCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedsCustomBatchResponseEntry(o[0]);
   checkDatafeedsCustomBatchResponseEntry(o[1]);
@@ -833,7 +833,7 @@
   var o = new api.DatafeedsCustomBatchResponse();
   buildCounterDatafeedsCustomBatchResponse++;
   if (buildCounterDatafeedsCustomBatchResponse < 3) {
-    o.entries = buildUnnamed310();
+    o.entries = buildUnnamed575();
     o.kind = "foo";
   }
   buildCounterDatafeedsCustomBatchResponse--;
@@ -843,7 +843,7 @@
 checkDatafeedsCustomBatchResponse(api.DatafeedsCustomBatchResponse o) {
   buildCounterDatafeedsCustomBatchResponse++;
   if (buildCounterDatafeedsCustomBatchResponse < 3) {
-    checkUnnamed310(o.entries);
+    checkUnnamed575(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDatafeedsCustomBatchResponse--;
@@ -872,14 +872,14 @@
   buildCounterDatafeedsCustomBatchResponseEntry--;
 }
 
-buildUnnamed311() {
+buildUnnamed576() {
   var o = new core.List<api.Datafeed>();
   o.add(buildDatafeed());
   o.add(buildDatafeed());
   return o;
 }
 
-checkUnnamed311(core.List<api.Datafeed> o) {
+checkUnnamed576(core.List<api.Datafeed> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeed(o[0]);
   checkDatafeed(o[1]);
@@ -891,7 +891,8 @@
   buildCounterDatafeedsListResponse++;
   if (buildCounterDatafeedsListResponse < 3) {
     o.kind = "foo";
-    o.resources = buildUnnamed311();
+    o.nextPageToken = "foo";
+    o.resources = buildUnnamed576();
   }
   buildCounterDatafeedsListResponse--;
   return o;
@@ -901,19 +902,20 @@
   buildCounterDatafeedsListResponse++;
   if (buildCounterDatafeedsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed311(o.resources);
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+    checkUnnamed576(o.resources);
   }
   buildCounterDatafeedsListResponse--;
 }
 
-buildUnnamed312() {
+buildUnnamed577() {
   var o = new core.List<api.DatafeedstatusesCustomBatchRequestEntry>();
   o.add(buildDatafeedstatusesCustomBatchRequestEntry());
   o.add(buildDatafeedstatusesCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed312(core.List<api.DatafeedstatusesCustomBatchRequestEntry> o) {
+checkUnnamed577(core.List<api.DatafeedstatusesCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedstatusesCustomBatchRequestEntry(o[0]);
   checkDatafeedstatusesCustomBatchRequestEntry(o[1]);
@@ -924,7 +926,7 @@
   var o = new api.DatafeedstatusesCustomBatchRequest();
   buildCounterDatafeedstatusesCustomBatchRequest++;
   if (buildCounterDatafeedstatusesCustomBatchRequest < 3) {
-    o.entries = buildUnnamed312();
+    o.entries = buildUnnamed577();
   }
   buildCounterDatafeedstatusesCustomBatchRequest--;
   return o;
@@ -933,7 +935,7 @@
 checkDatafeedstatusesCustomBatchRequest(api.DatafeedstatusesCustomBatchRequest o) {
   buildCounterDatafeedstatusesCustomBatchRequest++;
   if (buildCounterDatafeedstatusesCustomBatchRequest < 3) {
-    checkUnnamed312(o.entries);
+    checkUnnamed577(o.entries);
   }
   buildCounterDatafeedstatusesCustomBatchRequest--;
 }
@@ -963,14 +965,14 @@
   buildCounterDatafeedstatusesCustomBatchRequestEntry--;
 }
 
-buildUnnamed313() {
+buildUnnamed578() {
   var o = new core.List<api.DatafeedstatusesCustomBatchResponseEntry>();
   o.add(buildDatafeedstatusesCustomBatchResponseEntry());
   o.add(buildDatafeedstatusesCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed313(core.List<api.DatafeedstatusesCustomBatchResponseEntry> o) {
+checkUnnamed578(core.List<api.DatafeedstatusesCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedstatusesCustomBatchResponseEntry(o[0]);
   checkDatafeedstatusesCustomBatchResponseEntry(o[1]);
@@ -981,7 +983,7 @@
   var o = new api.DatafeedstatusesCustomBatchResponse();
   buildCounterDatafeedstatusesCustomBatchResponse++;
   if (buildCounterDatafeedstatusesCustomBatchResponse < 3) {
-    o.entries = buildUnnamed313();
+    o.entries = buildUnnamed578();
     o.kind = "foo";
   }
   buildCounterDatafeedstatusesCustomBatchResponse--;
@@ -991,7 +993,7 @@
 checkDatafeedstatusesCustomBatchResponse(api.DatafeedstatusesCustomBatchResponse o) {
   buildCounterDatafeedstatusesCustomBatchResponse++;
   if (buildCounterDatafeedstatusesCustomBatchResponse < 3) {
-    checkUnnamed313(o.entries);
+    checkUnnamed578(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDatafeedstatusesCustomBatchResponse--;
@@ -1020,14 +1022,14 @@
   buildCounterDatafeedstatusesCustomBatchResponseEntry--;
 }
 
-buildUnnamed314() {
+buildUnnamed579() {
   var o = new core.List<api.DatafeedStatus>();
   o.add(buildDatafeedStatus());
   o.add(buildDatafeedStatus());
   return o;
 }
 
-checkUnnamed314(core.List<api.DatafeedStatus> o) {
+checkUnnamed579(core.List<api.DatafeedStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedStatus(o[0]);
   checkDatafeedStatus(o[1]);
@@ -1039,7 +1041,8 @@
   buildCounterDatafeedstatusesListResponse++;
   if (buildCounterDatafeedstatusesListResponse < 3) {
     o.kind = "foo";
-    o.resources = buildUnnamed314();
+    o.nextPageToken = "foo";
+    o.resources = buildUnnamed579();
   }
   buildCounterDatafeedstatusesListResponse--;
   return o;
@@ -1049,7 +1052,8 @@
   buildCounterDatafeedstatusesListResponse++;
   if (buildCounterDatafeedstatusesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed314(o.resources);
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+    checkUnnamed579(o.resources);
   }
   buildCounterDatafeedstatusesListResponse--;
 }
@@ -1077,14 +1081,14 @@
   buildCounterError--;
 }
 
-buildUnnamed315() {
+buildUnnamed580() {
   var o = new core.List<api.Error>();
   o.add(buildError());
   o.add(buildError());
   return o;
 }
 
-checkUnnamed315(core.List<api.Error> o) {
+checkUnnamed580(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkError(o[0]);
   checkError(o[1]);
@@ -1096,7 +1100,7 @@
   buildCounterErrors++;
   if (buildCounterErrors < 3) {
     o.code = 42;
-    o.errors = buildUnnamed315();
+    o.errors = buildUnnamed580();
     o.message = "foo";
   }
   buildCounterErrors--;
@@ -1107,7 +1111,7 @@
   buildCounterErrors++;
   if (buildCounterErrors < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed315(o.errors);
+    checkUnnamed580(o.errors);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterErrors--;
@@ -1142,14 +1146,14 @@
   buildCounterInventory--;
 }
 
-buildUnnamed316() {
+buildUnnamed581() {
   var o = new core.List<api.InventoryCustomBatchRequestEntry>();
   o.add(buildInventoryCustomBatchRequestEntry());
   o.add(buildInventoryCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed316(core.List<api.InventoryCustomBatchRequestEntry> o) {
+checkUnnamed581(core.List<api.InventoryCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInventoryCustomBatchRequestEntry(o[0]);
   checkInventoryCustomBatchRequestEntry(o[1]);
@@ -1160,7 +1164,7 @@
   var o = new api.InventoryCustomBatchRequest();
   buildCounterInventoryCustomBatchRequest++;
   if (buildCounterInventoryCustomBatchRequest < 3) {
-    o.entries = buildUnnamed316();
+    o.entries = buildUnnamed581();
   }
   buildCounterInventoryCustomBatchRequest--;
   return o;
@@ -1169,7 +1173,7 @@
 checkInventoryCustomBatchRequest(api.InventoryCustomBatchRequest o) {
   buildCounterInventoryCustomBatchRequest++;
   if (buildCounterInventoryCustomBatchRequest < 3) {
-    checkUnnamed316(o.entries);
+    checkUnnamed581(o.entries);
   }
   buildCounterInventoryCustomBatchRequest--;
 }
@@ -1201,14 +1205,14 @@
   buildCounterInventoryCustomBatchRequestEntry--;
 }
 
-buildUnnamed317() {
+buildUnnamed582() {
   var o = new core.List<api.InventoryCustomBatchResponseEntry>();
   o.add(buildInventoryCustomBatchResponseEntry());
   o.add(buildInventoryCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed317(core.List<api.InventoryCustomBatchResponseEntry> o) {
+checkUnnamed582(core.List<api.InventoryCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInventoryCustomBatchResponseEntry(o[0]);
   checkInventoryCustomBatchResponseEntry(o[1]);
@@ -1219,7 +1223,7 @@
   var o = new api.InventoryCustomBatchResponse();
   buildCounterInventoryCustomBatchResponse++;
   if (buildCounterInventoryCustomBatchResponse < 3) {
-    o.entries = buildUnnamed317();
+    o.entries = buildUnnamed582();
     o.kind = "foo";
   }
   buildCounterInventoryCustomBatchResponse--;
@@ -1229,7 +1233,7 @@
 checkInventoryCustomBatchResponse(api.InventoryCustomBatchResponse o) {
   buildCounterInventoryCustomBatchResponse++;
   if (buildCounterInventoryCustomBatchResponse < 3) {
-    checkUnnamed317(o.entries);
+    checkUnnamed582(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterInventoryCustomBatchResponse--;
@@ -1348,131 +1352,131 @@
   buildCounterPrice--;
 }
 
-buildUnnamed318() {
+buildUnnamed583() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed318(core.List<core.String> o) {
+checkUnnamed583(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed319() {
+buildUnnamed584() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed319(core.List<core.String> 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'));
 }
 
-buildUnnamed320() {
+buildUnnamed585() {
   var o = new core.List<api.ProductCustomAttribute>();
   o.add(buildProductCustomAttribute());
   o.add(buildProductCustomAttribute());
   return o;
 }
 
-checkUnnamed320(core.List<api.ProductCustomAttribute> o) {
+checkUnnamed585(core.List<api.ProductCustomAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductCustomAttribute(o[0]);
   checkProductCustomAttribute(o[1]);
 }
 
-buildUnnamed321() {
+buildUnnamed586() {
   var o = new core.List<api.ProductCustomGroup>();
   o.add(buildProductCustomGroup());
   o.add(buildProductCustomGroup());
   return o;
 }
 
-checkUnnamed321(core.List<api.ProductCustomGroup> o) {
+checkUnnamed586(core.List<api.ProductCustomGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductCustomGroup(o[0]);
   checkProductCustomGroup(o[1]);
 }
 
-buildUnnamed322() {
+buildUnnamed587() {
   var o = new core.List<api.ProductDestination>();
   o.add(buildProductDestination());
   o.add(buildProductDestination());
   return o;
 }
 
-checkUnnamed322(core.List<api.ProductDestination> o) {
+checkUnnamed587(core.List<api.ProductDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductDestination(o[0]);
   checkProductDestination(o[1]);
 }
 
-buildUnnamed323() {
+buildUnnamed588() {
   var o = new core.List<api.ProductShipping>();
   o.add(buildProductShipping());
   o.add(buildProductShipping());
   return o;
 }
 
-checkUnnamed323(core.List<api.ProductShipping> o) {
+checkUnnamed588(core.List<api.ProductShipping> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductShipping(o[0]);
   checkProductShipping(o[1]);
 }
 
-buildUnnamed324() {
+buildUnnamed589() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed324(core.List<core.String> o) {
+checkUnnamed589(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed325() {
+buildUnnamed590() {
   var o = new core.List<api.ProductTax>();
   o.add(buildProductTax());
   o.add(buildProductTax());
   return o;
 }
 
-checkUnnamed325(core.List<api.ProductTax> o) {
+checkUnnamed590(core.List<api.ProductTax> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductTax(o[0]);
   checkProductTax(o[1]);
 }
 
-buildUnnamed326() {
+buildUnnamed591() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed326(core.List<core.String> o) {
+checkUnnamed591(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed327() {
+buildUnnamed592() {
   var o = new core.List<api.Error>();
   o.add(buildError());
   o.add(buildError());
   return o;
 }
 
-checkUnnamed327(core.List<api.Error> o) {
+checkUnnamed592(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkError(o[0]);
   checkError(o[1]);
@@ -1483,10 +1487,10 @@
   var o = new api.Product();
   buildCounterProduct++;
   if (buildCounterProduct < 3) {
-    o.additionalImageLinks = buildUnnamed318();
+    o.additionalImageLinks = buildUnnamed583();
     o.adult = true;
     o.adwordsGrouping = "foo";
-    o.adwordsLabels = buildUnnamed319();
+    o.adwordsLabels = buildUnnamed584();
     o.adwordsRedirect = "foo";
     o.ageGroup = "foo";
     o.availability = "foo";
@@ -1496,15 +1500,15 @@
     o.color = "foo";
     o.condition = "foo";
     o.contentLanguage = "foo";
-    o.customAttributes = buildUnnamed320();
-    o.customGroups = buildUnnamed321();
+    o.customAttributes = buildUnnamed585();
+    o.customGroups = buildUnnamed586();
     o.customLabel0 = "foo";
     o.customLabel1 = "foo";
     o.customLabel2 = "foo";
     o.customLabel3 = "foo";
     o.customLabel4 = "foo";
     o.description = "foo";
-    o.destinations = buildUnnamed322();
+    o.destinations = buildUnnamed587();
     o.energyEfficiencyClass = "foo";
     o.expirationDate = "foo";
     o.gender = "foo";
@@ -1530,19 +1534,19 @@
     o.productType = "foo";
     o.salePrice = buildPrice();
     o.salePriceEffectiveDate = "foo";
-    o.shipping = buildUnnamed323();
+    o.shipping = buildUnnamed588();
     o.shippingLabel = "foo";
     o.shippingWeight = buildProductShippingWeight();
     o.sizeSystem = "foo";
     o.sizeType = "foo";
-    o.sizes = buildUnnamed324();
+    o.sizes = buildUnnamed589();
     o.targetCountry = "foo";
-    o.taxes = buildUnnamed325();
+    o.taxes = buildUnnamed590();
     o.title = "foo";
     o.unitPricingBaseMeasure = buildProductUnitPricingBaseMeasure();
     o.unitPricingMeasure = buildProductUnitPricingMeasure();
-    o.validatedDestinations = buildUnnamed326();
-    o.warnings = buildUnnamed327();
+    o.validatedDestinations = buildUnnamed591();
+    o.warnings = buildUnnamed592();
   }
   buildCounterProduct--;
   return o;
@@ -1551,10 +1555,10 @@
 checkProduct(api.Product o) {
   buildCounterProduct++;
   if (buildCounterProduct < 3) {
-    checkUnnamed318(o.additionalImageLinks);
+    checkUnnamed583(o.additionalImageLinks);
     unittest.expect(o.adult, unittest.isTrue);
     unittest.expect(o.adwordsGrouping, unittest.equals('foo'));
-    checkUnnamed319(o.adwordsLabels);
+    checkUnnamed584(o.adwordsLabels);
     unittest.expect(o.adwordsRedirect, unittest.equals('foo'));
     unittest.expect(o.ageGroup, unittest.equals('foo'));
     unittest.expect(o.availability, unittest.equals('foo'));
@@ -1564,15 +1568,15 @@
     unittest.expect(o.color, unittest.equals('foo'));
     unittest.expect(o.condition, unittest.equals('foo'));
     unittest.expect(o.contentLanguage, unittest.equals('foo'));
-    checkUnnamed320(o.customAttributes);
-    checkUnnamed321(o.customGroups);
+    checkUnnamed585(o.customAttributes);
+    checkUnnamed586(o.customGroups);
     unittest.expect(o.customLabel0, unittest.equals('foo'));
     unittest.expect(o.customLabel1, unittest.equals('foo'));
     unittest.expect(o.customLabel2, unittest.equals('foo'));
     unittest.expect(o.customLabel3, unittest.equals('foo'));
     unittest.expect(o.customLabel4, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed322(o.destinations);
+    checkUnnamed587(o.destinations);
     unittest.expect(o.energyEfficiencyClass, unittest.equals('foo'));
     unittest.expect(o.expirationDate, unittest.equals('foo'));
     unittest.expect(o.gender, unittest.equals('foo'));
@@ -1598,19 +1602,19 @@
     unittest.expect(o.productType, unittest.equals('foo'));
     checkPrice(o.salePrice);
     unittest.expect(o.salePriceEffectiveDate, unittest.equals('foo'));
-    checkUnnamed323(o.shipping);
+    checkUnnamed588(o.shipping);
     unittest.expect(o.shippingLabel, unittest.equals('foo'));
     checkProductShippingWeight(o.shippingWeight);
     unittest.expect(o.sizeSystem, unittest.equals('foo'));
     unittest.expect(o.sizeType, unittest.equals('foo'));
-    checkUnnamed324(o.sizes);
+    checkUnnamed589(o.sizes);
     unittest.expect(o.targetCountry, unittest.equals('foo'));
-    checkUnnamed325(o.taxes);
+    checkUnnamed590(o.taxes);
     unittest.expect(o.title, unittest.equals('foo'));
     checkProductUnitPricingBaseMeasure(o.unitPricingBaseMeasure);
     checkProductUnitPricingMeasure(o.unitPricingMeasure);
-    checkUnnamed326(o.validatedDestinations);
-    checkUnnamed327(o.warnings);
+    checkUnnamed591(o.validatedDestinations);
+    checkUnnamed592(o.warnings);
   }
   buildCounterProduct--;
 }
@@ -1640,14 +1644,14 @@
   buildCounterProductCustomAttribute--;
 }
 
-buildUnnamed328() {
+buildUnnamed593() {
   var o = new core.List<api.ProductCustomAttribute>();
   o.add(buildProductCustomAttribute());
   o.add(buildProductCustomAttribute());
   return o;
 }
 
-checkUnnamed328(core.List<api.ProductCustomAttribute> o) {
+checkUnnamed593(core.List<api.ProductCustomAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductCustomAttribute(o[0]);
   checkProductCustomAttribute(o[1]);
@@ -1658,7 +1662,7 @@
   var o = new api.ProductCustomGroup();
   buildCounterProductCustomGroup++;
   if (buildCounterProductCustomGroup < 3) {
-    o.attributes = buildUnnamed328();
+    o.attributes = buildUnnamed593();
     o.name = "foo";
   }
   buildCounterProductCustomGroup--;
@@ -1668,7 +1672,7 @@
 checkProductCustomGroup(api.ProductCustomGroup o) {
   buildCounterProductCustomGroup++;
   if (buildCounterProductCustomGroup < 3) {
-    checkUnnamed328(o.attributes);
+    checkUnnamed593(o.attributes);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterProductCustomGroup--;
@@ -1768,27 +1772,27 @@
   buildCounterProductShippingWeight--;
 }
 
-buildUnnamed329() {
+buildUnnamed594() {
   var o = new core.List<api.ProductStatusDataQualityIssue>();
   o.add(buildProductStatusDataQualityIssue());
   o.add(buildProductStatusDataQualityIssue());
   return o;
 }
 
-checkUnnamed329(core.List<api.ProductStatusDataQualityIssue> o) {
+checkUnnamed594(core.List<api.ProductStatusDataQualityIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductStatusDataQualityIssue(o[0]);
   checkProductStatusDataQualityIssue(o[1]);
 }
 
-buildUnnamed330() {
+buildUnnamed595() {
   var o = new core.List<api.ProductStatusDestinationStatus>();
   o.add(buildProductStatusDestinationStatus());
   o.add(buildProductStatusDestinationStatus());
   return o;
 }
 
-checkUnnamed330(core.List<api.ProductStatusDestinationStatus> o) {
+checkUnnamed595(core.List<api.ProductStatusDestinationStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductStatusDestinationStatus(o[0]);
   checkProductStatusDestinationStatus(o[1]);
@@ -1799,8 +1803,8 @@
   var o = new api.ProductStatus();
   buildCounterProductStatus++;
   if (buildCounterProductStatus < 3) {
-    o.dataQualityIssues = buildUnnamed329();
-    o.destinationStatuses = buildUnnamed330();
+    o.dataQualityIssues = buildUnnamed594();
+    o.destinationStatuses = buildUnnamed595();
     o.kind = "foo";
     o.link = "foo";
     o.productId = "foo";
@@ -1813,8 +1817,8 @@
 checkProductStatus(api.ProductStatus o) {
   buildCounterProductStatus++;
   if (buildCounterProductStatus < 3) {
-    checkUnnamed329(o.dataQualityIssues);
-    checkUnnamed330(o.destinationStatuses);
+    checkUnnamed594(o.dataQualityIssues);
+    checkUnnamed595(o.destinationStatuses);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.link, unittest.equals('foo'));
     unittest.expect(o.productId, unittest.equals('foo'));
@@ -1948,14 +1952,14 @@
   buildCounterProductUnitPricingMeasure--;
 }
 
-buildUnnamed331() {
+buildUnnamed596() {
   var o = new core.List<api.ProductsCustomBatchRequestEntry>();
   o.add(buildProductsCustomBatchRequestEntry());
   o.add(buildProductsCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed331(core.List<api.ProductsCustomBatchRequestEntry> o) {
+checkUnnamed596(core.List<api.ProductsCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductsCustomBatchRequestEntry(o[0]);
   checkProductsCustomBatchRequestEntry(o[1]);
@@ -1966,7 +1970,7 @@
   var o = new api.ProductsCustomBatchRequest();
   buildCounterProductsCustomBatchRequest++;
   if (buildCounterProductsCustomBatchRequest < 3) {
-    o.entries = buildUnnamed331();
+    o.entries = buildUnnamed596();
   }
   buildCounterProductsCustomBatchRequest--;
   return o;
@@ -1975,7 +1979,7 @@
 checkProductsCustomBatchRequest(api.ProductsCustomBatchRequest o) {
   buildCounterProductsCustomBatchRequest++;
   if (buildCounterProductsCustomBatchRequest < 3) {
-    checkUnnamed331(o.entries);
+    checkUnnamed596(o.entries);
   }
   buildCounterProductsCustomBatchRequest--;
 }
@@ -2007,14 +2011,14 @@
   buildCounterProductsCustomBatchRequestEntry--;
 }
 
-buildUnnamed332() {
+buildUnnamed597() {
   var o = new core.List<api.ProductsCustomBatchResponseEntry>();
   o.add(buildProductsCustomBatchResponseEntry());
   o.add(buildProductsCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed332(core.List<api.ProductsCustomBatchResponseEntry> o) {
+checkUnnamed597(core.List<api.ProductsCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductsCustomBatchResponseEntry(o[0]);
   checkProductsCustomBatchResponseEntry(o[1]);
@@ -2025,7 +2029,7 @@
   var o = new api.ProductsCustomBatchResponse();
   buildCounterProductsCustomBatchResponse++;
   if (buildCounterProductsCustomBatchResponse < 3) {
-    o.entries = buildUnnamed332();
+    o.entries = buildUnnamed597();
     o.kind = "foo";
   }
   buildCounterProductsCustomBatchResponse--;
@@ -2035,7 +2039,7 @@
 checkProductsCustomBatchResponse(api.ProductsCustomBatchResponse o) {
   buildCounterProductsCustomBatchResponse++;
   if (buildCounterProductsCustomBatchResponse < 3) {
-    checkUnnamed332(o.entries);
+    checkUnnamed597(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterProductsCustomBatchResponse--;
@@ -2066,14 +2070,14 @@
   buildCounterProductsCustomBatchResponseEntry--;
 }
 
-buildUnnamed333() {
+buildUnnamed598() {
   var o = new core.List<api.Product>();
   o.add(buildProduct());
   o.add(buildProduct());
   return o;
 }
 
-checkUnnamed333(core.List<api.Product> o) {
+checkUnnamed598(core.List<api.Product> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProduct(o[0]);
   checkProduct(o[1]);
@@ -2086,7 +2090,7 @@
   if (buildCounterProductsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed333();
+    o.resources = buildUnnamed598();
   }
   buildCounterProductsListResponse--;
   return o;
@@ -2097,19 +2101,19 @@
   if (buildCounterProductsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed333(o.resources);
+    checkUnnamed598(o.resources);
   }
   buildCounterProductsListResponse--;
 }
 
-buildUnnamed334() {
+buildUnnamed599() {
   var o = new core.List<api.ProductstatusesCustomBatchRequestEntry>();
   o.add(buildProductstatusesCustomBatchRequestEntry());
   o.add(buildProductstatusesCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed334(core.List<api.ProductstatusesCustomBatchRequestEntry> o) {
+checkUnnamed599(core.List<api.ProductstatusesCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductstatusesCustomBatchRequestEntry(o[0]);
   checkProductstatusesCustomBatchRequestEntry(o[1]);
@@ -2120,7 +2124,7 @@
   var o = new api.ProductstatusesCustomBatchRequest();
   buildCounterProductstatusesCustomBatchRequest++;
   if (buildCounterProductstatusesCustomBatchRequest < 3) {
-    o.entries = buildUnnamed334();
+    o.entries = buildUnnamed599();
   }
   buildCounterProductstatusesCustomBatchRequest--;
   return o;
@@ -2129,7 +2133,7 @@
 checkProductstatusesCustomBatchRequest(api.ProductstatusesCustomBatchRequest o) {
   buildCounterProductstatusesCustomBatchRequest++;
   if (buildCounterProductstatusesCustomBatchRequest < 3) {
-    checkUnnamed334(o.entries);
+    checkUnnamed599(o.entries);
   }
   buildCounterProductstatusesCustomBatchRequest--;
 }
@@ -2159,14 +2163,14 @@
   buildCounterProductstatusesCustomBatchRequestEntry--;
 }
 
-buildUnnamed335() {
+buildUnnamed600() {
   var o = new core.List<api.ProductstatusesCustomBatchResponseEntry>();
   o.add(buildProductstatusesCustomBatchResponseEntry());
   o.add(buildProductstatusesCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed335(core.List<api.ProductstatusesCustomBatchResponseEntry> o) {
+checkUnnamed600(core.List<api.ProductstatusesCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductstatusesCustomBatchResponseEntry(o[0]);
   checkProductstatusesCustomBatchResponseEntry(o[1]);
@@ -2177,7 +2181,7 @@
   var o = new api.ProductstatusesCustomBatchResponse();
   buildCounterProductstatusesCustomBatchResponse++;
   if (buildCounterProductstatusesCustomBatchResponse < 3) {
-    o.entries = buildUnnamed335();
+    o.entries = buildUnnamed600();
     o.kind = "foo";
   }
   buildCounterProductstatusesCustomBatchResponse--;
@@ -2187,7 +2191,7 @@
 checkProductstatusesCustomBatchResponse(api.ProductstatusesCustomBatchResponse o) {
   buildCounterProductstatusesCustomBatchResponse++;
   if (buildCounterProductstatusesCustomBatchResponse < 3) {
-    checkUnnamed335(o.entries);
+    checkUnnamed600(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterProductstatusesCustomBatchResponse--;
@@ -2218,14 +2222,14 @@
   buildCounterProductstatusesCustomBatchResponseEntry--;
 }
 
-buildUnnamed336() {
+buildUnnamed601() {
   var o = new core.List<api.ProductStatus>();
   o.add(buildProductStatus());
   o.add(buildProductStatus());
   return o;
 }
 
-checkUnnamed336(core.List<api.ProductStatus> o) {
+checkUnnamed601(core.List<api.ProductStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductStatus(o[0]);
   checkProductStatus(o[1]);
@@ -2238,7 +2242,7 @@
   if (buildCounterProductstatusesListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed336();
+    o.resources = buildUnnamed601();
   }
   buildCounterProductstatusesListResponse--;
   return o;
@@ -2249,7 +2253,7 @@
   if (buildCounterProductstatusesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed336(o.resources);
+    checkUnnamed601(o.resources);
   }
   buildCounterProductstatusesListResponse--;
 }
@@ -3500,6 +3504,8 @@
       var mock = new common_test.HttpServerMock();
       api.DatafeedsResourceApi res = new api.ContentApi(mock).datafeeds;
       var arg_merchantId = "foo";
+      var arg_maxResults = 42;
+      var arg_pageToken = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3524,6 +3530,8 @@
             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));
 
 
         var h = {
@@ -3532,7 +3540,7 @@
         var resp = convert.JSON.encode(buildDatafeedsListResponse());
         return new async.Future.value(common_test.stringResponse(200, h, resp));
       }), true);
-      res.list(arg_merchantId).then(unittest.expectAsync(((api.DatafeedsListResponse response) {
+      res.list(arg_merchantId, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync(((api.DatafeedsListResponse response) {
         checkDatafeedsListResponse(response);
       })));
     });
@@ -3732,6 +3740,8 @@
       var mock = new common_test.HttpServerMock();
       api.DatafeedstatusesResourceApi res = new api.ContentApi(mock).datafeedstatuses;
       var arg_merchantId = "foo";
+      var arg_maxResults = 42;
+      var arg_pageToken = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3756,6 +3766,8 @@
             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));
 
 
         var h = {
@@ -3764,7 +3776,7 @@
         var resp = convert.JSON.encode(buildDatafeedstatusesListResponse());
         return new async.Future.value(common_test.stringResponse(200, h, resp));
       }), true);
-      res.list(arg_merchantId).then(unittest.expectAsync(((api.DatafeedstatusesListResponse response) {
+      res.list(arg_merchantId, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync(((api.DatafeedstatusesListResponse response) {
         checkDatafeedstatusesListResponse(response);
       })));
     });
diff --git a/generated/googleapis/test/coordinate/v1_test.dart b/generated/googleapis/test/coordinate/v1_test.dart
index f3e9795..b5b52d1 100644
--- a/generated/googleapis/test/coordinate/v1_test.dart
+++ b/generated/googleapis/test/coordinate/v1_test.dart
@@ -68,14 +68,14 @@
   buildCounterCustomFieldDef--;
 }
 
-buildUnnamed452() {
+buildUnnamed602() {
   var o = new core.List<api.CustomFieldDef>();
   o.add(buildCustomFieldDef());
   o.add(buildCustomFieldDef());
   return o;
 }
 
-checkUnnamed452(core.List<api.CustomFieldDef> o) {
+checkUnnamed602(core.List<api.CustomFieldDef> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomFieldDef(o[0]);
   checkCustomFieldDef(o[1]);
@@ -86,7 +86,7 @@
   var o = new api.CustomFieldDefListResponse();
   buildCounterCustomFieldDefListResponse++;
   if (buildCounterCustomFieldDefListResponse < 3) {
-    o.items = buildUnnamed452();
+    o.items = buildUnnamed602();
     o.kind = "foo";
   }
   buildCounterCustomFieldDefListResponse--;
@@ -96,20 +96,20 @@
 checkCustomFieldDefListResponse(api.CustomFieldDefListResponse o) {
   buildCounterCustomFieldDefListResponse++;
   if (buildCounterCustomFieldDefListResponse < 3) {
-    checkUnnamed452(o.items);
+    checkUnnamed602(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterCustomFieldDefListResponse--;
 }
 
-buildUnnamed453() {
+buildUnnamed603() {
   var o = new core.List<api.CustomField>();
   o.add(buildCustomField());
   o.add(buildCustomField());
   return o;
 }
 
-checkUnnamed453(core.List<api.CustomField> o) {
+checkUnnamed603(core.List<api.CustomField> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomField(o[0]);
   checkCustomField(o[1]);
@@ -120,7 +120,7 @@
   var o = new api.CustomFields();
   buildCounterCustomFields++;
   if (buildCounterCustomFields < 3) {
-    o.customField = buildUnnamed453();
+    o.customField = buildUnnamed603();
     o.kind = "foo";
   }
   buildCounterCustomFields--;
@@ -130,20 +130,20 @@
 checkCustomFields(api.CustomFields o) {
   buildCounterCustomFields++;
   if (buildCounterCustomFields < 3) {
-    checkUnnamed453(o.customField);
+    checkUnnamed603(o.customField);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterCustomFields--;
 }
 
-buildUnnamed454() {
+buildUnnamed604() {
   var o = new core.List<api.JobChange>();
   o.add(buildJobChange());
   o.add(buildJobChange());
   return o;
 }
 
-checkUnnamed454(core.List<api.JobChange> o) {
+checkUnnamed604(core.List<api.JobChange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJobChange(o[0]);
   checkJobChange(o[1]);
@@ -155,7 +155,7 @@
   buildCounterJob++;
   if (buildCounterJob < 3) {
     o.id = "foo";
-    o.jobChange = buildUnnamed454();
+    o.jobChange = buildUnnamed604();
     o.kind = "foo";
     o.state = buildJobState();
   }
@@ -167,7 +167,7 @@
   buildCounterJob++;
   if (buildCounterJob < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed454(o.jobChange);
+    checkUnnamed604(o.jobChange);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkJobState(o.state);
   }
@@ -197,14 +197,14 @@
   buildCounterJobChange--;
 }
 
-buildUnnamed455() {
+buildUnnamed605() {
   var o = new core.List<api.Job>();
   o.add(buildJob());
   o.add(buildJob());
   return o;
 }
 
-checkUnnamed455(core.List<api.Job> o) {
+checkUnnamed605(core.List<api.Job> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJob(o[0]);
   checkJob(o[1]);
@@ -215,7 +215,7 @@
   var o = new api.JobListResponse();
   buildCounterJobListResponse++;
   if (buildCounterJobListResponse < 3) {
-    o.items = buildUnnamed455();
+    o.items = buildUnnamed605();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -226,21 +226,21 @@
 checkJobListResponse(api.JobListResponse o) {
   buildCounterJobListResponse++;
   if (buildCounterJobListResponse < 3) {
-    checkUnnamed455(o.items);
+    checkUnnamed605(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterJobListResponse--;
 }
 
-buildUnnamed456() {
+buildUnnamed606() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed456(core.List<core.String> o) {
+checkUnnamed606(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -257,7 +257,7 @@
     o.customerPhoneNumber = "foo";
     o.kind = "foo";
     o.location = buildLocation();
-    o.note = buildUnnamed456();
+    o.note = buildUnnamed606();
     o.progress = "foo";
     o.title = "foo";
   }
@@ -274,21 +274,21 @@
     unittest.expect(o.customerPhoneNumber, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkLocation(o.location);
-    checkUnnamed456(o.note);
+    checkUnnamed606(o.note);
     unittest.expect(o.progress, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterJobState--;
 }
 
-buildUnnamed457() {
+buildUnnamed607() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed457(core.List<core.String> o) {
+checkUnnamed607(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -299,7 +299,7 @@
   var o = new api.Location();
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
-    o.addressLine = buildUnnamed457();
+    o.addressLine = buildUnnamed607();
     o.kind = "foo";
     o.lat = 42.0;
     o.lng = 42.0;
@@ -311,7 +311,7 @@
 checkLocation(api.Location o) {
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
-    checkUnnamed457(o.addressLine);
+    checkUnnamed607(o.addressLine);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lat, unittest.equals(42.0));
     unittest.expect(o.lng, unittest.equals(42.0));
@@ -319,14 +319,14 @@
   buildCounterLocation--;
 }
 
-buildUnnamed458() {
+buildUnnamed608() {
   var o = new core.List<api.LocationRecord>();
   o.add(buildLocationRecord());
   o.add(buildLocationRecord());
   return o;
 }
 
-checkUnnamed458(core.List<api.LocationRecord> o) {
+checkUnnamed608(core.List<api.LocationRecord> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocationRecord(o[0]);
   checkLocationRecord(o[1]);
@@ -337,7 +337,7 @@
   var o = new api.LocationListResponse();
   buildCounterLocationListResponse++;
   if (buildCounterLocationListResponse < 3) {
-    o.items = buildUnnamed458();
+    o.items = buildUnnamed608();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.tokenPagination = buildTokenPagination();
@@ -349,7 +349,7 @@
 checkLocationListResponse(api.LocationListResponse o) {
   buildCounterLocationListResponse++;
   if (buildCounterLocationListResponse < 3) {
-    checkUnnamed458(o.items);
+    checkUnnamed608(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkTokenPagination(o.tokenPagination);
@@ -455,14 +455,14 @@
   buildCounterWorker--;
 }
 
-buildUnnamed459() {
+buildUnnamed609() {
   var o = new core.List<api.Worker>();
   o.add(buildWorker());
   o.add(buildWorker());
   return o;
 }
 
-checkUnnamed459(core.List<api.Worker> o) {
+checkUnnamed609(core.List<api.Worker> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWorker(o[0]);
   checkWorker(o[1]);
@@ -473,7 +473,7 @@
   var o = new api.WorkerListResponse();
   buildCounterWorkerListResponse++;
   if (buildCounterWorkerListResponse < 3) {
-    o.items = buildUnnamed459();
+    o.items = buildUnnamed609();
     o.kind = "foo";
   }
   buildCounterWorkerListResponse--;
@@ -483,46 +483,46 @@
 checkWorkerListResponse(api.WorkerListResponse o) {
   buildCounterWorkerListResponse++;
   if (buildCounterWorkerListResponse < 3) {
-    checkUnnamed459(o.items);
+    checkUnnamed609(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterWorkerListResponse--;
 }
 
-buildUnnamed460() {
+buildUnnamed610() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed460(core.List<core.String> o) {
+checkUnnamed610(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed461() {
+buildUnnamed611() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed461(core.List<core.String> o) {
+checkUnnamed611(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed462() {
+buildUnnamed612() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed462(core.List<core.String> o) {
+checkUnnamed612(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -766,7 +766,7 @@
       var arg_lng = 42.0;
       var arg_title = "foo";
       var arg_assignee = "foo";
-      var arg_customField = buildUnnamed460();
+      var arg_customField = buildUnnamed610();
       var arg_customerName = "foo";
       var arg_customerPhoneNumber = "foo";
       var arg_note = "foo";
@@ -876,7 +876,7 @@
       var arg_jobId = "foo";
       var arg_address = "foo";
       var arg_assignee = "foo";
-      var arg_customField = buildUnnamed461();
+      var arg_customField = buildUnnamed611();
       var arg_customerName = "foo";
       var arg_customerPhoneNumber = "foo";
       var arg_lat = 42.0;
@@ -943,7 +943,7 @@
       var arg_jobId = "foo";
       var arg_address = "foo";
       var arg_assignee = "foo";
-      var arg_customField = buildUnnamed462();
+      var arg_customField = buildUnnamed612();
       var arg_customerName = "foo";
       var arg_customerPhoneNumber = "foo";
       var arg_lat = 42.0;
diff --git a/generated/googleapis/test/customsearch/v1_test.dart b/generated/googleapis/test/customsearch/v1_test.dart
index 8b91ce5..42dacd0 100644
--- a/generated/googleapis/test/customsearch/v1_test.dart
+++ b/generated/googleapis/test/customsearch/v1_test.dart
@@ -39,30 +39,30 @@
   buildCounterContextFacets--;
 }
 
-buildUnnamed264() {
+buildUnnamed613() {
   var o = new core.List<api.ContextFacets>();
   o.add(buildContextFacets());
   o.add(buildContextFacets());
   return o;
 }
 
-checkUnnamed264(core.List<api.ContextFacets> o) {
+checkUnnamed613(core.List<api.ContextFacets> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContextFacets(o[0]);
   checkContextFacets(o[1]);
 }
 
-buildUnnamed265() {
+buildUnnamed614() {
   var o = new core.List<core.List<api.ContextFacets>>();
-  o.add(buildUnnamed264());
-  o.add(buildUnnamed264());
+  o.add(buildUnnamed613());
+  o.add(buildUnnamed613());
   return o;
 }
 
-checkUnnamed265(core.List<core.List<api.ContextFacets>> o) {
+checkUnnamed614(core.List<core.List<api.ContextFacets>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed264(o[0]);
-  checkUnnamed264(o[1]);
+  checkUnnamed613(o[0]);
+  checkUnnamed613(o[1]);
 }
 
 core.int buildCounterContext = 0;
@@ -70,7 +70,7 @@
   var o = new api.Context();
   buildCounterContext++;
   if (buildCounterContext < 3) {
-    o.facets = buildUnnamed265();
+    o.facets = buildUnnamed614();
     o.title = "foo";
   }
   buildCounterContext--;
@@ -80,7 +80,7 @@
 checkContext(api.Context o) {
   buildCounterContext++;
   if (buildCounterContext < 3) {
-    checkUnnamed265(o.facets);
+    checkUnnamed614(o.facets);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterContext--;
@@ -111,14 +111,14 @@
   buildCounterPromotionBodyLines--;
 }
 
-buildUnnamed266() {
+buildUnnamed615() {
   var o = new core.List<api.PromotionBodyLines>();
   o.add(buildPromotionBodyLines());
   o.add(buildPromotionBodyLines());
   return o;
 }
 
-checkUnnamed266(core.List<api.PromotionBodyLines> o) {
+checkUnnamed615(core.List<api.PromotionBodyLines> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPromotionBodyLines(o[0]);
   checkPromotionBodyLines(o[1]);
@@ -152,7 +152,7 @@
   var o = new api.Promotion();
   buildCounterPromotion++;
   if (buildCounterPromotion < 3) {
-    o.bodyLines = buildUnnamed266();
+    o.bodyLines = buildUnnamed615();
     o.displayLink = "foo";
     o.htmlTitle = "foo";
     o.image = buildPromotionImage();
@@ -166,7 +166,7 @@
 checkPromotion(api.Promotion o) {
   buildCounterPromotion++;
   if (buildCounterPromotion < 3) {
-    checkUnnamed266(o.bodyLines);
+    checkUnnamed615(o.bodyLines);
     unittest.expect(o.displayLink, unittest.equals('foo'));
     unittest.expect(o.htmlTitle, unittest.equals('foo'));
     checkPromotionImage(o.image);
@@ -321,56 +321,56 @@
   buildCounterResultLabels--;
 }
 
-buildUnnamed267() {
+buildUnnamed616() {
   var o = new core.List<api.ResultLabels>();
   o.add(buildResultLabels());
   o.add(buildResultLabels());
   return o;
 }
 
-checkUnnamed267(core.List<api.ResultLabels> o) {
+checkUnnamed616(core.List<api.ResultLabels> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultLabels(o[0]);
   checkResultLabels(o[1]);
 }
 
-buildUnnamed268() {
+buildUnnamed617() {
   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;
 }
 
-checkUnnamed268(core.Map<core.String, core.Object> o) {
+checkUnnamed617(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')); 
 }
 
-buildUnnamed269() {
+buildUnnamed618() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed268());
-  o.add(buildUnnamed268());
+  o.add(buildUnnamed617());
+  o.add(buildUnnamed617());
   return o;
 }
 
-checkUnnamed269(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed618(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed268(o[0]);
-  checkUnnamed268(o[1]);
+  checkUnnamed617(o[0]);
+  checkUnnamed617(o[1]);
 }
 
-buildUnnamed270() {
+buildUnnamed619() {
   var o = new core.Map<core.String, core.List<core.Map<core.String, core.Object>>>();
-  o["x"] = buildUnnamed269();
-  o["y"] = buildUnnamed269();
+  o["x"] = buildUnnamed618();
+  o["y"] = buildUnnamed618();
   return o;
 }
 
-checkUnnamed270(core.Map<core.String, core.List<core.Map<core.String, core.Object>>> o) {
+checkUnnamed619(core.Map<core.String, core.List<core.Map<core.String, core.Object>>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed269(o["x"]);
-  checkUnnamed269(o["y"]);
+  checkUnnamed618(o["x"]);
+  checkUnnamed618(o["y"]);
 }
 
 core.int buildCounterResult = 0;
@@ -387,10 +387,10 @@
     o.htmlTitle = "foo";
     o.image = buildResultImage();
     o.kind = "foo";
-    o.labels = buildUnnamed267();
+    o.labels = buildUnnamed616();
     o.link = "foo";
     o.mime = "foo";
-    o.pagemap = buildUnnamed270();
+    o.pagemap = buildUnnamed619();
     o.snippet = "foo";
     o.title = "foo";
   }
@@ -410,66 +410,66 @@
     unittest.expect(o.htmlTitle, unittest.equals('foo'));
     checkResultImage(o.image);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed267(o.labels);
+    checkUnnamed616(o.labels);
     unittest.expect(o.link, unittest.equals('foo'));
     unittest.expect(o.mime, unittest.equals('foo'));
-    checkUnnamed270(o.pagemap);
+    checkUnnamed619(o.pagemap);
     unittest.expect(o.snippet, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterResult--;
 }
 
-buildUnnamed271() {
+buildUnnamed620() {
   var o = new core.List<api.Result>();
   o.add(buildResult());
   o.add(buildResult());
   return o;
 }
 
-checkUnnamed271(core.List<api.Result> o) {
+checkUnnamed620(core.List<api.Result> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResult(o[0]);
   checkResult(o[1]);
 }
 
-buildUnnamed272() {
+buildUnnamed621() {
   var o = new core.List<api.Promotion>();
   o.add(buildPromotion());
   o.add(buildPromotion());
   return o;
 }
 
-checkUnnamed272(core.List<api.Promotion> o) {
+checkUnnamed621(core.List<api.Promotion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPromotion(o[0]);
   checkPromotion(o[1]);
 }
 
-buildUnnamed273() {
+buildUnnamed622() {
   var o = new core.List<api.Query>();
   o.add(buildQuery());
   o.add(buildQuery());
   return o;
 }
 
-checkUnnamed273(core.List<api.Query> o) {
+checkUnnamed622(core.List<api.Query> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuery(o[0]);
   checkQuery(o[1]);
 }
 
-buildUnnamed274() {
+buildUnnamed623() {
   var o = new core.Map<core.String, core.List<api.Query>>();
-  o["x"] = buildUnnamed273();
-  o["y"] = buildUnnamed273();
+  o["x"] = buildUnnamed622();
+  o["y"] = buildUnnamed622();
   return o;
 }
 
-checkUnnamed274(core.Map<core.String, core.List<api.Query>> o) {
+checkUnnamed623(core.Map<core.String, core.List<api.Query>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed273(o["x"]);
-  checkUnnamed273(o["y"]);
+  checkUnnamed622(o["x"]);
+  checkUnnamed622(o["y"]);
 }
 
 core.int buildCounterSearchSearchInformation = 0;
@@ -545,10 +545,10 @@
   buildCounterSearch++;
   if (buildCounterSearch < 3) {
     o.context = buildContext();
-    o.items = buildUnnamed271();
+    o.items = buildUnnamed620();
     o.kind = "foo";
-    o.promotions = buildUnnamed272();
-    o.queries = buildUnnamed274();
+    o.promotions = buildUnnamed621();
+    o.queries = buildUnnamed623();
     o.searchInformation = buildSearchSearchInformation();
     o.spelling = buildSearchSpelling();
     o.url = buildSearchUrl();
@@ -561,10 +561,10 @@
   buildCounterSearch++;
   if (buildCounterSearch < 3) {
     checkContext(o.context);
-    checkUnnamed271(o.items);
+    checkUnnamed620(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed272(o.promotions);
-    checkUnnamed274(o.queries);
+    checkUnnamed621(o.promotions);
+    checkUnnamed623(o.queries);
     checkSearchSearchInformation(o.searchInformation);
     checkSearchSpelling(o.spelling);
     checkSearchUrl(o.url);
diff --git a/generated/googleapis/test/dfareporting/v1_3_test.dart b/generated/googleapis/test/dfareporting/v1_3_test.dart
index 01928f2..f492d22 100644
--- a/generated/googleapis/test/dfareporting/v1_3_test.dart
+++ b/generated/googleapis/test/dfareporting/v1_3_test.dart
@@ -16,27 +16,27 @@
 
 
 
-buildUnnamed187() {
+buildUnnamed624() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed187(core.List<api.DimensionValue> o) {
+checkUnnamed624(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed188() {
+buildUnnamed625() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed188(core.List<core.String> 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'));
@@ -47,9 +47,9 @@
   var o = new api.Activities();
   buildCounterActivities++;
   if (buildCounterActivities < 3) {
-    o.filters = buildUnnamed187();
+    o.filters = buildUnnamed624();
     o.kind = "foo";
-    o.metricNames = buildUnnamed188();
+    o.metricNames = buildUnnamed625();
   }
   buildCounterActivities--;
   return o;
@@ -58,9 +58,9 @@
 checkActivities(api.Activities o) {
   buildCounterActivities++;
   if (buildCounterActivities < 3) {
-    checkUnnamed187(o.filters);
+    checkUnnamed624(o.filters);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed188(o.metricNames);
+    checkUnnamed625(o.metricNames);
   }
   buildCounterActivities--;
 }
@@ -94,53 +94,53 @@
   buildCounterCompatibleFields--;
 }
 
-buildUnnamed189() {
+buildUnnamed626() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed189(core.List<api.Dimension> o) {
+checkUnnamed626(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed190() {
+buildUnnamed627() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed190(core.List<api.Dimension> o) {
+checkUnnamed627(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed191() {
+buildUnnamed628() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed191(core.List<api.Metric> o) {
+checkUnnamed628(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed192() {
+buildUnnamed629() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed192(core.List<api.Metric> o) {
+checkUnnamed629(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -151,11 +151,11 @@
   var o = new api.CrossDimensionReachReportCompatibleFields();
   buildCounterCrossDimensionReachReportCompatibleFields++;
   if (buildCounterCrossDimensionReachReportCompatibleFields < 3) {
-    o.breakdown = buildUnnamed189();
-    o.dimensionFilters = buildUnnamed190();
+    o.breakdown = buildUnnamed626();
+    o.dimensionFilters = buildUnnamed627();
     o.kind = "foo";
-    o.metrics = buildUnnamed191();
-    o.overlapMetrics = buildUnnamed192();
+    o.metrics = buildUnnamed628();
+    o.overlapMetrics = buildUnnamed629();
   }
   buildCounterCrossDimensionReachReportCompatibleFields--;
   return o;
@@ -164,23 +164,23 @@
 checkCrossDimensionReachReportCompatibleFields(api.CrossDimensionReachReportCompatibleFields o) {
   buildCounterCrossDimensionReachReportCompatibleFields++;
   if (buildCounterCrossDimensionReachReportCompatibleFields < 3) {
-    checkUnnamed189(o.breakdown);
-    checkUnnamed190(o.dimensionFilters);
+    checkUnnamed626(o.breakdown);
+    checkUnnamed627(o.dimensionFilters);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed191(o.metrics);
-    checkUnnamed192(o.overlapMetrics);
+    checkUnnamed628(o.metrics);
+    checkUnnamed629(o.overlapMetrics);
   }
   buildCounterCrossDimensionReachReportCompatibleFields--;
 }
 
-buildUnnamed193() {
+buildUnnamed630() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed193(core.List<api.DimensionValue> o) {
+checkUnnamed630(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
@@ -191,7 +191,7 @@
   var o = new api.CustomRichMediaEvents();
   buildCounterCustomRichMediaEvents++;
   if (buildCounterCustomRichMediaEvents < 3) {
-    o.filteredEventIds = buildUnnamed193();
+    o.filteredEventIds = buildUnnamed630();
     o.kind = "foo";
   }
   buildCounterCustomRichMediaEvents--;
@@ -201,7 +201,7 @@
 checkCustomRichMediaEvents(api.CustomRichMediaEvents o) {
   buildCounterCustomRichMediaEvents++;
   if (buildCounterCustomRichMediaEvents < 3) {
-    checkUnnamed193(o.filteredEventIds);
+    checkUnnamed630(o.filteredEventIds);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterCustomRichMediaEvents--;
@@ -305,14 +305,14 @@
   buildCounterDimensionValue--;
 }
 
-buildUnnamed194() {
+buildUnnamed631() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed194(core.List<api.DimensionValue> o) {
+checkUnnamed631(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
@@ -324,7 +324,7 @@
   buildCounterDimensionValueList++;
   if (buildCounterDimensionValueList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed194();
+    o.items = buildUnnamed631();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -336,21 +336,21 @@
   buildCounterDimensionValueList++;
   if (buildCounterDimensionValueList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed194(o.items);
+    checkUnnamed631(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterDimensionValueList--;
 }
 
-buildUnnamed195() {
+buildUnnamed632() {
   var o = new core.List<api.DimensionFilter>();
   o.add(buildDimensionFilter());
   o.add(buildDimensionFilter());
   return o;
 }
 
-checkUnnamed195(core.List<api.DimensionFilter> o) {
+checkUnnamed632(core.List<api.DimensionFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionFilter(o[0]);
   checkDimensionFilter(o[1]);
@@ -363,7 +363,7 @@
   if (buildCounterDimensionValueRequest < 3) {
     o.dimensionName = "foo";
     o.endDate = core.DateTime.parse("2002-02-27T14:01:02Z");
-    o.filters = buildUnnamed195();
+    o.filters = buildUnnamed632();
     o.kind = "foo";
     o.startDate = core.DateTime.parse("2002-02-27T14:01:02Z");
   }
@@ -376,7 +376,7 @@
   if (buildCounterDimensionValueRequest < 3) {
     unittest.expect(o.dimensionName, unittest.equals('foo'));
     unittest.expect(o.endDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
-    checkUnnamed195(o.filters);
+    checkUnnamed632(o.filters);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.startDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
   }
@@ -441,14 +441,14 @@
   buildCounterFile--;
 }
 
-buildUnnamed196() {
+buildUnnamed633() {
   var o = new core.List<api.File>();
   o.add(buildFile());
   o.add(buildFile());
   return o;
 }
 
-checkUnnamed196(core.List<api.File> o) {
+checkUnnamed633(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFile(o[0]);
   checkFile(o[1]);
@@ -460,7 +460,7 @@
   buildCounterFileList++;
   if (buildCounterFileList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed196();
+    o.items = buildUnnamed633();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -472,47 +472,47 @@
   buildCounterFileList++;
   if (buildCounterFileList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed196(o.items);
+    checkUnnamed633(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterFileList--;
 }
 
-buildUnnamed197() {
+buildUnnamed634() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed197(core.List<api.Dimension> o) {
+checkUnnamed634(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed198() {
+buildUnnamed635() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed198(core.List<api.Dimension> o) {
+checkUnnamed635(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed199() {
+buildUnnamed636() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed199(core.List<api.Metric> o) {
+checkUnnamed636(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -523,10 +523,10 @@
   var o = new api.FloodlightReportCompatibleFields();
   buildCounterFloodlightReportCompatibleFields++;
   if (buildCounterFloodlightReportCompatibleFields < 3) {
-    o.dimensionFilters = buildUnnamed197();
-    o.dimensions = buildUnnamed198();
+    o.dimensionFilters = buildUnnamed634();
+    o.dimensions = buildUnnamed635();
     o.kind = "foo";
-    o.metrics = buildUnnamed199();
+    o.metrics = buildUnnamed636();
   }
   buildCounterFloodlightReportCompatibleFields--;
   return o;
@@ -535,10 +535,10 @@
 checkFloodlightReportCompatibleFields(api.FloodlightReportCompatibleFields o) {
   buildCounterFloodlightReportCompatibleFields++;
   if (buildCounterFloodlightReportCompatibleFields < 3) {
-    checkUnnamed197(o.dimensionFilters);
-    checkUnnamed198(o.dimensions);
+    checkUnnamed634(o.dimensionFilters);
+    checkUnnamed635(o.dimensions);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed199(o.metrics);
+    checkUnnamed636(o.metrics);
   }
   buildCounterFloodlightReportCompatibleFields--;
 }
@@ -564,53 +564,53 @@
   buildCounterMetric--;
 }
 
-buildUnnamed200() {
+buildUnnamed637() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed200(core.List<api.Dimension> o) {
+checkUnnamed637(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed201() {
+buildUnnamed638() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed201(core.List<api.Dimension> o) {
+checkUnnamed638(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed202() {
+buildUnnamed639() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed202(core.List<api.Metric> o) {
+checkUnnamed639(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed203() {
+buildUnnamed640() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed203(core.List<api.Dimension> o) {
+checkUnnamed640(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
@@ -621,11 +621,11 @@
   var o = new api.PathToConversionReportCompatibleFields();
   buildCounterPathToConversionReportCompatibleFields++;
   if (buildCounterPathToConversionReportCompatibleFields < 3) {
-    o.conversionDimensions = buildUnnamed200();
-    o.customFloodlightVariables = buildUnnamed201();
+    o.conversionDimensions = buildUnnamed637();
+    o.customFloodlightVariables = buildUnnamed638();
     o.kind = "foo";
-    o.metrics = buildUnnamed202();
-    o.perInteractionDimensions = buildUnnamed203();
+    o.metrics = buildUnnamed639();
+    o.perInteractionDimensions = buildUnnamed640();
   }
   buildCounterPathToConversionReportCompatibleFields--;
   return o;
@@ -634,75 +634,75 @@
 checkPathToConversionReportCompatibleFields(api.PathToConversionReportCompatibleFields o) {
   buildCounterPathToConversionReportCompatibleFields++;
   if (buildCounterPathToConversionReportCompatibleFields < 3) {
-    checkUnnamed200(o.conversionDimensions);
-    checkUnnamed201(o.customFloodlightVariables);
+    checkUnnamed637(o.conversionDimensions);
+    checkUnnamed638(o.customFloodlightVariables);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed202(o.metrics);
-    checkUnnamed203(o.perInteractionDimensions);
+    checkUnnamed639(o.metrics);
+    checkUnnamed640(o.perInteractionDimensions);
   }
   buildCounterPathToConversionReportCompatibleFields--;
 }
 
-buildUnnamed204() {
+buildUnnamed641() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed204(core.List<api.Dimension> o) {
+checkUnnamed641(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed205() {
+buildUnnamed642() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed205(core.List<api.Dimension> o) {
+checkUnnamed642(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed206() {
+buildUnnamed643() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed206(core.List<api.Metric> o) {
+checkUnnamed643(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed207() {
+buildUnnamed644() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed207(core.List<api.Metric> o) {
+checkUnnamed644(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed208() {
+buildUnnamed645() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed208(core.List<api.Metric> o) {
+checkUnnamed645(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -713,12 +713,12 @@
   var o = new api.ReachReportCompatibleFields();
   buildCounterReachReportCompatibleFields++;
   if (buildCounterReachReportCompatibleFields < 3) {
-    o.dimensionFilters = buildUnnamed204();
-    o.dimensions = buildUnnamed205();
+    o.dimensionFilters = buildUnnamed641();
+    o.dimensions = buildUnnamed642();
     o.kind = "foo";
-    o.metrics = buildUnnamed206();
-    o.pivotedActivityMetrics = buildUnnamed207();
-    o.reachByFrequencyMetrics = buildUnnamed208();
+    o.metrics = buildUnnamed643();
+    o.pivotedActivityMetrics = buildUnnamed644();
+    o.reachByFrequencyMetrics = buildUnnamed645();
   }
   buildCounterReachReportCompatibleFields--;
   return o;
@@ -727,12 +727,12 @@
 checkReachReportCompatibleFields(api.ReachReportCompatibleFields o) {
   buildCounterReachReportCompatibleFields++;
   if (buildCounterReachReportCompatibleFields < 3) {
-    checkUnnamed204(o.dimensionFilters);
-    checkUnnamed205(o.dimensions);
+    checkUnnamed641(o.dimensionFilters);
+    checkUnnamed642(o.dimensions);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed206(o.metrics);
-    checkUnnamed207(o.pivotedActivityMetrics);
-    checkUnnamed208(o.reachByFrequencyMetrics);
+    checkUnnamed643(o.metrics);
+    checkUnnamed644(o.pivotedActivityMetrics);
+    checkUnnamed645(o.reachByFrequencyMetrics);
   }
   buildCounterReachReportCompatibleFields--;
 }
@@ -760,40 +760,40 @@
   buildCounterRecipient--;
 }
 
-buildUnnamed209() {
+buildUnnamed646() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed209(core.List<api.DimensionValue> o) {
+checkUnnamed646(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed210() {
+buildUnnamed647() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed210(core.List<api.SortedDimension> o) {
+checkUnnamed647(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed211() {
+buildUnnamed648() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed211(core.List<core.String> o) {
+checkUnnamed648(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -805,9 +805,9 @@
   buildCounterReportActiveGrpCriteria++;
   if (buildCounterReportActiveGrpCriteria < 3) {
     o.dateRange = buildDateRange();
-    o.dimensionFilters = buildUnnamed209();
-    o.dimensions = buildUnnamed210();
-    o.metricNames = buildUnnamed211();
+    o.dimensionFilters = buildUnnamed646();
+    o.dimensions = buildUnnamed647();
+    o.metricNames = buildUnnamed648();
   }
   buildCounterReportActiveGrpCriteria--;
   return o;
@@ -817,47 +817,47 @@
   buildCounterReportActiveGrpCriteria++;
   if (buildCounterReportActiveGrpCriteria < 3) {
     checkDateRange(o.dateRange);
-    checkUnnamed209(o.dimensionFilters);
-    checkUnnamed210(o.dimensions);
-    checkUnnamed211(o.metricNames);
+    checkUnnamed646(o.dimensionFilters);
+    checkUnnamed647(o.dimensions);
+    checkUnnamed648(o.metricNames);
   }
   buildCounterReportActiveGrpCriteria--;
 }
 
-buildUnnamed212() {
+buildUnnamed649() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed212(core.List<api.DimensionValue> o) {
+checkUnnamed649(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed213() {
+buildUnnamed650() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed213(core.List<api.SortedDimension> o) {
+checkUnnamed650(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed214() {
+buildUnnamed651() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed214(core.List<core.String> o) {
+checkUnnamed651(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -871,9 +871,9 @@
     o.activities = buildActivities();
     o.customRichMediaEvents = buildCustomRichMediaEvents();
     o.dateRange = buildDateRange();
-    o.dimensionFilters = buildUnnamed212();
-    o.dimensions = buildUnnamed213();
-    o.metricNames = buildUnnamed214();
+    o.dimensionFilters = buildUnnamed649();
+    o.dimensions = buildUnnamed650();
+    o.metricNames = buildUnnamed651();
   }
   buildCounterReportCriteria--;
   return o;
@@ -885,60 +885,60 @@
     checkActivities(o.activities);
     checkCustomRichMediaEvents(o.customRichMediaEvents);
     checkDateRange(o.dateRange);
-    checkUnnamed212(o.dimensionFilters);
-    checkUnnamed213(o.dimensions);
-    checkUnnamed214(o.metricNames);
+    checkUnnamed649(o.dimensionFilters);
+    checkUnnamed650(o.dimensions);
+    checkUnnamed651(o.metricNames);
   }
   buildCounterReportCriteria--;
 }
 
-buildUnnamed215() {
+buildUnnamed652() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed215(core.List<api.SortedDimension> o) {
+checkUnnamed652(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed216() {
+buildUnnamed653() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed216(core.List<api.DimensionValue> o) {
+checkUnnamed653(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed217() {
+buildUnnamed654() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed217(core.List<core.String> o) {
+checkUnnamed654(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed218() {
+buildUnnamed655() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed218(core.List<core.String> o) {
+checkUnnamed655(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -949,12 +949,12 @@
   var o = new api.ReportCrossDimensionReachCriteria();
   buildCounterReportCrossDimensionReachCriteria++;
   if (buildCounterReportCrossDimensionReachCriteria < 3) {
-    o.breakdown = buildUnnamed215();
+    o.breakdown = buildUnnamed652();
     o.dateRange = buildDateRange();
     o.dimension = "foo";
-    o.dimensionFilters = buildUnnamed216();
-    o.metricNames = buildUnnamed217();
-    o.overlapMetricNames = buildUnnamed218();
+    o.dimensionFilters = buildUnnamed653();
+    o.metricNames = buildUnnamed654();
+    o.overlapMetricNames = buildUnnamed655();
     o.pivoted = true;
   }
   buildCounterReportCrossDimensionReachCriteria--;
@@ -964,25 +964,25 @@
 checkReportCrossDimensionReachCriteria(api.ReportCrossDimensionReachCriteria o) {
   buildCounterReportCrossDimensionReachCriteria++;
   if (buildCounterReportCrossDimensionReachCriteria < 3) {
-    checkUnnamed215(o.breakdown);
+    checkUnnamed652(o.breakdown);
     checkDateRange(o.dateRange);
     unittest.expect(o.dimension, unittest.equals('foo'));
-    checkUnnamed216(o.dimensionFilters);
-    checkUnnamed217(o.metricNames);
-    checkUnnamed218(o.overlapMetricNames);
+    checkUnnamed653(o.dimensionFilters);
+    checkUnnamed654(o.metricNames);
+    checkUnnamed655(o.overlapMetricNames);
     unittest.expect(o.pivoted, unittest.isTrue);
   }
   buildCounterReportCrossDimensionReachCriteria--;
 }
 
-buildUnnamed219() {
+buildUnnamed656() {
   var o = new core.List<api.Recipient>();
   o.add(buildRecipient());
   o.add(buildRecipient());
   return o;
 }
 
-checkUnnamed219(core.List<api.Recipient> o) {
+checkUnnamed656(core.List<api.Recipient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRecipient(o[0]);
   checkRecipient(o[1]);
@@ -996,7 +996,7 @@
     o.emailOwner = true;
     o.emailOwnerDeliveryType = "foo";
     o.message = "foo";
-    o.recipients = buildUnnamed219();
+    o.recipients = buildUnnamed656();
   }
   buildCounterReportDelivery--;
   return o;
@@ -1008,58 +1008,58 @@
     unittest.expect(o.emailOwner, unittest.isTrue);
     unittest.expect(o.emailOwnerDeliveryType, unittest.equals('foo'));
     unittest.expect(o.message, unittest.equals('foo'));
-    checkUnnamed219(o.recipients);
+    checkUnnamed656(o.recipients);
   }
   buildCounterReportDelivery--;
 }
 
-buildUnnamed220() {
+buildUnnamed657() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed220(core.List<api.DimensionValue> o) {
+checkUnnamed657(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed221() {
+buildUnnamed658() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed221(core.List<api.DimensionValue> o) {
+checkUnnamed658(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed222() {
+buildUnnamed659() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed222(core.List<api.SortedDimension> o) {
+checkUnnamed659(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed223() {
+buildUnnamed660() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed223(core.List<core.String> o) {
+checkUnnamed660(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1093,12 +1093,12 @@
   var o = new api.ReportFloodlightCriteria();
   buildCounterReportFloodlightCriteria++;
   if (buildCounterReportFloodlightCriteria < 3) {
-    o.customRichMediaEvents = buildUnnamed220();
+    o.customRichMediaEvents = buildUnnamed657();
     o.dateRange = buildDateRange();
-    o.dimensionFilters = buildUnnamed221();
-    o.dimensions = buildUnnamed222();
+    o.dimensionFilters = buildUnnamed658();
+    o.dimensions = buildUnnamed659();
     o.floodlightConfigId = buildDimensionValue();
-    o.metricNames = buildUnnamed223();
+    o.metricNames = buildUnnamed660();
     o.reportProperties = buildReportFloodlightCriteriaReportProperties();
   }
   buildCounterReportFloodlightCriteria--;
@@ -1108,90 +1108,90 @@
 checkReportFloodlightCriteria(api.ReportFloodlightCriteria o) {
   buildCounterReportFloodlightCriteria++;
   if (buildCounterReportFloodlightCriteria < 3) {
-    checkUnnamed220(o.customRichMediaEvents);
+    checkUnnamed657(o.customRichMediaEvents);
     checkDateRange(o.dateRange);
-    checkUnnamed221(o.dimensionFilters);
-    checkUnnamed222(o.dimensions);
+    checkUnnamed658(o.dimensionFilters);
+    checkUnnamed659(o.dimensions);
     checkDimensionValue(o.floodlightConfigId);
-    checkUnnamed223(o.metricNames);
+    checkUnnamed660(o.metricNames);
     checkReportFloodlightCriteriaReportProperties(o.reportProperties);
   }
   buildCounterReportFloodlightCriteria--;
 }
 
-buildUnnamed224() {
+buildUnnamed661() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed224(core.List<api.DimensionValue> o) {
+checkUnnamed661(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed225() {
+buildUnnamed662() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed225(core.List<api.SortedDimension> o) {
+checkUnnamed662(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed226() {
+buildUnnamed663() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed226(core.List<api.SortedDimension> o) {
+checkUnnamed663(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed227() {
+buildUnnamed664() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed227(core.List<api.DimensionValue> o) {
+checkUnnamed664(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed228() {
+buildUnnamed665() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed228(core.List<core.String> o) {
+checkUnnamed665(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed229() {
+buildUnnamed666() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed229(core.List<api.SortedDimension> o) {
+checkUnnamed666(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
@@ -1237,14 +1237,14 @@
   var o = new api.ReportPathToConversionCriteria();
   buildCounterReportPathToConversionCriteria++;
   if (buildCounterReportPathToConversionCriteria < 3) {
-    o.activityFilters = buildUnnamed224();
-    o.conversionDimensions = buildUnnamed225();
-    o.customFloodlightVariables = buildUnnamed226();
-    o.customRichMediaEvents = buildUnnamed227();
+    o.activityFilters = buildUnnamed661();
+    o.conversionDimensions = buildUnnamed662();
+    o.customFloodlightVariables = buildUnnamed663();
+    o.customRichMediaEvents = buildUnnamed664();
     o.dateRange = buildDateRange();
     o.floodlightConfigId = buildDimensionValue();
-    o.metricNames = buildUnnamed228();
-    o.perInteractionDimensions = buildUnnamed229();
+    o.metricNames = buildUnnamed665();
+    o.perInteractionDimensions = buildUnnamed666();
     o.reportProperties = buildReportPathToConversionCriteriaReportProperties();
   }
   buildCounterReportPathToConversionCriteria--;
@@ -1254,66 +1254,66 @@
 checkReportPathToConversionCriteria(api.ReportPathToConversionCriteria o) {
   buildCounterReportPathToConversionCriteria++;
   if (buildCounterReportPathToConversionCriteria < 3) {
-    checkUnnamed224(o.activityFilters);
-    checkUnnamed225(o.conversionDimensions);
-    checkUnnamed226(o.customFloodlightVariables);
-    checkUnnamed227(o.customRichMediaEvents);
+    checkUnnamed661(o.activityFilters);
+    checkUnnamed662(o.conversionDimensions);
+    checkUnnamed663(o.customFloodlightVariables);
+    checkUnnamed664(o.customRichMediaEvents);
     checkDateRange(o.dateRange);
     checkDimensionValue(o.floodlightConfigId);
-    checkUnnamed228(o.metricNames);
-    checkUnnamed229(o.perInteractionDimensions);
+    checkUnnamed665(o.metricNames);
+    checkUnnamed666(o.perInteractionDimensions);
     checkReportPathToConversionCriteriaReportProperties(o.reportProperties);
   }
   buildCounterReportPathToConversionCriteria--;
 }
 
-buildUnnamed230() {
+buildUnnamed667() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed230(core.List<api.DimensionValue> o) {
+checkUnnamed667(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed231() {
+buildUnnamed668() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed231(core.List<api.SortedDimension> o) {
+checkUnnamed668(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed232() {
+buildUnnamed669() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed232(core.List<core.String> o) {
+checkUnnamed669(core.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() {
+buildUnnamed670() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed233(core.List<core.String> o) {
+checkUnnamed670(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1327,10 +1327,10 @@
     o.activities = buildActivities();
     o.customRichMediaEvents = buildCustomRichMediaEvents();
     o.dateRange = buildDateRange();
-    o.dimensionFilters = buildUnnamed230();
-    o.dimensions = buildUnnamed231();
-    o.metricNames = buildUnnamed232();
-    o.reachByFrequencyMetricNames = buildUnnamed233();
+    o.dimensionFilters = buildUnnamed667();
+    o.dimensions = buildUnnamed668();
+    o.metricNames = buildUnnamed669();
+    o.reachByFrequencyMetricNames = buildUnnamed670();
   }
   buildCounterReportReachCriteria--;
   return o;
@@ -1342,22 +1342,22 @@
     checkActivities(o.activities);
     checkCustomRichMediaEvents(o.customRichMediaEvents);
     checkDateRange(o.dateRange);
-    checkUnnamed230(o.dimensionFilters);
-    checkUnnamed231(o.dimensions);
-    checkUnnamed232(o.metricNames);
-    checkUnnamed233(o.reachByFrequencyMetricNames);
+    checkUnnamed667(o.dimensionFilters);
+    checkUnnamed668(o.dimensions);
+    checkUnnamed669(o.metricNames);
+    checkUnnamed670(o.reachByFrequencyMetricNames);
   }
   buildCounterReportReachCriteria--;
 }
 
-buildUnnamed234() {
+buildUnnamed671() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed234(core.List<core.String> o) {
+checkUnnamed671(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1372,7 +1372,7 @@
     o.every = 42;
     o.expirationDate = core.DateTime.parse("2002-02-27T14:01:02Z");
     o.repeats = "foo";
-    o.repeatsOnWeekDays = buildUnnamed234();
+    o.repeatsOnWeekDays = buildUnnamed671();
     o.runsOnDayOfMonth = "foo";
     o.startDate = core.DateTime.parse("2002-02-27T14:01:02Z");
   }
@@ -1387,7 +1387,7 @@
     unittest.expect(o.every, unittest.equals(42));
     unittest.expect(o.expirationDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
     unittest.expect(o.repeats, unittest.equals('foo'));
-    checkUnnamed234(o.repeatsOnWeekDays);
+    checkUnnamed671(o.repeatsOnWeekDays);
     unittest.expect(o.runsOnDayOfMonth, unittest.equals('foo'));
     unittest.expect(o.startDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
   }
@@ -1449,53 +1449,53 @@
   buildCounterReport--;
 }
 
-buildUnnamed235() {
+buildUnnamed672() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed235(core.List<api.Dimension> o) {
+checkUnnamed672(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed236() {
+buildUnnamed673() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed236(core.List<api.Dimension> o) {
+checkUnnamed673(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed237() {
+buildUnnamed674() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed237(core.List<api.Metric> o) {
+checkUnnamed674(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed238() {
+buildUnnamed675() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed238(core.List<api.Metric> o) {
+checkUnnamed675(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -1506,11 +1506,11 @@
   var o = new api.ReportCompatibleFields();
   buildCounterReportCompatibleFields++;
   if (buildCounterReportCompatibleFields < 3) {
-    o.dimensionFilters = buildUnnamed235();
-    o.dimensions = buildUnnamed236();
+    o.dimensionFilters = buildUnnamed672();
+    o.dimensions = buildUnnamed673();
     o.kind = "foo";
-    o.metrics = buildUnnamed237();
-    o.pivotedActivityMetrics = buildUnnamed238();
+    o.metrics = buildUnnamed674();
+    o.pivotedActivityMetrics = buildUnnamed675();
   }
   buildCounterReportCompatibleFields--;
   return o;
@@ -1519,23 +1519,23 @@
 checkReportCompatibleFields(api.ReportCompatibleFields o) {
   buildCounterReportCompatibleFields++;
   if (buildCounterReportCompatibleFields < 3) {
-    checkUnnamed235(o.dimensionFilters);
-    checkUnnamed236(o.dimensions);
+    checkUnnamed672(o.dimensionFilters);
+    checkUnnamed673(o.dimensions);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed237(o.metrics);
-    checkUnnamed238(o.pivotedActivityMetrics);
+    checkUnnamed674(o.metrics);
+    checkUnnamed675(o.pivotedActivityMetrics);
   }
   buildCounterReportCompatibleFields--;
 }
 
-buildUnnamed239() {
+buildUnnamed676() {
   var o = new core.List<api.Report>();
   o.add(buildReport());
   o.add(buildReport());
   return o;
 }
 
-checkUnnamed239(core.List<api.Report> o) {
+checkUnnamed676(core.List<api.Report> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReport(o[0]);
   checkReport(o[1]);
@@ -1547,7 +1547,7 @@
   buildCounterReportList++;
   if (buildCounterReportList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed239();
+    o.items = buildUnnamed676();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1559,7 +1559,7 @@
   buildCounterReportList++;
   if (buildCounterReportList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed239(o.items);
+    checkUnnamed676(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1622,14 +1622,14 @@
   buildCounterUserProfile--;
 }
 
-buildUnnamed240() {
+buildUnnamed677() {
   var o = new core.List<api.UserProfile>();
   o.add(buildUserProfile());
   o.add(buildUserProfile());
   return o;
 }
 
-checkUnnamed240(core.List<api.UserProfile> o) {
+checkUnnamed677(core.List<api.UserProfile> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserProfile(o[0]);
   checkUserProfile(o[1]);
@@ -1641,7 +1641,7 @@
   buildCounterUserProfileList++;
   if (buildCounterUserProfileList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed240();
+    o.items = buildUnnamed677();
     o.kind = "foo";
   }
   buildCounterUserProfileList--;
@@ -1652,7 +1652,7 @@
   buildCounterUserProfileList++;
   if (buildCounterUserProfileList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed240(o.items);
+    checkUnnamed677(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterUserProfileList--;
diff --git a/generated/googleapis/test/discovery/v1_test.dart b/generated/googleapis/test/discovery/v1_test.dart
index 908e259..cbb5496 100644
--- a/generated/googleapis/test/discovery/v1_test.dart
+++ b/generated/googleapis/test/discovery/v1_test.dart
@@ -37,14 +37,14 @@
   buildCounterDirectoryListItemsIcons--;
 }
 
-buildUnnamed275() {
+buildUnnamed678() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed275(core.List<core.String> o) {
+checkUnnamed678(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -62,7 +62,7 @@
     o.icons = buildDirectoryListItemsIcons();
     o.id = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed275();
+    o.labels = buildUnnamed678();
     o.name = "foo";
     o.preferred = true;
     o.title = "foo";
@@ -82,7 +82,7 @@
     checkDirectoryListItemsIcons(o.icons);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed275(o.labels);
+    checkUnnamed678(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.preferred, unittest.isTrue);
     unittest.expect(o.title, unittest.equals('foo'));
@@ -91,14 +91,14 @@
   buildCounterDirectoryListItems--;
 }
 
-buildUnnamed276() {
+buildUnnamed679() {
   var o = new core.List<api.DirectoryListItems>();
   o.add(buildDirectoryListItems());
   o.add(buildDirectoryListItems());
   return o;
 }
 
-checkUnnamed276(core.List<api.DirectoryListItems> o) {
+checkUnnamed679(core.List<api.DirectoryListItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDirectoryListItems(o[0]);
   checkDirectoryListItems(o[1]);
@@ -110,7 +110,7 @@
   buildCounterDirectoryList++;
   if (buildCounterDirectoryList < 3) {
     o.discoveryVersion = "foo";
-    o.items = buildUnnamed276();
+    o.items = buildUnnamed679();
     o.kind = "foo";
   }
   buildCounterDirectoryList--;
@@ -121,20 +121,20 @@
   buildCounterDirectoryList++;
   if (buildCounterDirectoryList < 3) {
     unittest.expect(o.discoveryVersion, unittest.equals('foo'));
-    checkUnnamed276(o.items);
+    checkUnnamed679(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDirectoryList--;
 }
 
-buildUnnamed277() {
+buildUnnamed680() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed277(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'));
@@ -145,7 +145,7 @@
   var o = new api.JsonSchemaAnnotations();
   buildCounterJsonSchemaAnnotations++;
   if (buildCounterJsonSchemaAnnotations < 3) {
-    o.required = buildUnnamed277();
+    o.required = buildUnnamed680();
   }
   buildCounterJsonSchemaAnnotations--;
   return o;
@@ -154,45 +154,45 @@
 checkJsonSchemaAnnotations(api.JsonSchemaAnnotations o) {
   buildCounterJsonSchemaAnnotations++;
   if (buildCounterJsonSchemaAnnotations < 3) {
-    checkUnnamed277(o.required);
+    checkUnnamed680(o.required);
   }
   buildCounterJsonSchemaAnnotations--;
 }
 
-buildUnnamed278() {
+buildUnnamed681() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed278(core.List<core.String> o) {
+checkUnnamed681(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed279() {
+buildUnnamed682() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed279(core.List<core.String> o) {
+checkUnnamed682(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed280() {
+buildUnnamed683() {
   var o = new core.Map<core.String, api.JsonSchema>();
   o["x"] = buildJsonSchema();
   o["y"] = buildJsonSchema();
   return o;
 }
 
-checkUnnamed280(core.Map<core.String, api.JsonSchema> o) {
+checkUnnamed683(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchema(o["x"]);
   checkJsonSchema(o["y"]);
@@ -219,14 +219,14 @@
   buildCounterJsonSchemaVariantMap--;
 }
 
-buildUnnamed281() {
+buildUnnamed684() {
   var o = new core.List<api.JsonSchemaVariantMap>();
   o.add(buildJsonSchemaVariantMap());
   o.add(buildJsonSchemaVariantMap());
   return o;
 }
 
-checkUnnamed281(core.List<api.JsonSchemaVariantMap> o) {
+checkUnnamed684(core.List<api.JsonSchemaVariantMap> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchemaVariantMap(o[0]);
   checkJsonSchemaVariantMap(o[1]);
@@ -238,7 +238,7 @@
   buildCounterJsonSchemaVariant++;
   if (buildCounterJsonSchemaVariant < 3) {
     o.discriminant = "foo";
-    o.map = buildUnnamed281();
+    o.map = buildUnnamed684();
   }
   buildCounterJsonSchemaVariant--;
   return o;
@@ -248,7 +248,7 @@
   buildCounterJsonSchemaVariant++;
   if (buildCounterJsonSchemaVariant < 3) {
     unittest.expect(o.discriminant, unittest.equals('foo'));
-    checkUnnamed281(o.map);
+    checkUnnamed684(o.map);
   }
   buildCounterJsonSchemaVariant--;
 }
@@ -263,8 +263,8 @@
     o.annotations = buildJsonSchemaAnnotations();
     o.default_ = "foo";
     o.description = "foo";
-    o.enum_ = buildUnnamed278();
-    o.enumDescriptions = buildUnnamed279();
+    o.enum_ = buildUnnamed681();
+    o.enumDescriptions = buildUnnamed682();
     o.format = "foo";
     o.id = "foo";
     o.items = buildJsonSchema();
@@ -272,7 +272,7 @@
     o.maximum = "foo";
     o.minimum = "foo";
     o.pattern = "foo";
-    o.properties = buildUnnamed280();
+    o.properties = buildUnnamed683();
     o.readOnly = true;
     o.repeated = true;
     o.required = true;
@@ -291,8 +291,8 @@
     checkJsonSchemaAnnotations(o.annotations);
     unittest.expect(o.default_, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed278(o.enum_);
-    checkUnnamed279(o.enumDescriptions);
+    checkUnnamed681(o.enum_);
+    checkUnnamed682(o.enumDescriptions);
     unittest.expect(o.format, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     checkJsonSchema(o.items);
@@ -300,7 +300,7 @@
     unittest.expect(o.maximum, unittest.equals('foo'));
     unittest.expect(o.minimum, unittest.equals('foo'));
     unittest.expect(o.pattern, unittest.equals('foo'));
-    checkUnnamed280(o.properties);
+    checkUnnamed683(o.properties);
     unittest.expect(o.readOnly, unittest.isTrue);
     unittest.expect(o.repeated, unittest.isTrue);
     unittest.expect(o.required, unittest.isTrue);
@@ -329,14 +329,14 @@
   buildCounterRestDescriptionAuthOauth2ScopesValue--;
 }
 
-buildUnnamed282() {
+buildUnnamed685() {
   var o = new core.Map<core.String, api.RestDescriptionAuthOauth2ScopesValue>();
   o["x"] = buildRestDescriptionAuthOauth2ScopesValue();
   o["y"] = buildRestDescriptionAuthOauth2ScopesValue();
   return o;
 }
 
-checkUnnamed282(core.Map<core.String, api.RestDescriptionAuthOauth2ScopesValue> o) {
+checkUnnamed685(core.Map<core.String, api.RestDescriptionAuthOauth2ScopesValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestDescriptionAuthOauth2ScopesValue(o["x"]);
   checkRestDescriptionAuthOauth2ScopesValue(o["y"]);
@@ -347,7 +347,7 @@
   var o = new api.RestDescriptionAuthOauth2();
   buildCounterRestDescriptionAuthOauth2++;
   if (buildCounterRestDescriptionAuthOauth2 < 3) {
-    o.scopes = buildUnnamed282();
+    o.scopes = buildUnnamed685();
   }
   buildCounterRestDescriptionAuthOauth2--;
   return o;
@@ -356,7 +356,7 @@
 checkRestDescriptionAuthOauth2(api.RestDescriptionAuthOauth2 o) {
   buildCounterRestDescriptionAuthOauth2++;
   if (buildCounterRestDescriptionAuthOauth2 < 3) {
-    checkUnnamed282(o.scopes);
+    checkUnnamed685(o.scopes);
   }
   buildCounterRestDescriptionAuthOauth2--;
 }
@@ -380,14 +380,14 @@
   buildCounterRestDescriptionAuth--;
 }
 
-buildUnnamed283() {
+buildUnnamed686() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed283(core.List<core.String> o) {
+checkUnnamed686(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -414,66 +414,66 @@
   buildCounterRestDescriptionIcons--;
 }
 
-buildUnnamed284() {
+buildUnnamed687() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed284(core.List<core.String> 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'));
 }
 
-buildUnnamed285() {
+buildUnnamed688() {
   var o = new core.Map<core.String, api.RestMethod>();
   o["x"] = buildRestMethod();
   o["y"] = buildRestMethod();
   return o;
 }
 
-checkUnnamed285(core.Map<core.String, api.RestMethod> o) {
+checkUnnamed688(core.Map<core.String, api.RestMethod> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestMethod(o["x"]);
   checkRestMethod(o["y"]);
 }
 
-buildUnnamed286() {
+buildUnnamed689() {
   var o = new core.Map<core.String, api.JsonSchema>();
   o["x"] = buildJsonSchema();
   o["y"] = buildJsonSchema();
   return o;
 }
 
-checkUnnamed286(core.Map<core.String, api.JsonSchema> o) {
+checkUnnamed689(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchema(o["x"]);
   checkJsonSchema(o["y"]);
 }
 
-buildUnnamed287() {
+buildUnnamed690() {
   var o = new core.Map<core.String, api.RestResource>();
   o["x"] = buildRestResource();
   o["y"] = buildRestResource();
   return o;
 }
 
-checkUnnamed287(core.Map<core.String, api.RestResource> o) {
+checkUnnamed690(core.Map<core.String, api.RestResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestResource(o["x"]);
   checkRestResource(o["y"]);
 }
 
-buildUnnamed288() {
+buildUnnamed691() {
   var o = new core.Map<core.String, api.JsonSchema>();
   o["x"] = buildJsonSchema();
   o["y"] = buildJsonSchema();
   return o;
 }
 
-checkUnnamed288(core.Map<core.String, api.JsonSchema> o) {
+checkUnnamed691(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchema(o["x"]);
   checkJsonSchema(o["y"]);
@@ -493,22 +493,22 @@
     o.discoveryVersion = "foo";
     o.documentationLink = "foo";
     o.etag = "foo";
-    o.features = buildUnnamed283();
+    o.features = buildUnnamed686();
     o.icons = buildRestDescriptionIcons();
     o.id = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed284();
-    o.methods = buildUnnamed285();
+    o.labels = buildUnnamed687();
+    o.methods = buildUnnamed688();
     o.name = "foo";
     o.ownerDomain = "foo";
     o.ownerName = "foo";
     o.packagePath = "foo";
-    o.parameters = buildUnnamed286();
+    o.parameters = buildUnnamed689();
     o.protocol = "foo";
-    o.resources = buildUnnamed287();
+    o.resources = buildUnnamed690();
     o.revision = "foo";
     o.rootUrl = "foo";
-    o.schemas = buildUnnamed288();
+    o.schemas = buildUnnamed691();
     o.servicePath = "foo";
     o.title = "foo";
     o.version = "foo";
@@ -529,22 +529,22 @@
     unittest.expect(o.discoveryVersion, unittest.equals('foo'));
     unittest.expect(o.documentationLink, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed283(o.features);
+    checkUnnamed686(o.features);
     checkRestDescriptionIcons(o.icons);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed284(o.labels);
-    checkUnnamed285(o.methods);
+    checkUnnamed687(o.labels);
+    checkUnnamed688(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'));
-    checkUnnamed286(o.parameters);
+    checkUnnamed689(o.parameters);
     unittest.expect(o.protocol, unittest.equals('foo'));
-    checkUnnamed287(o.resources);
+    checkUnnamed690(o.resources);
     unittest.expect(o.revision, unittest.equals('foo'));
     unittest.expect(o.rootUrl, unittest.equals('foo'));
-    checkUnnamed288(o.schemas);
+    checkUnnamed691(o.schemas);
     unittest.expect(o.servicePath, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals('foo'));
@@ -552,14 +552,14 @@
   buildCounterRestDescription--;
 }
 
-buildUnnamed289() {
+buildUnnamed692() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed289(core.List<core.String> o) {
+checkUnnamed692(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -633,7 +633,7 @@
   var o = new api.RestMethodMediaUpload();
   buildCounterRestMethodMediaUpload++;
   if (buildCounterRestMethodMediaUpload < 3) {
-    o.accept = buildUnnamed289();
+    o.accept = buildUnnamed692();
     o.maxSize = "foo";
     o.protocols = buildRestMethodMediaUploadProtocols();
   }
@@ -644,34 +644,34 @@
 checkRestMethodMediaUpload(api.RestMethodMediaUpload o) {
   buildCounterRestMethodMediaUpload++;
   if (buildCounterRestMethodMediaUpload < 3) {
-    checkUnnamed289(o.accept);
+    checkUnnamed692(o.accept);
     unittest.expect(o.maxSize, unittest.equals('foo'));
     checkRestMethodMediaUploadProtocols(o.protocols);
   }
   buildCounterRestMethodMediaUpload--;
 }
 
-buildUnnamed290() {
+buildUnnamed693() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed290(core.List<core.String> 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'));
 }
 
-buildUnnamed291() {
+buildUnnamed694() {
   var o = new core.Map<core.String, api.JsonSchema>();
   o["x"] = buildJsonSchema();
   o["y"] = buildJsonSchema();
   return o;
 }
 
-checkUnnamed291(core.Map<core.String, api.JsonSchema> o) {
+checkUnnamed694(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchema(o["x"]);
   checkJsonSchema(o["y"]);
@@ -717,14 +717,14 @@
   buildCounterRestMethodResponse--;
 }
 
-buildUnnamed292() {
+buildUnnamed695() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed292(core.List<core.String> o) {
+checkUnnamed695(core.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,12 +740,12 @@
     o.httpMethod = "foo";
     o.id = "foo";
     o.mediaUpload = buildRestMethodMediaUpload();
-    o.parameterOrder = buildUnnamed290();
-    o.parameters = buildUnnamed291();
+    o.parameterOrder = buildUnnamed693();
+    o.parameters = buildUnnamed694();
     o.path = "foo";
     o.request = buildRestMethodRequest();
     o.response = buildRestMethodResponse();
-    o.scopes = buildUnnamed292();
+    o.scopes = buildUnnamed695();
     o.supportsMediaDownload = true;
     o.supportsMediaUpload = true;
     o.supportsSubscription = true;
@@ -762,12 +762,12 @@
     unittest.expect(o.httpMethod, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     checkRestMethodMediaUpload(o.mediaUpload);
-    checkUnnamed290(o.parameterOrder);
-    checkUnnamed291(o.parameters);
+    checkUnnamed693(o.parameterOrder);
+    checkUnnamed694(o.parameters);
     unittest.expect(o.path, unittest.equals('foo'));
     checkRestMethodRequest(o.request);
     checkRestMethodResponse(o.response);
-    checkUnnamed292(o.scopes);
+    checkUnnamed695(o.scopes);
     unittest.expect(o.supportsMediaDownload, unittest.isTrue);
     unittest.expect(o.supportsMediaUpload, unittest.isTrue);
     unittest.expect(o.supportsSubscription, unittest.isTrue);
@@ -775,27 +775,27 @@
   buildCounterRestMethod--;
 }
 
-buildUnnamed293() {
+buildUnnamed696() {
   var o = new core.Map<core.String, api.RestMethod>();
   o["x"] = buildRestMethod();
   o["y"] = buildRestMethod();
   return o;
 }
 
-checkUnnamed293(core.Map<core.String, api.RestMethod> o) {
+checkUnnamed696(core.Map<core.String, api.RestMethod> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestMethod(o["x"]);
   checkRestMethod(o["y"]);
 }
 
-buildUnnamed294() {
+buildUnnamed697() {
   var o = new core.Map<core.String, api.RestResource>();
   o["x"] = buildRestResource();
   o["y"] = buildRestResource();
   return o;
 }
 
-checkUnnamed294(core.Map<core.String, api.RestResource> o) {
+checkUnnamed697(core.Map<core.String, api.RestResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestResource(o["x"]);
   checkRestResource(o["y"]);
@@ -806,8 +806,8 @@
   var o = new api.RestResource();
   buildCounterRestResource++;
   if (buildCounterRestResource < 3) {
-    o.methods = buildUnnamed293();
-    o.resources = buildUnnamed294();
+    o.methods = buildUnnamed696();
+    o.resources = buildUnnamed697();
   }
   buildCounterRestResource--;
   return o;
@@ -816,8 +816,8 @@
 checkRestResource(api.RestResource o) {
   buildCounterRestResource++;
   if (buildCounterRestResource < 3) {
-    checkUnnamed293(o.methods);
-    checkUnnamed294(o.resources);
+    checkUnnamed696(o.methods);
+    checkUnnamed697(o.resources);
   }
   buildCounterRestResource--;
 }
diff --git a/generated/googleapis/test/doubleclickbidmanager/v1_test.dart b/generated/googleapis/test/doubleclickbidmanager/v1_test.dart
index c634583..477b55f 100644
--- a/generated/googleapis/test/doubleclickbidmanager/v1_test.dart
+++ b/generated/googleapis/test/doubleclickbidmanager/v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed702() {
+buildUnnamed698() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed702(core.List<core.String> o) {
+checkUnnamed698(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -34,7 +34,7 @@
   var o = new api.DownloadLineItemsRequest();
   buildCounterDownloadLineItemsRequest++;
   if (buildCounterDownloadLineItemsRequest < 3) {
-    o.filterIds = buildUnnamed702();
+    o.filterIds = buildUnnamed698();
     o.filterType = "foo";
     o.format = "foo";
   }
@@ -45,7 +45,7 @@
 checkDownloadLineItemsRequest(api.DownloadLineItemsRequest o) {
   buildCounterDownloadLineItemsRequest++;
   if (buildCounterDownloadLineItemsRequest < 3) {
-    checkUnnamed702(o.filterIds);
+    checkUnnamed698(o.filterIds);
     unittest.expect(o.filterType, unittest.equals('foo'));
     unittest.expect(o.format, unittest.equals('foo'));
   }
@@ -92,14 +92,14 @@
   buildCounterFilterPair--;
 }
 
-buildUnnamed703() {
+buildUnnamed699() {
   var o = new core.List<api.Query>();
   o.add(buildQuery());
   o.add(buildQuery());
   return o;
 }
 
-checkUnnamed703(core.List<api.Query> o) {
+checkUnnamed699(core.List<api.Query> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuery(o[0]);
   checkQuery(o[1]);
@@ -111,7 +111,7 @@
   buildCounterListQueriesResponse++;
   if (buildCounterListQueriesResponse < 3) {
     o.kind = "foo";
-    o.queries = buildUnnamed703();
+    o.queries = buildUnnamed699();
   }
   buildCounterListQueriesResponse--;
   return o;
@@ -121,19 +121,19 @@
   buildCounterListQueriesResponse++;
   if (buildCounterListQueriesResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed703(o.queries);
+    checkUnnamed699(o.queries);
   }
   buildCounterListQueriesResponse--;
 }
 
-buildUnnamed704() {
+buildUnnamed700() {
   var o = new core.List<api.Report>();
   o.add(buildReport());
   o.add(buildReport());
   return o;
 }
 
-checkUnnamed704(core.List<api.Report> o) {
+checkUnnamed700(core.List<api.Report> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReport(o[0]);
   checkReport(o[1]);
@@ -145,7 +145,7 @@
   buildCounterListReportsResponse++;
   if (buildCounterListReportsResponse < 3) {
     o.kind = "foo";
-    o.reports = buildUnnamed704();
+    o.reports = buildUnnamed700();
   }
   buildCounterListReportsResponse--;
   return o;
@@ -155,45 +155,45 @@
   buildCounterListReportsResponse++;
   if (buildCounterListReportsResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed704(o.reports);
+    checkUnnamed700(o.reports);
   }
   buildCounterListReportsResponse--;
 }
 
-buildUnnamed705() {
+buildUnnamed701() {
   var o = new core.List<api.FilterPair>();
   o.add(buildFilterPair());
   o.add(buildFilterPair());
   return o;
 }
 
-checkUnnamed705(core.List<api.FilterPair> o) {
+checkUnnamed701(core.List<api.FilterPair> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilterPair(o[0]);
   checkFilterPair(o[1]);
 }
 
-buildUnnamed706() {
+buildUnnamed702() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed706(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'));
 }
 
-buildUnnamed707() {
+buildUnnamed703() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed707(core.List<core.String> o) {
+checkUnnamed703(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -204,10 +204,10 @@
   var o = new api.Parameters();
   buildCounterParameters++;
   if (buildCounterParameters < 3) {
-    o.filters = buildUnnamed705();
-    o.groupBys = buildUnnamed706();
+    o.filters = buildUnnamed701();
+    o.groupBys = buildUnnamed702();
     o.includeInviteData = true;
-    o.metrics = buildUnnamed707();
+    o.metrics = buildUnnamed703();
     o.type = "foo";
   }
   buildCounterParameters--;
@@ -217,10 +217,10 @@
 checkParameters(api.Parameters o) {
   buildCounterParameters++;
   if (buildCounterParameters < 3) {
-    checkUnnamed705(o.filters);
-    checkUnnamed706(o.groupBys);
+    checkUnnamed701(o.filters);
+    checkUnnamed702(o.groupBys);
     unittest.expect(o.includeInviteData, unittest.isTrue);
-    checkUnnamed707(o.metrics);
+    checkUnnamed703(o.metrics);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterParameters--;
@@ -259,14 +259,14 @@
   buildCounterQuery--;
 }
 
-buildUnnamed708() {
+buildUnnamed704() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed708(core.List<core.String> o) {
+checkUnnamed704(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -285,7 +285,7 @@
     o.reportCount = 42;
     o.running = true;
     o.sendNotification = true;
-    o.shareEmailAddress = buildUnnamed708();
+    o.shareEmailAddress = buildUnnamed704();
     o.title = "foo";
   }
   buildCounterQueryMetadata--;
@@ -303,7 +303,7 @@
     unittest.expect(o.reportCount, unittest.equals(42));
     unittest.expect(o.running, unittest.isTrue);
     unittest.expect(o.sendNotification, unittest.isTrue);
-    checkUnnamed708(o.shareEmailAddress);
+    checkUnnamed704(o.shareEmailAddress);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterQueryMetadata--;
@@ -447,14 +447,14 @@
   buildCounterReportStatus--;
 }
 
-buildUnnamed709() {
+buildUnnamed705() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed709(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'));
@@ -468,7 +468,7 @@
     o.changed = true;
     o.entityId = "foo";
     o.entityName = "foo";
-    o.errors = buildUnnamed709();
+    o.errors = buildUnnamed705();
     o.persisted = true;
     o.rowNumber = 42;
   }
@@ -482,7 +482,7 @@
     unittest.expect(o.changed, unittest.isTrue);
     unittest.expect(o.entityId, unittest.equals('foo'));
     unittest.expect(o.entityName, unittest.equals('foo'));
-    checkUnnamed709(o.errors);
+    checkUnnamed705(o.errors);
     unittest.expect(o.persisted, unittest.isTrue);
     unittest.expect(o.rowNumber, unittest.equals(42));
   }
@@ -556,27 +556,27 @@
   buildCounterUploadLineItemsResponse--;
 }
 
-buildUnnamed710() {
+buildUnnamed706() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed710(core.List<core.String> o) {
+checkUnnamed706(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed711() {
+buildUnnamed707() {
   var o = new core.List<api.RowStatus>();
   o.add(buildRowStatus());
   o.add(buildRowStatus());
   return o;
 }
 
-checkUnnamed711(core.List<api.RowStatus> o) {
+checkUnnamed707(core.List<api.RowStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRowStatus(o[0]);
   checkRowStatus(o[1]);
@@ -587,8 +587,8 @@
   var o = new api.UploadStatus();
   buildCounterUploadStatus++;
   if (buildCounterUploadStatus < 3) {
-    o.errors = buildUnnamed710();
-    o.rowStatus = buildUnnamed711();
+    o.errors = buildUnnamed706();
+    o.rowStatus = buildUnnamed707();
   }
   buildCounterUploadStatus--;
   return o;
@@ -597,8 +597,8 @@
 checkUploadStatus(api.UploadStatus o) {
   buildCounterUploadStatus++;
   if (buildCounterUploadStatus < 3) {
-    checkUnnamed710(o.errors);
-    checkUnnamed711(o.rowStatus);
+    checkUnnamed706(o.errors);
+    checkUnnamed707(o.rowStatus);
   }
   buildCounterUploadStatus--;
 }
diff --git a/generated/googleapis/test/doubleclicksearch/v2_test.dart b/generated/googleapis/test/doubleclicksearch/v2_test.dart
index d012909..4a8dc5b 100644
--- a/generated/googleapis/test/doubleclicksearch/v2_test.dart
+++ b/generated/googleapis/test/doubleclicksearch/v2_test.dart
@@ -45,27 +45,27 @@
   buildCounterAvailability--;
 }
 
-buildUnnamed742() {
+buildUnnamed708() {
   var o = new core.List<api.CustomDimension>();
   o.add(buildCustomDimension());
   o.add(buildCustomDimension());
   return o;
 }
 
-checkUnnamed742(core.List<api.CustomDimension> o) {
+checkUnnamed708(core.List<api.CustomDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomDimension(o[0]);
   checkCustomDimension(o[1]);
 }
 
-buildUnnamed743() {
+buildUnnamed709() {
   var o = new core.List<api.CustomMetric>();
   o.add(buildCustomMetric());
   o.add(buildCustomMetric());
   return o;
 }
 
-checkUnnamed743(core.List<api.CustomMetric> o) {
+checkUnnamed709(core.List<api.CustomMetric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomMetric(o[0]);
   checkCustomMetric(o[1]);
@@ -87,8 +87,8 @@
     o.conversionTimestamp = "foo";
     o.criterionId = "foo";
     o.currencyCode = "foo";
-    o.customDimension = buildUnnamed742();
-    o.customMetric = buildUnnamed743();
+    o.customDimension = buildUnnamed708();
+    o.customMetric = buildUnnamed709();
     o.dsConversionId = "foo";
     o.engineAccountId = "foo";
     o.floodlightOrderId = "foo";
@@ -118,8 +118,8 @@
     unittest.expect(o.conversionTimestamp, unittest.equals('foo'));
     unittest.expect(o.criterionId, unittest.equals('foo'));
     unittest.expect(o.currencyCode, unittest.equals('foo'));
-    checkUnnamed742(o.customDimension);
-    checkUnnamed743(o.customMetric);
+    checkUnnamed708(o.customDimension);
+    checkUnnamed709(o.customMetric);
     unittest.expect(o.dsConversionId, unittest.equals('foo'));
     unittest.expect(o.engineAccountId, unittest.equals('foo'));
     unittest.expect(o.floodlightOrderId, unittest.equals('foo'));
@@ -134,14 +134,14 @@
   buildCounterConversion--;
 }
 
-buildUnnamed744() {
+buildUnnamed710() {
   var o = new core.List<api.Conversion>();
   o.add(buildConversion());
   o.add(buildConversion());
   return o;
 }
 
-checkUnnamed744(core.List<api.Conversion> o) {
+checkUnnamed710(core.List<api.Conversion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConversion(o[0]);
   checkConversion(o[1]);
@@ -152,7 +152,7 @@
   var o = new api.ConversionList();
   buildCounterConversionList++;
   if (buildCounterConversionList < 3) {
-    o.conversion = buildUnnamed744();
+    o.conversion = buildUnnamed710();
     o.kind = "foo";
   }
   buildCounterConversionList--;
@@ -162,7 +162,7 @@
 checkConversionList(api.ConversionList o) {
   buildCounterConversionList++;
   if (buildCounterConversionList < 3) {
-    checkUnnamed744(o.conversion);
+    checkUnnamed710(o.conversion);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterConversionList--;
@@ -231,27 +231,27 @@
   buildCounterReportFiles--;
 }
 
-buildUnnamed745() {
+buildUnnamed711() {
   var o = new core.List<api.ReportFiles>();
   o.add(buildReportFiles());
   o.add(buildReportFiles());
   return o;
 }
 
-checkUnnamed745(core.List<api.ReportFiles> o) {
+checkUnnamed711(core.List<api.ReportFiles> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportFiles(o[0]);
   checkReportFiles(o[1]);
 }
 
-buildUnnamed746() {
+buildUnnamed712() {
   var o = new core.List<api.ReportRow>();
   o.add(buildReportRow());
   o.add(buildReportRow());
   return o;
 }
 
-checkUnnamed746(core.List<api.ReportRow> o) {
+checkUnnamed712(core.List<api.ReportRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportRow(o[0]);
   checkReportRow(o[1]);
@@ -262,13 +262,13 @@
   var o = new api.Report();
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    o.files = buildUnnamed745();
+    o.files = buildUnnamed711();
     o.id = "foo";
     o.isReportReady = true;
     o.kind = "foo";
     o.request = buildReportRequest();
     o.rowCount = 42;
-    o.rows = buildUnnamed746();
+    o.rows = buildUnnamed712();
     o.statisticsCurrencyCode = "foo";
     o.statisticsTimeZone = "foo";
   }
@@ -279,13 +279,13 @@
 checkReport(api.Report o) {
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    checkUnnamed745(o.files);
+    checkUnnamed711(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));
-    checkUnnamed746(o.rows);
+    checkUnnamed712(o.rows);
     unittest.expect(o.statisticsCurrencyCode, unittest.equals('foo'));
     unittest.expect(o.statisticsTimeZone, unittest.equals('foo'));
   }
@@ -327,27 +327,27 @@
   buildCounterReportApiColumnSpec--;
 }
 
-buildUnnamed747() {
+buildUnnamed713() {
   var o = new core.List<api.ReportApiColumnSpec>();
   o.add(buildReportApiColumnSpec());
   o.add(buildReportApiColumnSpec());
   return o;
 }
 
-checkUnnamed747(core.List<api.ReportApiColumnSpec> o) {
+checkUnnamed713(core.List<api.ReportApiColumnSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportApiColumnSpec(o[0]);
   checkReportApiColumnSpec(o[1]);
 }
 
-buildUnnamed748() {
+buildUnnamed714() {
   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'});
   return o;
 }
 
-checkUnnamed748(core.List<core.Object> o) {
+checkUnnamed714(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')); 
@@ -360,7 +360,7 @@
   if (buildCounterReportRequestFilters < 3) {
     o.column = buildReportApiColumnSpec();
     o.operator = "foo";
-    o.values = buildUnnamed748();
+    o.values = buildUnnamed714();
   }
   buildCounterReportRequestFilters--;
   return o;
@@ -371,19 +371,19 @@
   if (buildCounterReportRequestFilters < 3) {
     checkReportApiColumnSpec(o.column);
     unittest.expect(o.operator, unittest.equals('foo'));
-    checkUnnamed748(o.values);
+    checkUnnamed714(o.values);
   }
   buildCounterReportRequestFilters--;
 }
 
-buildUnnamed749() {
+buildUnnamed715() {
   var o = new core.List<api.ReportRequestFilters>();
   o.add(buildReportRequestFilters());
   o.add(buildReportRequestFilters());
   return o;
 }
 
-checkUnnamed749(core.List<api.ReportRequestFilters> o) {
+checkUnnamed715(core.List<api.ReportRequestFilters> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportRequestFilters(o[0]);
   checkReportRequestFilters(o[1]);
@@ -410,14 +410,14 @@
   buildCounterReportRequestOrderBy--;
 }
 
-buildUnnamed750() {
+buildUnnamed716() {
   var o = new core.List<api.ReportRequestOrderBy>();
   o.add(buildReportRequestOrderBy());
   o.add(buildReportRequestOrderBy());
   return o;
 }
 
-checkUnnamed750(core.List<api.ReportRequestOrderBy> o) {
+checkUnnamed716(core.List<api.ReportRequestOrderBy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportRequestOrderBy(o[0]);
   checkReportRequestOrderBy(o[1]);
@@ -484,13 +484,13 @@
   var o = new api.ReportRequest();
   buildCounterReportRequest++;
   if (buildCounterReportRequest < 3) {
-    o.columns = buildUnnamed747();
+    o.columns = buildUnnamed713();
     o.downloadFormat = "foo";
-    o.filters = buildUnnamed749();
+    o.filters = buildUnnamed715();
     o.includeDeletedEntities = true;
     o.includeRemovedEntities = true;
     o.maxRowsPerFile = 42;
-    o.orderBy = buildUnnamed750();
+    o.orderBy = buildUnnamed716();
     o.reportScope = buildReportRequestReportScope();
     o.reportType = "foo";
     o.rowCount = 42;
@@ -506,13 +506,13 @@
 checkReportRequest(api.ReportRequest o) {
   buildCounterReportRequest++;
   if (buildCounterReportRequest < 3) {
-    checkUnnamed747(o.columns);
+    checkUnnamed713(o.columns);
     unittest.expect(o.downloadFormat, unittest.equals('foo'));
-    checkUnnamed749(o.filters);
+    checkUnnamed715(o.filters);
     unittest.expect(o.includeDeletedEntities, unittest.isTrue);
     unittest.expect(o.includeRemovedEntities, unittest.isTrue);
     unittest.expect(o.maxRowsPerFile, unittest.equals(42));
-    checkUnnamed750(o.orderBy);
+    checkUnnamed716(o.orderBy);
     checkReportRequestReportScope(o.reportScope);
     unittest.expect(o.reportType, unittest.equals('foo'));
     unittest.expect(o.rowCount, unittest.equals(42));
@@ -560,14 +560,14 @@
   buildCounterSavedColumn--;
 }
 
-buildUnnamed751() {
+buildUnnamed717() {
   var o = new core.List<api.SavedColumn>();
   o.add(buildSavedColumn());
   o.add(buildSavedColumn());
   return o;
 }
 
-checkUnnamed751(core.List<api.SavedColumn> o) {
+checkUnnamed717(core.List<api.SavedColumn> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSavedColumn(o[0]);
   checkSavedColumn(o[1]);
@@ -578,7 +578,7 @@
   var o = new api.SavedColumnList();
   buildCounterSavedColumnList++;
   if (buildCounterSavedColumnList < 3) {
-    o.items = buildUnnamed751();
+    o.items = buildUnnamed717();
     o.kind = "foo";
   }
   buildCounterSavedColumnList--;
@@ -588,20 +588,20 @@
 checkSavedColumnList(api.SavedColumnList o) {
   buildCounterSavedColumnList++;
   if (buildCounterSavedColumnList < 3) {
-    checkUnnamed751(o.items);
+    checkUnnamed717(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterSavedColumnList--;
 }
 
-buildUnnamed752() {
+buildUnnamed718() {
   var o = new core.List<api.Availability>();
   o.add(buildAvailability());
   o.add(buildAvailability());
   return o;
 }
 
-checkUnnamed752(core.List<api.Availability> o) {
+checkUnnamed718(core.List<api.Availability> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAvailability(o[0]);
   checkAvailability(o[1]);
@@ -612,7 +612,7 @@
   var o = new api.UpdateAvailabilityRequest();
   buildCounterUpdateAvailabilityRequest++;
   if (buildCounterUpdateAvailabilityRequest < 3) {
-    o.availabilities = buildUnnamed752();
+    o.availabilities = buildUnnamed718();
   }
   buildCounterUpdateAvailabilityRequest--;
   return o;
@@ -621,19 +621,19 @@
 checkUpdateAvailabilityRequest(api.UpdateAvailabilityRequest o) {
   buildCounterUpdateAvailabilityRequest++;
   if (buildCounterUpdateAvailabilityRequest < 3) {
-    checkUnnamed752(o.availabilities);
+    checkUnnamed718(o.availabilities);
   }
   buildCounterUpdateAvailabilityRequest--;
 }
 
-buildUnnamed753() {
+buildUnnamed719() {
   var o = new core.List<api.Availability>();
   o.add(buildAvailability());
   o.add(buildAvailability());
   return o;
 }
 
-checkUnnamed753(core.List<api.Availability> o) {
+checkUnnamed719(core.List<api.Availability> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAvailability(o[0]);
   checkAvailability(o[1]);
@@ -644,7 +644,7 @@
   var o = new api.UpdateAvailabilityResponse();
   buildCounterUpdateAvailabilityResponse++;
   if (buildCounterUpdateAvailabilityResponse < 3) {
-    o.availabilities = buildUnnamed753();
+    o.availabilities = buildUnnamed719();
   }
   buildCounterUpdateAvailabilityResponse--;
   return o;
@@ -653,7 +653,7 @@
 checkUpdateAvailabilityResponse(api.UpdateAvailabilityResponse o) {
   buildCounterUpdateAvailabilityResponse++;
   if (buildCounterUpdateAvailabilityResponse < 3) {
-    checkUnnamed753(o.availabilities);
+    checkUnnamed719(o.availabilities);
   }
   buildCounterUpdateAvailabilityResponse--;
 }
diff --git a/generated/googleapis/test/drive/v2_test.dart b/generated/googleapis/test/drive/v2_test.dart
index 901e62a..acec22e 100644
--- a/generated/googleapis/test/drive/v2_test.dart
+++ b/generated/googleapis/test/drive/v2_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed400() {
+buildUnnamed720() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed400(core.List<core.String> o) {
+checkUnnamed720(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -34,7 +34,7 @@
   var o = new api.AboutAdditionalRoleInfoRoleSets();
   buildCounterAboutAdditionalRoleInfoRoleSets++;
   if (buildCounterAboutAdditionalRoleInfoRoleSets < 3) {
-    o.additionalRoles = buildUnnamed400();
+    o.additionalRoles = buildUnnamed720();
     o.primaryRole = "foo";
   }
   buildCounterAboutAdditionalRoleInfoRoleSets--;
@@ -44,20 +44,20 @@
 checkAboutAdditionalRoleInfoRoleSets(api.AboutAdditionalRoleInfoRoleSets o) {
   buildCounterAboutAdditionalRoleInfoRoleSets++;
   if (buildCounterAboutAdditionalRoleInfoRoleSets < 3) {
-    checkUnnamed400(o.additionalRoles);
+    checkUnnamed720(o.additionalRoles);
     unittest.expect(o.primaryRole, unittest.equals('foo'));
   }
   buildCounterAboutAdditionalRoleInfoRoleSets--;
 }
 
-buildUnnamed401() {
+buildUnnamed721() {
   var o = new core.List<api.AboutAdditionalRoleInfoRoleSets>();
   o.add(buildAboutAdditionalRoleInfoRoleSets());
   o.add(buildAboutAdditionalRoleInfoRoleSets());
   return o;
 }
 
-checkUnnamed401(core.List<api.AboutAdditionalRoleInfoRoleSets> o) {
+checkUnnamed721(core.List<api.AboutAdditionalRoleInfoRoleSets> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutAdditionalRoleInfoRoleSets(o[0]);
   checkAboutAdditionalRoleInfoRoleSets(o[1]);
@@ -68,7 +68,7 @@
   var o = new api.AboutAdditionalRoleInfo();
   buildCounterAboutAdditionalRoleInfo++;
   if (buildCounterAboutAdditionalRoleInfo < 3) {
-    o.roleSets = buildUnnamed401();
+    o.roleSets = buildUnnamed721();
     o.type = "foo";
   }
   buildCounterAboutAdditionalRoleInfo--;
@@ -78,33 +78,33 @@
 checkAboutAdditionalRoleInfo(api.AboutAdditionalRoleInfo o) {
   buildCounterAboutAdditionalRoleInfo++;
   if (buildCounterAboutAdditionalRoleInfo < 3) {
-    checkUnnamed401(o.roleSets);
+    checkUnnamed721(o.roleSets);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterAboutAdditionalRoleInfo--;
 }
 
-buildUnnamed402() {
+buildUnnamed722() {
   var o = new core.List<api.AboutAdditionalRoleInfo>();
   o.add(buildAboutAdditionalRoleInfo());
   o.add(buildAboutAdditionalRoleInfo());
   return o;
 }
 
-checkUnnamed402(core.List<api.AboutAdditionalRoleInfo> o) {
+checkUnnamed722(core.List<api.AboutAdditionalRoleInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutAdditionalRoleInfo(o[0]);
   checkAboutAdditionalRoleInfo(o[1]);
 }
 
-buildUnnamed403() {
+buildUnnamed723() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed403(core.List<core.String> o) {
+checkUnnamed723(core.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 +116,7 @@
   buildCounterAboutExportFormats++;
   if (buildCounterAboutExportFormats < 3) {
     o.source = "foo";
-    o.targets = buildUnnamed403();
+    o.targets = buildUnnamed723();
   }
   buildCounterAboutExportFormats--;
   return o;
@@ -126,19 +126,19 @@
   buildCounterAboutExportFormats++;
   if (buildCounterAboutExportFormats < 3) {
     unittest.expect(o.source, unittest.equals('foo'));
-    checkUnnamed403(o.targets);
+    checkUnnamed723(o.targets);
   }
   buildCounterAboutExportFormats--;
 }
 
-buildUnnamed404() {
+buildUnnamed724() {
   var o = new core.List<api.AboutExportFormats>();
   o.add(buildAboutExportFormats());
   o.add(buildAboutExportFormats());
   return o;
 }
 
-checkUnnamed404(core.List<api.AboutExportFormats> o) {
+checkUnnamed724(core.List<api.AboutExportFormats> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutExportFormats(o[0]);
   checkAboutExportFormats(o[1]);
@@ -165,27 +165,27 @@
   buildCounterAboutFeatures--;
 }
 
-buildUnnamed405() {
+buildUnnamed725() {
   var o = new core.List<api.AboutFeatures>();
   o.add(buildAboutFeatures());
   o.add(buildAboutFeatures());
   return o;
 }
 
-checkUnnamed405(core.List<api.AboutFeatures> o) {
+checkUnnamed725(core.List<api.AboutFeatures> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutFeatures(o[0]);
   checkAboutFeatures(o[1]);
 }
 
-buildUnnamed406() {
+buildUnnamed726() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed406(core.List<core.String> o) {
+checkUnnamed726(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -197,7 +197,7 @@
   buildCounterAboutImportFormats++;
   if (buildCounterAboutImportFormats < 3) {
     o.source = "foo";
-    o.targets = buildUnnamed406();
+    o.targets = buildUnnamed726();
   }
   buildCounterAboutImportFormats--;
   return o;
@@ -207,19 +207,19 @@
   buildCounterAboutImportFormats++;
   if (buildCounterAboutImportFormats < 3) {
     unittest.expect(o.source, unittest.equals('foo'));
-    checkUnnamed406(o.targets);
+    checkUnnamed726(o.targets);
   }
   buildCounterAboutImportFormats--;
 }
 
-buildUnnamed407() {
+buildUnnamed727() {
   var o = new core.List<api.AboutImportFormats>();
   o.add(buildAboutImportFormats());
   o.add(buildAboutImportFormats());
   return o;
 }
 
-checkUnnamed407(core.List<api.AboutImportFormats> o) {
+checkUnnamed727(core.List<api.AboutImportFormats> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutImportFormats(o[0]);
   checkAboutImportFormats(o[1]);
@@ -246,14 +246,14 @@
   buildCounterAboutMaxUploadSizes--;
 }
 
-buildUnnamed408() {
+buildUnnamed728() {
   var o = new core.List<api.AboutMaxUploadSizes>();
   o.add(buildAboutMaxUploadSizes());
   o.add(buildAboutMaxUploadSizes());
   return o;
 }
 
-checkUnnamed408(core.List<api.AboutMaxUploadSizes> o) {
+checkUnnamed728(core.List<api.AboutMaxUploadSizes> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutMaxUploadSizes(o[0]);
   checkAboutMaxUploadSizes(o[1]);
@@ -280,14 +280,14 @@
   buildCounterAboutQuotaBytesByService--;
 }
 
-buildUnnamed409() {
+buildUnnamed729() {
   var o = new core.List<api.AboutQuotaBytesByService>();
   o.add(buildAboutQuotaBytesByService());
   o.add(buildAboutQuotaBytesByService());
   return o;
 }
 
-checkUnnamed409(core.List<api.AboutQuotaBytesByService> o) {
+checkUnnamed729(core.List<api.AboutQuotaBytesByService> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutQuotaBytesByService(o[0]);
   checkAboutQuotaBytesByService(o[1]);
@@ -298,20 +298,20 @@
   var o = new api.About();
   buildCounterAbout++;
   if (buildCounterAbout < 3) {
-    o.additionalRoleInfo = buildUnnamed402();
+    o.additionalRoleInfo = buildUnnamed722();
     o.domainSharingPolicy = "foo";
     o.etag = "foo";
-    o.exportFormats = buildUnnamed404();
-    o.features = buildUnnamed405();
-    o.importFormats = buildUnnamed407();
+    o.exportFormats = buildUnnamed724();
+    o.features = buildUnnamed725();
+    o.importFormats = buildUnnamed727();
     o.isCurrentAppInstalled = true;
     o.kind = "foo";
     o.languageCode = "foo";
     o.largestChangeId = "foo";
-    o.maxUploadSizes = buildUnnamed408();
+    o.maxUploadSizes = buildUnnamed728();
     o.name = "foo";
     o.permissionId = "foo";
-    o.quotaBytesByService = buildUnnamed409();
+    o.quotaBytesByService = buildUnnamed729();
     o.quotaBytesTotal = "foo";
     o.quotaBytesUsed = "foo";
     o.quotaBytesUsedAggregate = "foo";
@@ -329,20 +329,20 @@
 checkAbout(api.About o) {
   buildCounterAbout++;
   if (buildCounterAbout < 3) {
-    checkUnnamed402(o.additionalRoleInfo);
+    checkUnnamed722(o.additionalRoleInfo);
     unittest.expect(o.domainSharingPolicy, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed404(o.exportFormats);
-    checkUnnamed405(o.features);
-    checkUnnamed407(o.importFormats);
+    checkUnnamed724(o.exportFormats);
+    checkUnnamed725(o.features);
+    checkUnnamed727(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'));
-    checkUnnamed408(o.maxUploadSizes);
+    checkUnnamed728(o.maxUploadSizes);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.permissionId, unittest.equals('foo'));
-    checkUnnamed409(o.quotaBytesByService);
+    checkUnnamed729(o.quotaBytesByService);
     unittest.expect(o.quotaBytesTotal, unittest.equals('foo'));
     unittest.expect(o.quotaBytesUsed, unittest.equals('foo'));
     unittest.expect(o.quotaBytesUsedAggregate, unittest.equals('foo'));
@@ -379,66 +379,66 @@
   buildCounterAppIcons--;
 }
 
-buildUnnamed410() {
+buildUnnamed730() {
   var o = new core.List<api.AppIcons>();
   o.add(buildAppIcons());
   o.add(buildAppIcons());
   return o;
 }
 
-checkUnnamed410(core.List<api.AppIcons> o) {
+checkUnnamed730(core.List<api.AppIcons> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAppIcons(o[0]);
   checkAppIcons(o[1]);
 }
 
-buildUnnamed411() {
+buildUnnamed731() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed411(core.List<core.String> o) {
+checkUnnamed731(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed412() {
+buildUnnamed732() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed412(core.List<core.String> 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'));
 }
 
-buildUnnamed413() {
+buildUnnamed733() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed413(core.List<core.String> o) {
+checkUnnamed733(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed414() {
+buildUnnamed734() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed414(core.List<core.String> o) {
+checkUnnamed734(core.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 +453,7 @@
     o.createInFolderTemplate = "foo";
     o.createUrl = "foo";
     o.hasDriveWideScope = true;
-    o.icons = buildUnnamed410();
+    o.icons = buildUnnamed730();
     o.id = "foo";
     o.installed = true;
     o.kind = "foo";
@@ -461,12 +461,12 @@
     o.name = "foo";
     o.objectType = "foo";
     o.openUrlTemplate = "foo";
-    o.primaryFileExtensions = buildUnnamed411();
-    o.primaryMimeTypes = buildUnnamed412();
+    o.primaryFileExtensions = buildUnnamed731();
+    o.primaryMimeTypes = buildUnnamed732();
     o.productId = "foo";
     o.productUrl = "foo";
-    o.secondaryFileExtensions = buildUnnamed413();
-    o.secondaryMimeTypes = buildUnnamed414();
+    o.secondaryFileExtensions = buildUnnamed733();
+    o.secondaryMimeTypes = buildUnnamed734();
     o.shortDescription = "foo";
     o.supportsCreate = true;
     o.supportsImport = true;
@@ -485,7 +485,7 @@
     unittest.expect(o.createInFolderTemplate, unittest.equals('foo'));
     unittest.expect(o.createUrl, unittest.equals('foo'));
     unittest.expect(o.hasDriveWideScope, unittest.isTrue);
-    checkUnnamed410(o.icons);
+    checkUnnamed730(o.icons);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.installed, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -493,12 +493,12 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
     unittest.expect(o.openUrlTemplate, unittest.equals('foo'));
-    checkUnnamed411(o.primaryFileExtensions);
-    checkUnnamed412(o.primaryMimeTypes);
+    checkUnnamed731(o.primaryFileExtensions);
+    checkUnnamed732(o.primaryMimeTypes);
     unittest.expect(o.productId, unittest.equals('foo'));
     unittest.expect(o.productUrl, unittest.equals('foo'));
-    checkUnnamed413(o.secondaryFileExtensions);
-    checkUnnamed414(o.secondaryMimeTypes);
+    checkUnnamed733(o.secondaryFileExtensions);
+    checkUnnamed734(o.secondaryMimeTypes);
     unittest.expect(o.shortDescription, unittest.equals('foo'));
     unittest.expect(o.supportsCreate, unittest.isTrue);
     unittest.expect(o.supportsImport, unittest.isTrue);
@@ -509,27 +509,27 @@
   buildCounterApp--;
 }
 
-buildUnnamed415() {
+buildUnnamed735() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed415(core.List<core.String> o) {
+checkUnnamed735(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed416() {
+buildUnnamed736() {
   var o = new core.List<api.App>();
   o.add(buildApp());
   o.add(buildApp());
   return o;
 }
 
-checkUnnamed416(core.List<api.App> o) {
+checkUnnamed736(core.List<api.App> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApp(o[0]);
   checkApp(o[1]);
@@ -540,9 +540,9 @@
   var o = new api.AppList();
   buildCounterAppList++;
   if (buildCounterAppList < 3) {
-    o.defaultAppIds = buildUnnamed415();
+    o.defaultAppIds = buildUnnamed735();
     o.etag = "foo";
-    o.items = buildUnnamed416();
+    o.items = buildUnnamed736();
     o.kind = "foo";
     o.selfLink = "foo";
   }
@@ -553,9 +553,9 @@
 checkAppList(api.AppList o) {
   buildCounterAppList++;
   if (buildCounterAppList < 3) {
-    checkUnnamed415(o.defaultAppIds);
+    checkUnnamed735(o.defaultAppIds);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed416(o.items);
+    checkUnnamed736(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
@@ -593,14 +593,14 @@
   buildCounterChange--;
 }
 
-buildUnnamed417() {
+buildUnnamed737() {
   var o = new core.List<api.Change>();
   o.add(buildChange());
   o.add(buildChange());
   return o;
 }
 
-checkUnnamed417(core.List<api.Change> o) {
+checkUnnamed737(core.List<api.Change> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChange(o[0]);
   checkChange(o[1]);
@@ -612,7 +612,7 @@
   buildCounterChangeList++;
   if (buildCounterChangeList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed417();
+    o.items = buildUnnamed737();
     o.kind = "foo";
     o.largestChangeId = "foo";
     o.nextLink = "foo";
@@ -627,7 +627,7 @@
   buildCounterChangeList++;
   if (buildCounterChangeList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed417(o.items);
+    checkUnnamed737(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.largestChangeId, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -637,14 +637,14 @@
   buildCounterChangeList--;
 }
 
-buildUnnamed418() {
+buildUnnamed738() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed418(core.Map<core.String, core.String> o) {
+checkUnnamed738(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'));
@@ -659,7 +659,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed418();
+    o.params = buildUnnamed738();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -677,7 +677,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed418(o.params);
+    checkUnnamed738(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -687,14 +687,14 @@
   buildCounterChannel--;
 }
 
-buildUnnamed419() {
+buildUnnamed739() {
   var o = new core.List<api.ChildReference>();
   o.add(buildChildReference());
   o.add(buildChildReference());
   return o;
 }
 
-checkUnnamed419(core.List<api.ChildReference> o) {
+checkUnnamed739(core.List<api.ChildReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChildReference(o[0]);
   checkChildReference(o[1]);
@@ -706,7 +706,7 @@
   buildCounterChildList++;
   if (buildCounterChildList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed419();
+    o.items = buildUnnamed739();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -720,7 +720,7 @@
   buildCounterChildList++;
   if (buildCounterChildList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed419(o.items);
+    checkUnnamed739(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -775,14 +775,14 @@
   buildCounterCommentContext--;
 }
 
-buildUnnamed420() {
+buildUnnamed740() {
   var o = new core.List<api.CommentReply>();
   o.add(buildCommentReply());
   o.add(buildCommentReply());
   return o;
 }
 
-checkUnnamed420(core.List<api.CommentReply> o) {
+checkUnnamed740(core.List<api.CommentReply> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentReply(o[0]);
   checkCommentReply(o[1]);
@@ -805,7 +805,7 @@
     o.htmlContent = "foo";
     o.kind = "foo";
     o.modifiedDate = core.DateTime.parse("2002-02-27T14:01:02");
-    o.replies = buildUnnamed420();
+    o.replies = buildUnnamed740();
     o.selfLink = "foo";
     o.status = "foo";
   }
@@ -828,21 +828,21 @@
     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")));
-    checkUnnamed420(o.replies);
+    checkUnnamed740(o.replies);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterComment--;
 }
 
-buildUnnamed421() {
+buildUnnamed741() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed421(core.List<api.Comment> o) {
+checkUnnamed741(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -853,7 +853,7 @@
   var o = new api.CommentList();
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    o.items = buildUnnamed421();
+    o.items = buildUnnamed741();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -866,7 +866,7 @@
 checkCommentList(api.CommentList o) {
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    checkUnnamed421(o.items);
+    checkUnnamed741(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -910,14 +910,14 @@
   buildCounterCommentReply--;
 }
 
-buildUnnamed422() {
+buildUnnamed742() {
   var o = new core.List<api.CommentReply>();
   o.add(buildCommentReply());
   o.add(buildCommentReply());
   return o;
 }
 
-checkUnnamed422(core.List<api.CommentReply> o) {
+checkUnnamed742(core.List<api.CommentReply> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentReply(o[0]);
   checkCommentReply(o[1]);
@@ -928,7 +928,7 @@
   var o = new api.CommentReplyList();
   buildCounterCommentReplyList++;
   if (buildCounterCommentReplyList < 3) {
-    o.items = buildUnnamed422();
+    o.items = buildUnnamed742();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -941,7 +941,7 @@
 checkCommentReplyList(api.CommentReplyList o) {
   buildCounterCommentReplyList++;
   if (buildCounterCommentReplyList < 3) {
-    checkUnnamed422(o.items);
+    checkUnnamed742(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -950,14 +950,14 @@
   buildCounterCommentReplyList--;
 }
 
-buildUnnamed423() {
+buildUnnamed743() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed423(core.Map<core.String, core.String> o) {
+checkUnnamed743(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'));
@@ -1091,79 +1091,79 @@
   buildCounterFileLabels--;
 }
 
-buildUnnamed424() {
+buildUnnamed744() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed424(core.Map<core.String, core.String> o) {
+checkUnnamed744(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'));
 }
 
-buildUnnamed425() {
+buildUnnamed745() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed425(core.List<core.String> o) {
+checkUnnamed745(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed426() {
+buildUnnamed746() {
   var o = new core.List<api.User>();
   o.add(buildUser());
   o.add(buildUser());
   return o;
 }
 
-checkUnnamed426(core.List<api.User> o) {
+checkUnnamed746(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUser(o[0]);
   checkUser(o[1]);
 }
 
-buildUnnamed427() {
+buildUnnamed747() {
   var o = new core.List<api.ParentReference>();
   o.add(buildParentReference());
   o.add(buildParentReference());
   return o;
 }
 
-checkUnnamed427(core.List<api.ParentReference> o) {
+checkUnnamed747(core.List<api.ParentReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParentReference(o[0]);
   checkParentReference(o[1]);
 }
 
-buildUnnamed428() {
+buildUnnamed748() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed428(core.List<api.Permission> o) {
+checkUnnamed748(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
 }
 
-buildUnnamed429() {
+buildUnnamed749() {
   var o = new core.List<api.Property>();
   o.add(buildProperty());
   o.add(buildProperty());
   return o;
 }
 
-checkUnnamed429(core.List<api.Property> o) {
+checkUnnamed749(core.List<api.Property> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProperty(o[0]);
   checkProperty(o[1]);
@@ -1229,7 +1229,7 @@
     o.embedLink = "foo";
     o.etag = "foo";
     o.explicitlyTrashed = true;
-    o.exportLinks = buildUnnamed423();
+    o.exportLinks = buildUnnamed743();
     o.fileExtension = "foo";
     o.fileSize = "foo";
     o.headRevisionId = "foo";
@@ -1247,13 +1247,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 = buildUnnamed424();
+    o.openWithLinks = buildUnnamed744();
     o.originalFilename = "foo";
-    o.ownerNames = buildUnnamed425();
-    o.owners = buildUnnamed426();
-    o.parents = buildUnnamed427();
-    o.permissions = buildUnnamed428();
-    o.properties = buildUnnamed429();
+    o.ownerNames = buildUnnamed745();
+    o.owners = buildUnnamed746();
+    o.parents = buildUnnamed747();
+    o.permissions = buildUnnamed748();
+    o.properties = buildUnnamed749();
     o.quotaBytesUsed = "foo";
     o.selfLink = "foo";
     o.shared = true;
@@ -1287,7 +1287,7 @@
     unittest.expect(o.embedLink, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.explicitlyTrashed, unittest.isTrue);
-    checkUnnamed423(o.exportLinks);
+    checkUnnamed743(o.exportLinks);
     unittest.expect(o.fileExtension, unittest.equals('foo'));
     unittest.expect(o.fileSize, unittest.equals('foo'));
     unittest.expect(o.headRevisionId, unittest.equals('foo'));
@@ -1305,13 +1305,13 @@
     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")));
-    checkUnnamed424(o.openWithLinks);
+    checkUnnamed744(o.openWithLinks);
     unittest.expect(o.originalFilename, unittest.equals('foo'));
-    checkUnnamed425(o.ownerNames);
-    checkUnnamed426(o.owners);
-    checkUnnamed427(o.parents);
-    checkUnnamed428(o.permissions);
-    checkUnnamed429(o.properties);
+    checkUnnamed745(o.ownerNames);
+    checkUnnamed746(o.owners);
+    checkUnnamed747(o.parents);
+    checkUnnamed748(o.permissions);
+    checkUnnamed749(o.properties);
     unittest.expect(o.quotaBytesUsed, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.shared, unittest.isTrue);
@@ -1330,14 +1330,14 @@
   buildCounterFile--;
 }
 
-buildUnnamed430() {
+buildUnnamed750() {
   var o = new core.List<api.File>();
   o.add(buildFile());
   o.add(buildFile());
   return o;
 }
 
-checkUnnamed430(core.List<api.File> o) {
+checkUnnamed750(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFile(o[0]);
   checkFile(o[1]);
@@ -1349,7 +1349,7 @@
   buildCounterFileList++;
   if (buildCounterFileList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed430();
+    o.items = buildUnnamed750();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -1363,7 +1363,7 @@
   buildCounterFileList++;
   if (buildCounterFileList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed430(o.items);
+    checkUnnamed750(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -1372,14 +1372,14 @@
   buildCounterFileList--;
 }
 
-buildUnnamed431() {
+buildUnnamed751() {
   var o = new core.List<api.ParentReference>();
   o.add(buildParentReference());
   o.add(buildParentReference());
   return o;
 }
 
-checkUnnamed431(core.List<api.ParentReference> o) {
+checkUnnamed751(core.List<api.ParentReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParentReference(o[0]);
   checkParentReference(o[1]);
@@ -1391,7 +1391,7 @@
   buildCounterParentList++;
   if (buildCounterParentList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed431();
+    o.items = buildUnnamed751();
     o.kind = "foo";
     o.selfLink = "foo";
   }
@@ -1403,7 +1403,7 @@
   buildCounterParentList++;
   if (buildCounterParentList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed431(o.items);
+    checkUnnamed751(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
@@ -1437,14 +1437,14 @@
   buildCounterParentReference--;
 }
 
-buildUnnamed432() {
+buildUnnamed752() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed432(core.List<core.String> o) {
+checkUnnamed752(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1455,7 +1455,7 @@
   var o = new api.Permission();
   buildCounterPermission++;
   if (buildCounterPermission < 3) {
-    o.additionalRoles = buildUnnamed432();
+    o.additionalRoles = buildUnnamed752();
     o.authKey = "foo";
     o.domain = "foo";
     o.emailAddress = "foo";
@@ -1477,7 +1477,7 @@
 checkPermission(api.Permission o) {
   buildCounterPermission++;
   if (buildCounterPermission < 3) {
-    checkUnnamed432(o.additionalRoles);
+    checkUnnamed752(o.additionalRoles);
     unittest.expect(o.authKey, unittest.equals('foo'));
     unittest.expect(o.domain, unittest.equals('foo'));
     unittest.expect(o.emailAddress, unittest.equals('foo'));
@@ -1516,14 +1516,14 @@
   buildCounterPermissionId--;
 }
 
-buildUnnamed433() {
+buildUnnamed753() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed433(core.List<api.Permission> o) {
+checkUnnamed753(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
@@ -1535,7 +1535,7 @@
   buildCounterPermissionList++;
   if (buildCounterPermissionList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed433();
+    o.items = buildUnnamed753();
     o.kind = "foo";
     o.selfLink = "foo";
   }
@@ -1547,7 +1547,7 @@
   buildCounterPermissionList++;
   if (buildCounterPermissionList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed433(o.items);
+    checkUnnamed753(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
@@ -1583,14 +1583,14 @@
   buildCounterProperty--;
 }
 
-buildUnnamed434() {
+buildUnnamed754() {
   var o = new core.List<api.Property>();
   o.add(buildProperty());
   o.add(buildProperty());
   return o;
 }
 
-checkUnnamed434(core.List<api.Property> o) {
+checkUnnamed754(core.List<api.Property> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProperty(o[0]);
   checkProperty(o[1]);
@@ -1602,7 +1602,7 @@
   buildCounterPropertyList++;
   if (buildCounterPropertyList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed434();
+    o.items = buildUnnamed754();
     o.kind = "foo";
     o.selfLink = "foo";
   }
@@ -1614,21 +1614,21 @@
   buildCounterPropertyList++;
   if (buildCounterPropertyList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed434(o.items);
+    checkUnnamed754(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
   buildCounterPropertyList--;
 }
 
-buildUnnamed435() {
+buildUnnamed755() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed435(core.Map<core.String, core.String> o) {
+checkUnnamed755(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'));
@@ -1641,7 +1641,7 @@
   if (buildCounterRevision < 3) {
     o.downloadUrl = "foo";
     o.etag = "foo";
-    o.exportLinks = buildUnnamed435();
+    o.exportLinks = buildUnnamed755();
     o.fileSize = "foo";
     o.id = "foo";
     o.kind = "foo";
@@ -1667,7 +1667,7 @@
   if (buildCounterRevision < 3) {
     unittest.expect(o.downloadUrl, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed435(o.exportLinks);
+    checkUnnamed755(o.exportLinks);
     unittest.expect(o.fileSize, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -1687,14 +1687,14 @@
   buildCounterRevision--;
 }
 
-buildUnnamed436() {
+buildUnnamed756() {
   var o = new core.List<api.Revision>();
   o.add(buildRevision());
   o.add(buildRevision());
   return o;
 }
 
-checkUnnamed436(core.List<api.Revision> o) {
+checkUnnamed756(core.List<api.Revision> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRevision(o[0]);
   checkRevision(o[1]);
@@ -1706,7 +1706,7 @@
   buildCounterRevisionList++;
   if (buildCounterRevisionList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed436();
+    o.items = buildUnnamed756();
     o.kind = "foo";
     o.selfLink = "foo";
   }
@@ -1718,7 +1718,7 @@
   buildCounterRevisionList++;
   if (buildCounterRevisionList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed436(o.items);
+    checkUnnamed756(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
@@ -3265,10 +3265,13 @@
     });
 
     unittest.test("method--get", () {
+      // TODO: Implement tests for media upload;
+      // TODO: Implement tests for media download;
 
       var mock = new common_test.HttpServerMock();
       api.FilesResourceApi res = new api.DriveApi(mock).files;
       var arg_fileId = "foo";
+      var arg_acknowledgeAbuse = true;
       var arg_projection = "foo";
       var arg_updateViewedDate = true;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
@@ -3302,6 +3305,7 @@
             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["updateViewedDate"].first, unittest.equals("$arg_updateViewedDate"));
 
@@ -3312,7 +3316,7 @@
         var resp = convert.JSON.encode(buildFile());
         return new async.Future.value(common_test.stringResponse(200, h, resp));
       }), true);
-      res.get(arg_fileId, projection: arg_projection, updateViewedDate: arg_updateViewedDate).then(unittest.expectAsync(((api.File response) {
+      res.get(arg_fileId, acknowledgeAbuse: arg_acknowledgeAbuse, projection: arg_projection, updateViewedDate: arg_updateViewedDate).then(unittest.expectAsync(((api.File response) {
         checkFile(response);
       })));
     });
@@ -3755,11 +3759,14 @@
     });
 
     unittest.test("method--watch", () {
+      // TODO: Implement tests for media upload;
+      // TODO: Implement tests for media download;
 
       var mock = new common_test.HttpServerMock();
       api.FilesResourceApi res = new api.DriveApi(mock).files;
       var arg_request = buildChannel();
       var arg_fileId = "foo";
+      var arg_acknowledgeAbuse = true;
       var arg_projection = "foo";
       var arg_updateViewedDate = true;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
@@ -3800,6 +3807,7 @@
             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["updateViewedDate"].first, unittest.equals("$arg_updateViewedDate"));
 
@@ -3810,7 +3818,7 @@
         var resp = convert.JSON.encode(buildChannel());
         return new async.Future.value(common_test.stringResponse(200, h, resp));
       }), true);
-      res.watch(arg_request, arg_fileId, projection: arg_projection, updateViewedDate: arg_updateViewedDate).then(unittest.expectAsync(((api.Channel response) {
+      res.watch(arg_request, arg_fileId, acknowledgeAbuse: arg_acknowledgeAbuse, projection: arg_projection, updateViewedDate: arg_updateViewedDate).then(unittest.expectAsync(((api.Channel response) {
         checkChannel(response);
       })));
     });
diff --git a/generated/googleapis/test/fitness/v1_test.dart b/generated/googleapis/test/fitness/v1_test.dart
new file mode 100644
index 0000000..64692f4
--- /dev/null
+++ b/generated/googleapis/test/fitness/v1_test.dart
@@ -0,0 +1,1012 @@
+library googleapis.fitness.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:unittest/unittest.dart' as unittest;
+import 'package:googleapis/common/common.dart' as common;
+import 'package:googleapis/src/common_internal.dart' as common_internal;
+import '../common/common_internal_test.dart' as common_test;
+
+import 'package:googleapis/fitness/v1.dart' as api;
+
+
+
+core.int buildCounterApplication = 0;
+buildApplication() {
+  var o = new api.Application();
+  buildCounterApplication++;
+  if (buildCounterApplication < 3) {
+    o.detailsUrl = "foo";
+    o.name = "foo";
+    o.packageName = "foo";
+    o.version = "foo";
+  }
+  buildCounterApplication--;
+  return o;
+}
+
+checkApplication(api.Application o) {
+  buildCounterApplication++;
+  if (buildCounterApplication < 3) {
+    unittest.expect(o.detailsUrl, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.packageName, unittest.equals('foo'));
+    unittest.expect(o.version, unittest.equals('foo'));
+  }
+  buildCounterApplication--;
+}
+
+buildUnnamed757() {
+  var o = new core.List<api.Value>();
+  o.add(buildValue());
+  o.add(buildValue());
+  return o;
+}
+
+checkUnnamed757(core.List<api.Value> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkValue(o[0]);
+  checkValue(o[1]);
+}
+
+core.int buildCounterDataPoint = 0;
+buildDataPoint() {
+  var o = new api.DataPoint();
+  buildCounterDataPoint++;
+  if (buildCounterDataPoint < 3) {
+    o.computationTimeMillis = "foo";
+    o.dataTypeName = "foo";
+    o.endTimeNanos = "foo";
+    o.modifiedTimeMillis = "foo";
+    o.originDataSourceId = "foo";
+    o.rawTimestampNanos = "foo";
+    o.startTimeNanos = "foo";
+    o.value = buildUnnamed757();
+  }
+  buildCounterDataPoint--;
+  return o;
+}
+
+checkDataPoint(api.DataPoint o) {
+  buildCounterDataPoint++;
+  if (buildCounterDataPoint < 3) {
+    unittest.expect(o.computationTimeMillis, unittest.equals('foo'));
+    unittest.expect(o.dataTypeName, unittest.equals('foo'));
+    unittest.expect(o.endTimeNanos, unittest.equals('foo'));
+    unittest.expect(o.modifiedTimeMillis, unittest.equals('foo'));
+    unittest.expect(o.originDataSourceId, unittest.equals('foo'));
+    unittest.expect(o.rawTimestampNanos, unittest.equals('foo'));
+    unittest.expect(o.startTimeNanos, unittest.equals('foo'));
+    checkUnnamed757(o.value);
+  }
+  buildCounterDataPoint--;
+}
+
+core.int buildCounterDataSource = 0;
+buildDataSource() {
+  var o = new api.DataSource();
+  buildCounterDataSource++;
+  if (buildCounterDataSource < 3) {
+    o.application = buildApplication();
+    o.dataStreamId = "foo";
+    o.dataStreamName = "foo";
+    o.dataType = buildDataType();
+    o.device = buildDevice();
+    o.name = "foo";
+    o.type = "foo";
+  }
+  buildCounterDataSource--;
+  return o;
+}
+
+checkDataSource(api.DataSource o) {
+  buildCounterDataSource++;
+  if (buildCounterDataSource < 3) {
+    checkApplication(o.application);
+    unittest.expect(o.dataStreamId, unittest.equals('foo'));
+    unittest.expect(o.dataStreamName, unittest.equals('foo'));
+    checkDataType(o.dataType);
+    checkDevice(o.device);
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.type, unittest.equals('foo'));
+  }
+  buildCounterDataSource--;
+}
+
+buildUnnamed758() {
+  var o = new core.List<api.DataTypeField>();
+  o.add(buildDataTypeField());
+  o.add(buildDataTypeField());
+  return o;
+}
+
+checkUnnamed758(core.List<api.DataTypeField> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkDataTypeField(o[0]);
+  checkDataTypeField(o[1]);
+}
+
+core.int buildCounterDataType = 0;
+buildDataType() {
+  var o = new api.DataType();
+  buildCounterDataType++;
+  if (buildCounterDataType < 3) {
+    o.field = buildUnnamed758();
+    o.name = "foo";
+  }
+  buildCounterDataType--;
+  return o;
+}
+
+checkDataType(api.DataType o) {
+  buildCounterDataType++;
+  if (buildCounterDataType < 3) {
+    checkUnnamed758(o.field);
+    unittest.expect(o.name, unittest.equals('foo'));
+  }
+  buildCounterDataType--;
+}
+
+core.int buildCounterDataTypeField = 0;
+buildDataTypeField() {
+  var o = new api.DataTypeField();
+  buildCounterDataTypeField++;
+  if (buildCounterDataTypeField < 3) {
+    o.format = "foo";
+    o.name = "foo";
+  }
+  buildCounterDataTypeField--;
+  return o;
+}
+
+checkDataTypeField(api.DataTypeField o) {
+  buildCounterDataTypeField++;
+  if (buildCounterDataTypeField < 3) {
+    unittest.expect(o.format, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+  }
+  buildCounterDataTypeField--;
+}
+
+buildUnnamed759() {
+  var o = new core.List<api.DataPoint>();
+  o.add(buildDataPoint());
+  o.add(buildDataPoint());
+  return o;
+}
+
+checkUnnamed759(core.List<api.DataPoint> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkDataPoint(o[0]);
+  checkDataPoint(o[1]);
+}
+
+core.int buildCounterDataset = 0;
+buildDataset() {
+  var o = new api.Dataset();
+  buildCounterDataset++;
+  if (buildCounterDataset < 3) {
+    o.dataSourceId = "foo";
+    o.maxEndTimeNs = "foo";
+    o.minStartTimeNs = "foo";
+    o.point = buildUnnamed759();
+  }
+  buildCounterDataset--;
+  return o;
+}
+
+checkDataset(api.Dataset o) {
+  buildCounterDataset++;
+  if (buildCounterDataset < 3) {
+    unittest.expect(o.dataSourceId, unittest.equals('foo'));
+    unittest.expect(o.maxEndTimeNs, unittest.equals('foo'));
+    unittest.expect(o.minStartTimeNs, unittest.equals('foo'));
+    checkUnnamed759(o.point);
+  }
+  buildCounterDataset--;
+}
+
+core.int buildCounterDevice = 0;
+buildDevice() {
+  var o = new api.Device();
+  buildCounterDevice++;
+  if (buildCounterDevice < 3) {
+    o.manufacturer = "foo";
+    o.model = "foo";
+    o.type = "foo";
+    o.uid = "foo";
+    o.version = "foo";
+  }
+  buildCounterDevice--;
+  return o;
+}
+
+checkDevice(api.Device o) {
+  buildCounterDevice++;
+  if (buildCounterDevice < 3) {
+    unittest.expect(o.manufacturer, unittest.equals('foo'));
+    unittest.expect(o.model, unittest.equals('foo'));
+    unittest.expect(o.type, unittest.equals('foo'));
+    unittest.expect(o.uid, unittest.equals('foo'));
+    unittest.expect(o.version, unittest.equals('foo'));
+  }
+  buildCounterDevice--;
+}
+
+buildUnnamed760() {
+  var o = new core.List<api.DataSource>();
+  o.add(buildDataSource());
+  o.add(buildDataSource());
+  return o;
+}
+
+checkUnnamed760(core.List<api.DataSource> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkDataSource(o[0]);
+  checkDataSource(o[1]);
+}
+
+core.int buildCounterListDataSourcesResponse = 0;
+buildListDataSourcesResponse() {
+  var o = new api.ListDataSourcesResponse();
+  buildCounterListDataSourcesResponse++;
+  if (buildCounterListDataSourcesResponse < 3) {
+    o.dataSource = buildUnnamed760();
+  }
+  buildCounterListDataSourcesResponse--;
+  return o;
+}
+
+checkListDataSourcesResponse(api.ListDataSourcesResponse o) {
+  buildCounterListDataSourcesResponse++;
+  if (buildCounterListDataSourcesResponse < 3) {
+    checkUnnamed760(o.dataSource);
+  }
+  buildCounterListDataSourcesResponse--;
+}
+
+buildUnnamed761() {
+  var o = new core.List<api.Session>();
+  o.add(buildSession());
+  o.add(buildSession());
+  return o;
+}
+
+checkUnnamed761(core.List<api.Session> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkSession(o[0]);
+  checkSession(o[1]);
+}
+
+buildUnnamed762() {
+  var o = new core.List<api.Session>();
+  o.add(buildSession());
+  o.add(buildSession());
+  return o;
+}
+
+checkUnnamed762(core.List<api.Session> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkSession(o[0]);
+  checkSession(o[1]);
+}
+
+core.int buildCounterListSessionsResponse = 0;
+buildListSessionsResponse() {
+  var o = new api.ListSessionsResponse();
+  buildCounterListSessionsResponse++;
+  if (buildCounterListSessionsResponse < 3) {
+    o.deletedSession = buildUnnamed761();
+    o.nextPageToken = "foo";
+    o.session = buildUnnamed762();
+  }
+  buildCounterListSessionsResponse--;
+  return o;
+}
+
+checkListSessionsResponse(api.ListSessionsResponse o) {
+  buildCounterListSessionsResponse++;
+  if (buildCounterListSessionsResponse < 3) {
+    checkUnnamed761(o.deletedSession);
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+    checkUnnamed762(o.session);
+  }
+  buildCounterListSessionsResponse--;
+}
+
+core.int buildCounterSession = 0;
+buildSession() {
+  var o = new api.Session();
+  buildCounterSession++;
+  if (buildCounterSession < 3) {
+    o.activityType = 42;
+    o.application = buildApplication();
+    o.description = "foo";
+    o.endTimeMillis = "foo";
+    o.id = "foo";
+    o.modifiedTimeMillis = "foo";
+    o.name = "foo";
+    o.startTimeMillis = "foo";
+  }
+  buildCounterSession--;
+  return o;
+}
+
+checkSession(api.Session o) {
+  buildCounterSession++;
+  if (buildCounterSession < 3) {
+    unittest.expect(o.activityType, unittest.equals(42));
+    checkApplication(o.application);
+    unittest.expect(o.description, unittest.equals('foo'));
+    unittest.expect(o.endTimeMillis, unittest.equals('foo'));
+    unittest.expect(o.id, unittest.equals('foo'));
+    unittest.expect(o.modifiedTimeMillis, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.startTimeMillis, unittest.equals('foo'));
+  }
+  buildCounterSession--;
+}
+
+core.int buildCounterValue = 0;
+buildValue() {
+  var o = new api.Value();
+  buildCounterValue++;
+  if (buildCounterValue < 3) {
+    o.fpVal = 42.0;
+    o.intVal = 42;
+  }
+  buildCounterValue--;
+  return o;
+}
+
+checkValue(api.Value o) {
+  buildCounterValue++;
+  if (buildCounterValue < 3) {
+    unittest.expect(o.fpVal, unittest.equals(42.0));
+    unittest.expect(o.intVal, unittest.equals(42));
+  }
+  buildCounterValue--;
+}
+
+buildUnnamed763() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed763(core.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-Application", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildApplication();
+      var od = new api.Application.fromJson(o.toJson());
+      checkApplication(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-DataPoint", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildDataPoint();
+      var od = new api.DataPoint.fromJson(o.toJson());
+      checkDataPoint(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-DataSource", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildDataSource();
+      var od = new api.DataSource.fromJson(o.toJson());
+      checkDataSource(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-DataType", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildDataType();
+      var od = new api.DataType.fromJson(o.toJson());
+      checkDataType(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-DataTypeField", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildDataTypeField();
+      var od = new api.DataTypeField.fromJson(o.toJson());
+      checkDataTypeField(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-Dataset", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildDataset();
+      var od = new api.Dataset.fromJson(o.toJson());
+      checkDataset(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-Device", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildDevice();
+      var od = new api.Device.fromJson(o.toJson());
+      checkDevice(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ListDataSourcesResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListDataSourcesResponse();
+      var od = new api.ListDataSourcesResponse.fromJson(o.toJson());
+      checkListDataSourcesResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ListSessionsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListSessionsResponse();
+      var od = new api.ListSessionsResponse.fromJson(o.toJson());
+      checkListSessionsResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-Session", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSession();
+      var od = new api.Session.fromJson(o.toJson());
+      checkSession(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-Value", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildValue();
+      var od = new api.Value.fromJson(o.toJson());
+      checkValue(od);
+    });
+  });
+
+
+  unittest.group("resource-UsersDataSourcesResourceApi", () {
+    unittest.test("method--create", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.UsersDataSourcesResourceApi res = new api.FitnessApi(mock).users.dataSources;
+      var arg_request = buildDataSource();
+      var arg_userId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.DataSource.fromJson(json);
+        checkDataSource(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+
+        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(buildDataSource());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.create(arg_request, arg_userId).then(unittest.expectAsync(((api.DataSource response) {
+        checkDataSource(response);
+      })));
+    });
+
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.UsersDataSourcesResourceApi res = new api.FitnessApi(mock).users.dataSources;
+      var arg_userId = "foo";
+      var arg_dataSourceId = "foo";
+      mock.register(unittest.expectAsync((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;
+
+        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(buildDataSource());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_userId, arg_dataSourceId).then(unittest.expectAsync(((api.DataSource response) {
+        checkDataSource(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.UsersDataSourcesResourceApi res = new api.FitnessApi(mock).users.dataSources;
+      var arg_userId = "foo";
+      var arg_dataTypeName = buildUnnamed763();
+      mock.register(unittest.expectAsync((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;
+
+        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["dataTypeName"], unittest.equals(arg_dataTypeName));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildListDataSourcesResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_userId, dataTypeName: arg_dataTypeName).then(unittest.expectAsync(((api.ListDataSourcesResponse response) {
+        checkListDataSourcesResponse(response);
+      })));
+    });
+
+    unittest.test("method--patch", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.UsersDataSourcesResourceApi res = new api.FitnessApi(mock).users.dataSources;
+      var arg_request = buildDataSource();
+      var arg_userId = "foo";
+      var arg_dataSourceId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.DataSource.fromJson(json);
+        checkDataSource(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+
+        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(buildDataSource());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.patch(arg_request, arg_userId, arg_dataSourceId).then(unittest.expectAsync(((api.DataSource response) {
+        checkDataSource(response);
+      })));
+    });
+
+    unittest.test("method--update", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.UsersDataSourcesResourceApi res = new api.FitnessApi(mock).users.dataSources;
+      var arg_request = buildDataSource();
+      var arg_userId = "foo";
+      var arg_dataSourceId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.DataSource.fromJson(json);
+        checkDataSource(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+
+        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(buildDataSource());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.update(arg_request, arg_userId, arg_dataSourceId).then(unittest.expectAsync(((api.DataSource response) {
+        checkDataSource(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-UsersDataSourcesDatasetsResourceApi", () {
+    unittest.test("method--delete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.UsersDataSourcesDatasetsResourceApi res = new api.FitnessApi(mock).users.dataSources.datasets;
+      var arg_userId = "foo";
+      var arg_dataSourceId = "foo";
+      var arg_datasetId = "foo";
+      var arg_currentTimeMillis = "foo";
+      var arg_modifiedTimeMillis = "foo";
+      mock.register(unittest.expectAsync((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;
+
+        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["currentTimeMillis"].first, unittest.equals(arg_currentTimeMillis));
+        unittest.expect(queryMap["modifiedTimeMillis"].first, unittest.equals(arg_modifiedTimeMillis));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.delete(arg_userId, arg_dataSourceId, arg_datasetId, currentTimeMillis: arg_currentTimeMillis, modifiedTimeMillis: arg_modifiedTimeMillis).then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.UsersDataSourcesDatasetsResourceApi res = new api.FitnessApi(mock).users.dataSources.datasets;
+      var arg_userId = "foo";
+      var arg_dataSourceId = "foo";
+      var arg_datasetId = "foo";
+      mock.register(unittest.expectAsync((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;
+
+        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(buildDataset());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_userId, arg_dataSourceId, arg_datasetId).then(unittest.expectAsync(((api.Dataset response) {
+        checkDataset(response);
+      })));
+    });
+
+    unittest.test("method--patch", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.UsersDataSourcesDatasetsResourceApi res = new api.FitnessApi(mock).users.dataSources.datasets;
+      var arg_request = buildDataset();
+      var arg_userId = "foo";
+      var arg_dataSourceId = "foo";
+      var arg_datasetId = "foo";
+      var arg_currentTimeMillis = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.Dataset.fromJson(json);
+        checkDataset(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+
+        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["currentTimeMillis"].first, unittest.equals(arg_currentTimeMillis));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildDataset());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.patch(arg_request, arg_userId, arg_dataSourceId, arg_datasetId, currentTimeMillis: arg_currentTimeMillis).then(unittest.expectAsync(((api.Dataset response) {
+        checkDataset(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-UsersSessionsResourceApi", () {
+    unittest.test("method--delete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.UsersSessionsResourceApi res = new api.FitnessApi(mock).users.sessions;
+      var arg_userId = "foo";
+      var arg_sessionId = "foo";
+      var arg_currentTimeMillis = "foo";
+      mock.register(unittest.expectAsync((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;
+
+        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["currentTimeMillis"].first, unittest.equals(arg_currentTimeMillis));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.delete(arg_userId, arg_sessionId, currentTimeMillis: arg_currentTimeMillis).then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.UsersSessionsResourceApi res = new api.FitnessApi(mock).users.sessions;
+      var arg_userId = "foo";
+      var arg_endTime = "foo";
+      var arg_includeDeleted = true;
+      var arg_pageToken = "foo";
+      var arg_startTime = "foo";
+      mock.register(unittest.expectAsync((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;
+
+        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["endTime"].first, unittest.equals(arg_endTime));
+        unittest.expect(queryMap["includeDeleted"].first, unittest.equals("$arg_includeDeleted"));
+        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",
+        };
+        var resp = convert.JSON.encode(buildListSessionsResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_userId, endTime: arg_endTime, includeDeleted: arg_includeDeleted, pageToken: arg_pageToken, startTime: arg_startTime).then(unittest.expectAsync(((api.ListSessionsResponse response) {
+        checkListSessionsResponse(response);
+      })));
+    });
+
+    unittest.test("method--update", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.UsersSessionsResourceApi res = new api.FitnessApi(mock).users.sessions;
+      var arg_request = buildSession();
+      var arg_userId = "foo";
+      var arg_sessionId = "foo";
+      var arg_currentTimeMillis = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.Session.fromJson(json);
+        checkSession(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+
+        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["currentTimeMillis"].first, unittest.equals(arg_currentTimeMillis));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildSession());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.update(arg_request, arg_userId, arg_sessionId, currentTimeMillis: arg_currentTimeMillis).then(unittest.expectAsync(((api.Session response) {
+        checkSession(response);
+      })));
+    });
+
+  });
+
+
+}
+
diff --git a/generated/googleapis/test/freebase/v1_test.dart b/generated/googleapis/test/freebase/v1_test.dart
index 9d5ac32..5704af6 100644
--- a/generated/googleapis/test/freebase/v1_test.dart
+++ b/generated/googleapis/test/freebase/v1_test.dart
@@ -64,14 +64,14 @@
   buildCounterReconcileCandidate--;
 }
 
-buildUnnamed730() {
+buildUnnamed764() {
   var o = new core.List<api.ReconcileCandidate>();
   o.add(buildReconcileCandidate());
   o.add(buildReconcileCandidate());
   return o;
 }
 
-checkUnnamed730(core.List<api.ReconcileCandidate> o) {
+checkUnnamed764(core.List<api.ReconcileCandidate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReconcileCandidate(o[0]);
   checkReconcileCandidate(o[1]);
@@ -121,14 +121,14 @@
   buildCounterReconcileGetWarning--;
 }
 
-buildUnnamed731() {
+buildUnnamed765() {
   var o = new core.List<api.ReconcileGetWarning>();
   o.add(buildReconcileGetWarning());
   o.add(buildReconcileGetWarning());
   return o;
 }
 
-checkUnnamed731(core.List<api.ReconcileGetWarning> o) {
+checkUnnamed765(core.List<api.ReconcileGetWarning> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReconcileGetWarning(o[0]);
   checkReconcileGetWarning(o[1]);
@@ -139,10 +139,10 @@
   var o = new api.ReconcileGet();
   buildCounterReconcileGet++;
   if (buildCounterReconcileGet < 3) {
-    o.candidate = buildUnnamed730();
+    o.candidate = buildUnnamed764();
     o.costs = buildReconcileGetCosts();
     o.match = buildReconcileCandidate();
-    o.warning = buildUnnamed731();
+    o.warning = buildUnnamed765();
   }
   buildCounterReconcileGet--;
   return o;
@@ -151,139 +151,139 @@
 checkReconcileGet(api.ReconcileGet o) {
   buildCounterReconcileGet++;
   if (buildCounterReconcileGet < 3) {
-    checkUnnamed730(o.candidate);
+    checkUnnamed764(o.candidate);
     checkReconcileGetCosts(o.costs);
     checkReconcileCandidate(o.match);
-    checkUnnamed731(o.warning);
+    checkUnnamed765(o.warning);
   }
   buildCounterReconcileGet--;
 }
 
-buildUnnamed732() {
+buildUnnamed766() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed732(core.List<core.String> o) {
+checkUnnamed766(core.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() {
+buildUnnamed767() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed733(core.List<core.String> o) {
+checkUnnamed767(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed734() {
+buildUnnamed768() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed734(core.List<core.String> o) {
+checkUnnamed768(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed735() {
+buildUnnamed769() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed735(core.List<core.String> o) {
+checkUnnamed769(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed736() {
+buildUnnamed770() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed736(core.List<core.String> o) {
+checkUnnamed770(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed737() {
+buildUnnamed771() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed737(core.List<core.String> o) {
+checkUnnamed771(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed738() {
+buildUnnamed772() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed738(core.List<core.String> o) {
+checkUnnamed772(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed739() {
+buildUnnamed773() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed739(core.List<core.String> o) {
+checkUnnamed773(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed740() {
+buildUnnamed774() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed740(core.List<core.String> o) {
+checkUnnamed774(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed741() {
+buildUnnamed775() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed741(core.List<core.String> o) {
+checkUnnamed775(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -342,11 +342,11 @@
       var mock = new common_test.HttpServerMock();
       api.FreebaseApi res = new api.FreebaseApi(mock);
       var arg_confidence = 42.0;
-      var arg_kind = buildUnnamed732();
-      var arg_lang = buildUnnamed733();
+      var arg_kind = buildUnnamed766();
+      var arg_lang = buildUnnamed767();
       var arg_limit = 42;
       var arg_name = "foo";
-      var arg_prop = buildUnnamed734();
+      var arg_prop = buildUnnamed768();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -403,16 +403,16 @@
       var arg_asOfTime = "foo";
       var arg_callback = "foo";
       var arg_cursor = 42;
-      var arg_domain = buildUnnamed735();
+      var arg_domain = buildUnnamed769();
       var arg_encode = "foo";
       var arg_exact = true;
-      var arg_filter = buildUnnamed736();
+      var arg_filter = buildUnnamed770();
       var arg_format = "foo";
       var arg_help = "foo";
       var arg_indent = true;
-      var arg_lang = buildUnnamed737();
+      var arg_lang = buildUnnamed771();
       var arg_limit = 42;
-      var arg_mid = buildUnnamed738();
+      var arg_mid = buildUnnamed772();
       var arg_mqlOutput = "foo";
       var arg_output = "foo";
       var arg_prefixed = true;
@@ -420,9 +420,9 @@
       var arg_scoring = "foo";
       var arg_spell = "foo";
       var arg_stemmed = true;
-      var arg_type = buildUnnamed739();
-      var arg_with_ = buildUnnamed740();
-      var arg_without = buildUnnamed741();
+      var arg_type = buildUnnamed773();
+      var arg_with_ = buildUnnamed774();
+      var arg_without = buildUnnamed775();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
diff --git a/generated/googleapis/test/fusiontables/v1_test.dart b/generated/googleapis/test/fusiontables/v1_test.dart
index 5c56a20..a8f6382 100644
--- a/generated/googleapis/test/fusiontables/v1_test.dart
+++ b/generated/googleapis/test/fusiontables/v1_test.dart
@@ -97,14 +97,14 @@
   buildCounterColumn--;
 }
 
-buildUnnamed1066() {
+buildUnnamed776() {
   var o = new core.List<api.Column>();
   o.add(buildColumn());
   o.add(buildColumn());
   return o;
 }
 
-checkUnnamed1066(core.List<api.Column> o) {
+checkUnnamed776(core.List<api.Column> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColumn(o[0]);
   checkColumn(o[1]);
@@ -115,7 +115,7 @@
   var o = new api.ColumnList();
   buildCounterColumnList++;
   if (buildCounterColumnList < 3) {
-    o.items = buildUnnamed1066();
+    o.items = buildUnnamed776();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -127,7 +127,7 @@
 checkColumnList(api.ColumnList o) {
   buildCounterColumnList++;
   if (buildCounterColumnList < 3) {
-    checkUnnamed1066(o.items);
+    checkUnnamed776(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -135,14 +135,14 @@
   buildCounterColumnList--;
 }
 
-buildUnnamed1067() {
+buildUnnamed777() {
   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'});
   return o;
 }
 
-checkUnnamed1067(core.List<core.Object> o) {
+checkUnnamed777(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')); 
@@ -153,7 +153,7 @@
   var o = new api.Geometry();
   buildCounterGeometry++;
   if (buildCounterGeometry < 3) {
-    o.geometries = buildUnnamed1067();
+    o.geometries = buildUnnamed777();
     o.geometry = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
     o.type = "foo";
   }
@@ -164,7 +164,7 @@
 checkGeometry(api.Geometry o) {
   buildCounterGeometry++;
   if (buildCounterGeometry < 3) {
-    checkUnnamed1067(o.geometries);
+    checkUnnamed777(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'));
   }
@@ -192,30 +192,30 @@
   buildCounterImport--;
 }
 
-buildUnnamed1068() {
+buildUnnamed778() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1068(core.List<core.double> o) {
+checkUnnamed778(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));
 }
 
-buildUnnamed1069() {
+buildUnnamed779() {
   var o = new core.List<core.List<core.double>>();
-  o.add(buildUnnamed1068());
-  o.add(buildUnnamed1068());
+  o.add(buildUnnamed778());
+  o.add(buildUnnamed778());
   return o;
 }
 
-checkUnnamed1069(core.List<core.List<core.double>> o) {
+checkUnnamed779(core.List<core.List<core.double>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1068(o[0]);
-  checkUnnamed1068(o[1]);
+  checkUnnamed778(o[0]);
+  checkUnnamed778(o[1]);
 }
 
 core.int buildCounterLine = 0;
@@ -223,7 +223,7 @@
   var o = new api.Line();
   buildCounterLine++;
   if (buildCounterLine < 3) {
-    o.coordinates = buildUnnamed1069();
+    o.coordinates = buildUnnamed779();
     o.type = "foo";
   }
   buildCounterLine--;
@@ -233,7 +233,7 @@
 checkLine(api.Line o) {
   buildCounterLine++;
   if (buildCounterLine < 3) {
-    checkUnnamed1069(o.coordinates);
+    checkUnnamed779(o.coordinates);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterLine--;
@@ -266,14 +266,14 @@
   buildCounterLineStyle--;
 }
 
-buildUnnamed1070() {
+buildUnnamed780() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1070(core.List<core.double> o) {
+checkUnnamed780(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));
@@ -284,7 +284,7 @@
   var o = new api.Point();
   buildCounterPoint++;
   if (buildCounterPoint < 3) {
-    o.coordinates = buildUnnamed1070();
+    o.coordinates = buildUnnamed780();
     o.type = "foo";
   }
   buildCounterPoint--;
@@ -294,7 +294,7 @@
 checkPoint(api.Point o) {
   buildCounterPoint++;
   if (buildCounterPoint < 3) {
-    checkUnnamed1070(o.coordinates);
+    checkUnnamed780(o.coordinates);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterPoint--;
@@ -321,43 +321,43 @@
   buildCounterPointStyle--;
 }
 
-buildUnnamed1071() {
+buildUnnamed781() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1071(core.List<core.double> o) {
+checkUnnamed781(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));
 }
 
-buildUnnamed1072() {
+buildUnnamed782() {
   var o = new core.List<core.List<core.double>>();
-  o.add(buildUnnamed1071());
-  o.add(buildUnnamed1071());
+  o.add(buildUnnamed781());
+  o.add(buildUnnamed781());
   return o;
 }
 
-checkUnnamed1072(core.List<core.List<core.double>> o) {
+checkUnnamed782(core.List<core.List<core.double>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1071(o[0]);
-  checkUnnamed1071(o[1]);
+  checkUnnamed781(o[0]);
+  checkUnnamed781(o[1]);
 }
 
-buildUnnamed1073() {
+buildUnnamed783() {
   var o = new core.List<core.List<core.List<core.double>>>();
-  o.add(buildUnnamed1072());
-  o.add(buildUnnamed1072());
+  o.add(buildUnnamed782());
+  o.add(buildUnnamed782());
   return o;
 }
 
-checkUnnamed1073(core.List<core.List<core.List<core.double>>> o) {
+checkUnnamed783(core.List<core.List<core.List<core.double>>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1072(o[0]);
-  checkUnnamed1072(o[1]);
+  checkUnnamed782(o[0]);
+  checkUnnamed782(o[1]);
 }
 
 core.int buildCounterPolygon = 0;
@@ -365,7 +365,7 @@
   var o = new api.Polygon();
   buildCounterPolygon++;
   if (buildCounterPolygon < 3) {
-    o.coordinates = buildUnnamed1073();
+    o.coordinates = buildUnnamed783();
     o.type = "foo";
   }
   buildCounterPolygon--;
@@ -375,7 +375,7 @@
 checkPolygon(api.Polygon o) {
   buildCounterPolygon++;
   if (buildCounterPolygon < 3) {
-    checkUnnamed1073(o.coordinates);
+    checkUnnamed783(o.coordinates);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterPolygon--;
@@ -414,43 +414,43 @@
   buildCounterPolygonStyle--;
 }
 
-buildUnnamed1074() {
+buildUnnamed784() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1074(core.List<core.String> o) {
+checkUnnamed784(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1075() {
+buildUnnamed785() {
   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'});
   return o;
 }
 
-checkUnnamed1075(core.List<core.Object> o) {
+checkUnnamed785(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')); 
 }
 
-buildUnnamed1076() {
+buildUnnamed786() {
   var o = new core.List<core.List<core.Object>>();
-  o.add(buildUnnamed1075());
-  o.add(buildUnnamed1075());
+  o.add(buildUnnamed785());
+  o.add(buildUnnamed785());
   return o;
 }
 
-checkUnnamed1076(core.List<core.List<core.Object>> o) {
+checkUnnamed786(core.List<core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1075(o[0]);
-  checkUnnamed1075(o[1]);
+  checkUnnamed785(o[0]);
+  checkUnnamed785(o[1]);
 }
 
 core.int buildCounterSqlresponse = 0;
@@ -458,9 +458,9 @@
   var o = new api.Sqlresponse();
   buildCounterSqlresponse++;
   if (buildCounterSqlresponse < 3) {
-    o.columns = buildUnnamed1074();
+    o.columns = buildUnnamed784();
     o.kind = "foo";
-    o.rows = buildUnnamed1076();
+    o.rows = buildUnnamed786();
   }
   buildCounterSqlresponse--;
   return o;
@@ -469,21 +469,21 @@
 checkSqlresponse(api.Sqlresponse o) {
   buildCounterSqlresponse++;
   if (buildCounterSqlresponse < 3) {
-    checkUnnamed1074(o.columns);
+    checkUnnamed784(o.columns);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1076(o.rows);
+    checkUnnamed786(o.rows);
   }
   buildCounterSqlresponse--;
 }
 
-buildUnnamed1077() {
+buildUnnamed787() {
   var o = new core.List<api.Bucket>();
   o.add(buildBucket());
   o.add(buildBucket());
   return o;
 }
 
-checkUnnamed1077(core.List<api.Bucket> o) {
+checkUnnamed787(core.List<api.Bucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucket(o[0]);
   checkBucket(o[1]);
@@ -510,14 +510,14 @@
   buildCounterStyleFunctionGradientColors--;
 }
 
-buildUnnamed1078() {
+buildUnnamed788() {
   var o = new core.List<api.StyleFunctionGradientColors>();
   o.add(buildStyleFunctionGradientColors());
   o.add(buildStyleFunctionGradientColors());
   return o;
 }
 
-checkUnnamed1078(core.List<api.StyleFunctionGradientColors> o) {
+checkUnnamed788(core.List<api.StyleFunctionGradientColors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStyleFunctionGradientColors(o[0]);
   checkStyleFunctionGradientColors(o[1]);
@@ -528,7 +528,7 @@
   var o = new api.StyleFunctionGradient();
   buildCounterStyleFunctionGradient++;
   if (buildCounterStyleFunctionGradient < 3) {
-    o.colors = buildUnnamed1078();
+    o.colors = buildUnnamed788();
     o.max = 42.0;
     o.min = 42.0;
   }
@@ -539,7 +539,7 @@
 checkStyleFunctionGradient(api.StyleFunctionGradient o) {
   buildCounterStyleFunctionGradient++;
   if (buildCounterStyleFunctionGradient < 3) {
-    checkUnnamed1078(o.colors);
+    checkUnnamed788(o.colors);
     unittest.expect(o.max, unittest.equals(42.0));
     unittest.expect(o.min, unittest.equals(42.0));
   }
@@ -551,7 +551,7 @@
   var o = new api.StyleFunction();
   buildCounterStyleFunction++;
   if (buildCounterStyleFunction < 3) {
-    o.buckets = buildUnnamed1077();
+    o.buckets = buildUnnamed787();
     o.columnName = "foo";
     o.gradient = buildStyleFunctionGradient();
     o.kind = "foo";
@@ -563,7 +563,7 @@
 checkStyleFunction(api.StyleFunction o) {
   buildCounterStyleFunction++;
   if (buildCounterStyleFunction < 3) {
-    checkUnnamed1077(o.buckets);
+    checkUnnamed787(o.buckets);
     unittest.expect(o.columnName, unittest.equals('foo'));
     checkStyleFunctionGradient(o.gradient);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -602,14 +602,14 @@
   buildCounterStyleSetting--;
 }
 
-buildUnnamed1079() {
+buildUnnamed789() {
   var o = new core.List<api.StyleSetting>();
   o.add(buildStyleSetting());
   o.add(buildStyleSetting());
   return o;
 }
 
-checkUnnamed1079(core.List<api.StyleSetting> o) {
+checkUnnamed789(core.List<api.StyleSetting> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStyleSetting(o[0]);
   checkStyleSetting(o[1]);
@@ -620,7 +620,7 @@
   var o = new api.StyleSettingList();
   buildCounterStyleSettingList++;
   if (buildCounterStyleSettingList < 3) {
-    o.items = buildUnnamed1079();
+    o.items = buildUnnamed789();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -632,7 +632,7 @@
 checkStyleSettingList(api.StyleSettingList o) {
   buildCounterStyleSettingList++;
   if (buildCounterStyleSettingList < 3) {
-    checkUnnamed1079(o.items);
+    checkUnnamed789(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -640,27 +640,27 @@
   buildCounterStyleSettingList--;
 }
 
-buildUnnamed1080() {
+buildUnnamed790() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1080(core.List<core.String> o) {
+checkUnnamed790(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1081() {
+buildUnnamed791() {
   var o = new core.List<api.Column>();
   o.add(buildColumn());
   o.add(buildColumn());
   return o;
 }
 
-checkUnnamed1081(core.List<api.Column> o) {
+checkUnnamed791(core.List<api.Column> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColumn(o[0]);
   checkColumn(o[1]);
@@ -673,8 +673,8 @@
   if (buildCounterTable < 3) {
     o.attribution = "foo";
     o.attributionLink = "foo";
-    o.baseTableIds = buildUnnamed1080();
-    o.columns = buildUnnamed1081();
+    o.baseTableIds = buildUnnamed790();
+    o.columns = buildUnnamed791();
     o.description = "foo";
     o.isExportable = true;
     o.kind = "foo";
@@ -691,8 +691,8 @@
   if (buildCounterTable < 3) {
     unittest.expect(o.attribution, unittest.equals('foo'));
     unittest.expect(o.attributionLink, unittest.equals('foo'));
-    checkUnnamed1080(o.baseTableIds);
-    checkUnnamed1081(o.columns);
+    checkUnnamed790(o.baseTableIds);
+    checkUnnamed791(o.columns);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.isExportable, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -703,14 +703,14 @@
   buildCounterTable--;
 }
 
-buildUnnamed1082() {
+buildUnnamed792() {
   var o = new core.List<api.Table>();
   o.add(buildTable());
   o.add(buildTable());
   return o;
 }
 
-checkUnnamed1082(core.List<api.Table> o) {
+checkUnnamed792(core.List<api.Table> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTable(o[0]);
   checkTable(o[1]);
@@ -721,7 +721,7 @@
   var o = new api.TableList();
   buildCounterTableList++;
   if (buildCounterTableList < 3) {
-    o.items = buildUnnamed1082();
+    o.items = buildUnnamed792();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -732,7 +732,7 @@
 checkTableList(api.TableList o) {
   buildCounterTableList++;
   if (buildCounterTableList < 3) {
-    checkUnnamed1082(o.items);
+    checkUnnamed792(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -766,14 +766,14 @@
   buildCounterTask--;
 }
 
-buildUnnamed1083() {
+buildUnnamed793() {
   var o = new core.List<api.Task>();
   o.add(buildTask());
   o.add(buildTask());
   return o;
 }
 
-checkUnnamed1083(core.List<api.Task> o) {
+checkUnnamed793(core.List<api.Task> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTask(o[0]);
   checkTask(o[1]);
@@ -784,7 +784,7 @@
   var o = new api.TaskList();
   buildCounterTaskList++;
   if (buildCounterTaskList < 3) {
-    o.items = buildUnnamed1083();
+    o.items = buildUnnamed793();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -796,7 +796,7 @@
 checkTaskList(api.TaskList o) {
   buildCounterTaskList++;
   if (buildCounterTaskList < 3) {
-    checkUnnamed1083(o.items);
+    checkUnnamed793(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -804,14 +804,14 @@
   buildCounterTaskList--;
 }
 
-buildUnnamed1084() {
+buildUnnamed794() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1084(core.List<core.String> o) {
+checkUnnamed794(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -822,7 +822,7 @@
   var o = new api.Template();
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
-    o.automaticColumnNames = buildUnnamed1084();
+    o.automaticColumnNames = buildUnnamed794();
     o.body = "foo";
     o.kind = "foo";
     o.name = "foo";
@@ -836,7 +836,7 @@
 checkTemplate(api.Template o) {
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
-    checkUnnamed1084(o.automaticColumnNames);
+    checkUnnamed794(o.automaticColumnNames);
     unittest.expect(o.body, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -846,14 +846,14 @@
   buildCounterTemplate--;
 }
 
-buildUnnamed1085() {
+buildUnnamed795() {
   var o = new core.List<api.Template>();
   o.add(buildTemplate());
   o.add(buildTemplate());
   return o;
 }
 
-checkUnnamed1085(core.List<api.Template> o) {
+checkUnnamed795(core.List<api.Template> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTemplate(o[0]);
   checkTemplate(o[1]);
@@ -864,7 +864,7 @@
   var o = new api.TemplateList();
   buildCounterTemplateList++;
   if (buildCounterTemplateList < 3) {
-    o.items = buildUnnamed1085();
+    o.items = buildUnnamed795();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -876,7 +876,7 @@
 checkTemplateList(api.TemplateList o) {
   buildCounterTemplateList++;
   if (buildCounterTemplateList < 3) {
-    checkUnnamed1085(o.items);
+    checkUnnamed795(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
diff --git a/generated/googleapis/test/games/v1_test.dart b/generated/googleapis/test/games/v1_test.dart
index f5bb3bb..cd87f6f 100644
--- a/generated/googleapis/test/games/v1_test.dart
+++ b/generated/googleapis/test/games/v1_test.dart
@@ -59,14 +59,14 @@
   buildCounterAchievementDefinition--;
 }
 
-buildUnnamed20() {
+buildUnnamed796() {
   var o = new core.List<api.AchievementDefinition>();
   o.add(buildAchievementDefinition());
   o.add(buildAchievementDefinition());
   return o;
 }
 
-checkUnnamed20(core.List<api.AchievementDefinition> o) {
+checkUnnamed796(core.List<api.AchievementDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAchievementDefinition(o[0]);
   checkAchievementDefinition(o[1]);
@@ -77,7 +77,7 @@
   var o = new api.AchievementDefinitionsListResponse();
   buildCounterAchievementDefinitionsListResponse++;
   if (buildCounterAchievementDefinitionsListResponse < 3) {
-    o.items = buildUnnamed20();
+    o.items = buildUnnamed796();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -88,7 +88,7 @@
 checkAchievementDefinitionsListResponse(api.AchievementDefinitionsListResponse o) {
   buildCounterAchievementDefinitionsListResponse++;
   if (buildCounterAchievementDefinitionsListResponse < 3) {
-    checkUnnamed20(o.items);
+    checkUnnamed796(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -183,14 +183,14 @@
   buildCounterAchievementUnlockResponse--;
 }
 
-buildUnnamed21() {
+buildUnnamed797() {
   var o = new core.List<api.AchievementUpdateRequest>();
   o.add(buildAchievementUpdateRequest());
   o.add(buildAchievementUpdateRequest());
   return o;
 }
 
-checkUnnamed21(core.List<api.AchievementUpdateRequest> o) {
+checkUnnamed797(core.List<api.AchievementUpdateRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAchievementUpdateRequest(o[0]);
   checkAchievementUpdateRequest(o[1]);
@@ -202,7 +202,7 @@
   buildCounterAchievementUpdateMultipleRequest++;
   if (buildCounterAchievementUpdateMultipleRequest < 3) {
     o.kind = "foo";
-    o.updates = buildUnnamed21();
+    o.updates = buildUnnamed797();
   }
   buildCounterAchievementUpdateMultipleRequest--;
   return o;
@@ -212,19 +212,19 @@
   buildCounterAchievementUpdateMultipleRequest++;
   if (buildCounterAchievementUpdateMultipleRequest < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed21(o.updates);
+    checkUnnamed797(o.updates);
   }
   buildCounterAchievementUpdateMultipleRequest--;
 }
 
-buildUnnamed22() {
+buildUnnamed798() {
   var o = new core.List<api.AchievementUpdateResponse>();
   o.add(buildAchievementUpdateResponse());
   o.add(buildAchievementUpdateResponse());
   return o;
 }
 
-checkUnnamed22(core.List<api.AchievementUpdateResponse> o) {
+checkUnnamed798(core.List<api.AchievementUpdateResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAchievementUpdateResponse(o[0]);
   checkAchievementUpdateResponse(o[1]);
@@ -236,7 +236,7 @@
   buildCounterAchievementUpdateMultipleResponse++;
   if (buildCounterAchievementUpdateMultipleResponse < 3) {
     o.kind = "foo";
-    o.updatedAchievements = buildUnnamed22();
+    o.updatedAchievements = buildUnnamed798();
   }
   buildCounterAchievementUpdateMultipleResponse--;
   return o;
@@ -246,7 +246,7 @@
   buildCounterAchievementUpdateMultipleResponse++;
   if (buildCounterAchievementUpdateMultipleResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed22(o.updatedAchievements);
+    checkUnnamed798(o.updatedAchievements);
   }
   buildCounterAchievementUpdateMultipleResponse--;
 }
@@ -357,40 +357,40 @@
   buildCounterAnonymousPlayer--;
 }
 
-buildUnnamed23() {
+buildUnnamed799() {
   var o = new core.List<api.ImageAsset>();
   o.add(buildImageAsset());
   o.add(buildImageAsset());
   return o;
 }
 
-checkUnnamed23(core.List<api.ImageAsset> o) {
+checkUnnamed799(core.List<api.ImageAsset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImageAsset(o[0]);
   checkImageAsset(o[1]);
 }
 
-buildUnnamed24() {
+buildUnnamed800() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed24(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'));
 }
 
-buildUnnamed25() {
+buildUnnamed801() {
   var o = new core.List<api.Instance>();
   o.add(buildInstance());
   o.add(buildInstance());
   return o;
 }
 
-checkUnnamed25(core.List<api.Instance> o) {
+checkUnnamed801(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstance(o[0]);
   checkInstance(o[1]);
@@ -402,13 +402,13 @@
   buildCounterApplication++;
   if (buildCounterApplication < 3) {
     o.achievementCount = 42;
-    o.assets = buildUnnamed23();
+    o.assets = buildUnnamed799();
     o.author = "foo";
     o.category = buildApplicationCategory();
     o.description = "foo";
-    o.enabledFeatures = buildUnnamed24();
+    o.enabledFeatures = buildUnnamed800();
     o.id = "foo";
-    o.instances = buildUnnamed25();
+    o.instances = buildUnnamed801();
     o.kind = "foo";
     o.lastUpdatedTimestamp = "foo";
     o.leaderboardCount = 42;
@@ -423,13 +423,13 @@
   buildCounterApplication++;
   if (buildCounterApplication < 3) {
     unittest.expect(o.achievementCount, unittest.equals(42));
-    checkUnnamed23(o.assets);
+    checkUnnamed799(o.assets);
     unittest.expect(o.author, unittest.equals('foo'));
     checkApplicationCategory(o.category);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed24(o.enabledFeatures);
+    checkUnnamed800(o.enabledFeatures);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed25(o.instances);
+    checkUnnamed801(o.instances);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastUpdatedTimestamp, unittest.equals('foo'));
     unittest.expect(o.leaderboardCount, unittest.equals(42));
@@ -485,14 +485,14 @@
   buildCounterCategory--;
 }
 
-buildUnnamed26() {
+buildUnnamed802() {
   var o = new core.List<api.Category>();
   o.add(buildCategory());
   o.add(buildCategory());
   return o;
 }
 
-checkUnnamed26(core.List<api.Category> o) {
+checkUnnamed802(core.List<api.Category> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCategory(o[0]);
   checkCategory(o[1]);
@@ -503,7 +503,7 @@
   var o = new api.CategoryListResponse();
   buildCounterCategoryListResponse++;
   if (buildCounterCategoryListResponse < 3) {
-    o.items = buildUnnamed26();
+    o.items = buildUnnamed802();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -514,7 +514,7 @@
 checkCategoryListResponse(api.CategoryListResponse o) {
   buildCounterCategoryListResponse++;
   if (buildCounterCategoryListResponse < 3) {
-    checkUnnamed26(o.items);
+    checkUnnamed802(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -565,14 +565,14 @@
   buildCounterEventChild--;
 }
 
-buildUnnamed27() {
+buildUnnamed803() {
   var o = new core.List<api.EventChild>();
   o.add(buildEventChild());
   o.add(buildEventChild());
   return o;
 }
 
-checkUnnamed27(core.List<api.EventChild> o) {
+checkUnnamed803(core.List<api.EventChild> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventChild(o[0]);
   checkEventChild(o[1]);
@@ -583,7 +583,7 @@
   var o = new api.EventDefinition();
   buildCounterEventDefinition++;
   if (buildCounterEventDefinition < 3) {
-    o.childEvents = buildUnnamed27();
+    o.childEvents = buildUnnamed803();
     o.description = "foo";
     o.displayName = "foo";
     o.id = "foo";
@@ -599,7 +599,7 @@
 checkEventDefinition(api.EventDefinition o) {
   buildCounterEventDefinition++;
   if (buildCounterEventDefinition < 3) {
-    checkUnnamed27(o.childEvents);
+    checkUnnamed803(o.childEvents);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -611,14 +611,14 @@
   buildCounterEventDefinition--;
 }
 
-buildUnnamed28() {
+buildUnnamed804() {
   var o = new core.List<api.EventDefinition>();
   o.add(buildEventDefinition());
   o.add(buildEventDefinition());
   return o;
 }
 
-checkUnnamed28(core.List<api.EventDefinition> o) {
+checkUnnamed804(core.List<api.EventDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventDefinition(o[0]);
   checkEventDefinition(o[1]);
@@ -629,7 +629,7 @@
   var o = new api.EventDefinitionListResponse();
   buildCounterEventDefinitionListResponse++;
   if (buildCounterEventDefinitionListResponse < 3) {
-    o.items = buildUnnamed28();
+    o.items = buildUnnamed804();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -640,7 +640,7 @@
 checkEventDefinitionListResponse(api.EventDefinitionListResponse o) {
   buildCounterEventDefinitionListResponse++;
   if (buildCounterEventDefinitionListResponse < 3) {
-    checkUnnamed28(o.items);
+    checkUnnamed804(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -670,14 +670,14 @@
   buildCounterEventPeriodRange--;
 }
 
-buildUnnamed29() {
+buildUnnamed805() {
   var o = new core.List<api.EventUpdateRequest>();
   o.add(buildEventUpdateRequest());
   o.add(buildEventUpdateRequest());
   return o;
 }
 
-checkUnnamed29(core.List<api.EventUpdateRequest> o) {
+checkUnnamed805(core.List<api.EventUpdateRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventUpdateRequest(o[0]);
   checkEventUpdateRequest(o[1]);
@@ -690,7 +690,7 @@
   if (buildCounterEventPeriodUpdate < 3) {
     o.kind = "foo";
     o.timePeriod = buildEventPeriodRange();
-    o.updates = buildUnnamed29();
+    o.updates = buildUnnamed805();
   }
   buildCounterEventPeriodUpdate--;
   return o;
@@ -701,7 +701,7 @@
   if (buildCounterEventPeriodUpdate < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     checkEventPeriodRange(o.timePeriod);
-    checkUnnamed29(o.updates);
+    checkUnnamed805(o.updates);
   }
   buildCounterEventPeriodUpdate--;
 }
@@ -729,14 +729,14 @@
   buildCounterEventRecordFailure--;
 }
 
-buildUnnamed30() {
+buildUnnamed806() {
   var o = new core.List<api.EventPeriodUpdate>();
   o.add(buildEventPeriodUpdate());
   o.add(buildEventPeriodUpdate());
   return o;
 }
 
-checkUnnamed30(core.List<api.EventPeriodUpdate> o) {
+checkUnnamed806(core.List<api.EventPeriodUpdate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventPeriodUpdate(o[0]);
   checkEventPeriodUpdate(o[1]);
@@ -750,7 +750,7 @@
     o.currentTimeMillis = "foo";
     o.kind = "foo";
     o.requestId = "foo";
-    o.timePeriods = buildUnnamed30();
+    o.timePeriods = buildUnnamed806();
   }
   buildCounterEventRecordRequest--;
   return o;
@@ -762,7 +762,7 @@
     unittest.expect(o.currentTimeMillis, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.requestId, unittest.equals('foo'));
-    checkUnnamed30(o.timePeriods);
+    checkUnnamed806(o.timePeriods);
   }
   buildCounterEventRecordRequest--;
 }
@@ -790,40 +790,40 @@
   buildCounterEventUpdateRequest--;
 }
 
-buildUnnamed31() {
+buildUnnamed807() {
   var o = new core.List<api.EventBatchRecordFailure>();
   o.add(buildEventBatchRecordFailure());
   o.add(buildEventBatchRecordFailure());
   return o;
 }
 
-checkUnnamed31(core.List<api.EventBatchRecordFailure> o) {
+checkUnnamed807(core.List<api.EventBatchRecordFailure> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventBatchRecordFailure(o[0]);
   checkEventBatchRecordFailure(o[1]);
 }
 
-buildUnnamed32() {
+buildUnnamed808() {
   var o = new core.List<api.EventRecordFailure>();
   o.add(buildEventRecordFailure());
   o.add(buildEventRecordFailure());
   return o;
 }
 
-checkUnnamed32(core.List<api.EventRecordFailure> o) {
+checkUnnamed808(core.List<api.EventRecordFailure> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventRecordFailure(o[0]);
   checkEventRecordFailure(o[1]);
 }
 
-buildUnnamed33() {
+buildUnnamed809() {
   var o = new core.List<api.PlayerEvent>();
   o.add(buildPlayerEvent());
   o.add(buildPlayerEvent());
   return o;
 }
 
-checkUnnamed33(core.List<api.PlayerEvent> o) {
+checkUnnamed809(core.List<api.PlayerEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerEvent(o[0]);
   checkPlayerEvent(o[1]);
@@ -834,10 +834,10 @@
   var o = new api.EventUpdateResponse();
   buildCounterEventUpdateResponse++;
   if (buildCounterEventUpdateResponse < 3) {
-    o.batchFailures = buildUnnamed31();
-    o.eventFailures = buildUnnamed32();
+    o.batchFailures = buildUnnamed807();
+    o.eventFailures = buildUnnamed808();
     o.kind = "foo";
-    o.playerEvents = buildUnnamed33();
+    o.playerEvents = buildUnnamed809();
   }
   buildCounterEventUpdateResponse--;
   return o;
@@ -846,10 +846,10 @@
 checkEventUpdateResponse(api.EventUpdateResponse o) {
   buildCounterEventUpdateResponse++;
   if (buildCounterEventUpdateResponse < 3) {
-    checkUnnamed31(o.batchFailures);
-    checkUnnamed32(o.eventFailures);
+    checkUnnamed807(o.batchFailures);
+    checkUnnamed808(o.eventFailures);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed33(o.playerEvents);
+    checkUnnamed809(o.playerEvents);
   }
   buildCounterEventUpdateResponse--;
 }
@@ -1103,14 +1103,14 @@
   buildCounterLeaderboardEntry--;
 }
 
-buildUnnamed34() {
+buildUnnamed810() {
   var o = new core.List<api.Leaderboard>();
   o.add(buildLeaderboard());
   o.add(buildLeaderboard());
   return o;
 }
 
-checkUnnamed34(core.List<api.Leaderboard> o) {
+checkUnnamed810(core.List<api.Leaderboard> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLeaderboard(o[0]);
   checkLeaderboard(o[1]);
@@ -1121,7 +1121,7 @@
   var o = new api.LeaderboardListResponse();
   buildCounterLeaderboardListResponse++;
   if (buildCounterLeaderboardListResponse < 3) {
-    o.items = buildUnnamed34();
+    o.items = buildUnnamed810();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1132,7 +1132,7 @@
 checkLeaderboardListResponse(api.LeaderboardListResponse o) {
   buildCounterLeaderboardListResponse++;
   if (buildCounterLeaderboardListResponse < 3) {
-    checkUnnamed34(o.items);
+    checkUnnamed810(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1166,14 +1166,14 @@
   buildCounterLeaderboardScoreRank--;
 }
 
-buildUnnamed35() {
+buildUnnamed811() {
   var o = new core.List<api.LeaderboardEntry>();
   o.add(buildLeaderboardEntry());
   o.add(buildLeaderboardEntry());
   return o;
 }
 
-checkUnnamed35(core.List<api.LeaderboardEntry> o) {
+checkUnnamed811(core.List<api.LeaderboardEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLeaderboardEntry(o[0]);
   checkLeaderboardEntry(o[1]);
@@ -1184,7 +1184,7 @@
   var o = new api.LeaderboardScores();
   buildCounterLeaderboardScores++;
   if (buildCounterLeaderboardScores < 3) {
-    o.items = buildUnnamed35();
+    o.items = buildUnnamed811();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.numScores = "foo";
@@ -1198,7 +1198,7 @@
 checkLeaderboardScores(api.LeaderboardScores o) {
   buildCounterLeaderboardScores++;
   if (buildCounterLeaderboardScores < 3) {
-    checkUnnamed35(o.items);
+    checkUnnamed811(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.numScores, unittest.equals('foo'));
@@ -1208,14 +1208,14 @@
   buildCounterLeaderboardScores--;
 }
 
-buildUnnamed36() {
+buildUnnamed812() {
   var o = new core.List<api.PlayerLevel>();
   o.add(buildPlayerLevel());
   o.add(buildPlayerLevel());
   return o;
 }
 
-checkUnnamed36(core.List<api.PlayerLevel> o) {
+checkUnnamed812(core.List<api.PlayerLevel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerLevel(o[0]);
   checkPlayerLevel(o[1]);
@@ -1228,7 +1228,7 @@
   if (buildCounterMetagameConfig < 3) {
     o.currentVersion = 42;
     o.kind = "foo";
-    o.playerLevels = buildUnnamed36();
+    o.playerLevels = buildUnnamed812();
   }
   buildCounterMetagameConfig--;
   return o;
@@ -1239,7 +1239,7 @@
   if (buildCounterMetagameConfig < 3) {
     unittest.expect(o.currentVersion, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed36(o.playerLevels);
+    checkUnnamed812(o.playerLevels);
   }
   buildCounterMetagameConfig--;
 }
@@ -1468,14 +1468,14 @@
   buildCounterPlayerAchievement--;
 }
 
-buildUnnamed37() {
+buildUnnamed813() {
   var o = new core.List<api.PlayerAchievement>();
   o.add(buildPlayerAchievement());
   o.add(buildPlayerAchievement());
   return o;
 }
 
-checkUnnamed37(core.List<api.PlayerAchievement> o) {
+checkUnnamed813(core.List<api.PlayerAchievement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerAchievement(o[0]);
   checkPlayerAchievement(o[1]);
@@ -1486,7 +1486,7 @@
   var o = new api.PlayerAchievementListResponse();
   buildCounterPlayerAchievementListResponse++;
   if (buildCounterPlayerAchievementListResponse < 3) {
-    o.items = buildUnnamed37();
+    o.items = buildUnnamed813();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1497,7 +1497,7 @@
 checkPlayerAchievementListResponse(api.PlayerAchievementListResponse o) {
   buildCounterPlayerAchievementListResponse++;
   if (buildCounterPlayerAchievementListResponse < 3) {
-    checkUnnamed37(o.items);
+    checkUnnamed813(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1531,14 +1531,14 @@
   buildCounterPlayerEvent--;
 }
 
-buildUnnamed38() {
+buildUnnamed814() {
   var o = new core.List<api.PlayerEvent>();
   o.add(buildPlayerEvent());
   o.add(buildPlayerEvent());
   return o;
 }
 
-checkUnnamed38(core.List<api.PlayerEvent> o) {
+checkUnnamed814(core.List<api.PlayerEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerEvent(o[0]);
   checkPlayerEvent(o[1]);
@@ -1549,7 +1549,7 @@
   var o = new api.PlayerEventListResponse();
   buildCounterPlayerEventListResponse++;
   if (buildCounterPlayerEventListResponse < 3) {
-    o.items = buildUnnamed38();
+    o.items = buildUnnamed814();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1560,7 +1560,7 @@
 checkPlayerEventListResponse(api.PlayerEventListResponse o) {
   buildCounterPlayerEventListResponse++;
   if (buildCounterPlayerEventListResponse < 3) {
-    checkUnnamed38(o.items);
+    checkUnnamed814(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1629,14 +1629,14 @@
   buildCounterPlayerLeaderboardScore--;
 }
 
-buildUnnamed39() {
+buildUnnamed815() {
   var o = new core.List<api.PlayerLeaderboardScore>();
   o.add(buildPlayerLeaderboardScore());
   o.add(buildPlayerLeaderboardScore());
   return o;
 }
 
-checkUnnamed39(core.List<api.PlayerLeaderboardScore> o) {
+checkUnnamed815(core.List<api.PlayerLeaderboardScore> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerLeaderboardScore(o[0]);
   checkPlayerLeaderboardScore(o[1]);
@@ -1647,7 +1647,7 @@
   var o = new api.PlayerLeaderboardScoreListResponse();
   buildCounterPlayerLeaderboardScoreListResponse++;
   if (buildCounterPlayerLeaderboardScoreListResponse < 3) {
-    o.items = buildUnnamed39();
+    o.items = buildUnnamed815();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.player = buildPlayer();
@@ -1659,7 +1659,7 @@
 checkPlayerLeaderboardScoreListResponse(api.PlayerLeaderboardScoreListResponse o) {
   buildCounterPlayerLeaderboardScoreListResponse++;
   if (buildCounterPlayerLeaderboardScoreListResponse < 3) {
-    checkUnnamed39(o.items);
+    checkUnnamed815(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPlayer(o.player);
@@ -1692,14 +1692,14 @@
   buildCounterPlayerLevel--;
 }
 
-buildUnnamed40() {
+buildUnnamed816() {
   var o = new core.List<api.Player>();
   o.add(buildPlayer());
   o.add(buildPlayer());
   return o;
 }
 
-checkUnnamed40(core.List<api.Player> o) {
+checkUnnamed816(core.List<api.Player> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayer(o[0]);
   checkPlayer(o[1]);
@@ -1710,7 +1710,7 @@
   var o = new api.PlayerListResponse();
   buildCounterPlayerListResponse++;
   if (buildCounterPlayerListResponse < 3) {
-    o.items = buildUnnamed40();
+    o.items = buildUnnamed816();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1721,7 +1721,7 @@
 checkPlayerListResponse(api.PlayerListResponse o) {
   buildCounterPlayerListResponse++;
   if (buildCounterPlayerListResponse < 3) {
-    checkUnnamed40(o.items);
+    checkUnnamed816(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1755,14 +1755,14 @@
   buildCounterPlayerScore--;
 }
 
-buildUnnamed41() {
+buildUnnamed817() {
   var o = new core.List<api.PlayerScoreResponse>();
   o.add(buildPlayerScoreResponse());
   o.add(buildPlayerScoreResponse());
   return o;
 }
 
-checkUnnamed41(core.List<api.PlayerScoreResponse> o) {
+checkUnnamed817(core.List<api.PlayerScoreResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerScoreResponse(o[0]);
   checkPlayerScoreResponse(o[1]);
@@ -1774,7 +1774,7 @@
   buildCounterPlayerScoreListResponse++;
   if (buildCounterPlayerScoreListResponse < 3) {
     o.kind = "foo";
-    o.submittedScores = buildUnnamed41();
+    o.submittedScores = buildUnnamed817();
   }
   buildCounterPlayerScoreListResponse--;
   return o;
@@ -1784,32 +1784,32 @@
   buildCounterPlayerScoreListResponse++;
   if (buildCounterPlayerScoreListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed41(o.submittedScores);
+    checkUnnamed817(o.submittedScores);
   }
   buildCounterPlayerScoreListResponse--;
 }
 
-buildUnnamed42() {
+buildUnnamed818() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed42(core.List<core.String> o) {
+checkUnnamed818(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed43() {
+buildUnnamed819() {
   var o = new core.List<api.PlayerScore>();
   o.add(buildPlayerScore());
   o.add(buildPlayerScore());
   return o;
 }
 
-checkUnnamed43(core.List<api.PlayerScore> o) {
+checkUnnamed819(core.List<api.PlayerScore> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerScore(o[0]);
   checkPlayerScore(o[1]);
@@ -1820,12 +1820,12 @@
   var o = new api.PlayerScoreResponse();
   buildCounterPlayerScoreResponse++;
   if (buildCounterPlayerScoreResponse < 3) {
-    o.beatenScoreTimeSpans = buildUnnamed42();
+    o.beatenScoreTimeSpans = buildUnnamed818();
     o.formattedScore = "foo";
     o.kind = "foo";
     o.leaderboardId = "foo";
     o.scoreTag = "foo";
-    o.unbeatenScores = buildUnnamed43();
+    o.unbeatenScores = buildUnnamed819();
   }
   buildCounterPlayerScoreResponse--;
   return o;
@@ -1834,24 +1834,24 @@
 checkPlayerScoreResponse(api.PlayerScoreResponse o) {
   buildCounterPlayerScoreResponse++;
   if (buildCounterPlayerScoreResponse < 3) {
-    checkUnnamed42(o.beatenScoreTimeSpans);
+    checkUnnamed818(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'));
-    checkUnnamed43(o.unbeatenScores);
+    checkUnnamed819(o.unbeatenScores);
   }
   buildCounterPlayerScoreResponse--;
 }
 
-buildUnnamed44() {
+buildUnnamed820() {
   var o = new core.List<api.ScoreSubmission>();
   o.add(buildScoreSubmission());
   o.add(buildScoreSubmission());
   return o;
 }
 
-checkUnnamed44(core.List<api.ScoreSubmission> o) {
+checkUnnamed820(core.List<api.ScoreSubmission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkScoreSubmission(o[0]);
   checkScoreSubmission(o[1]);
@@ -1863,7 +1863,7 @@
   buildCounterPlayerScoreSubmissionList++;
   if (buildCounterPlayerScoreSubmissionList < 3) {
     o.kind = "foo";
-    o.scores = buildUnnamed44();
+    o.scores = buildUnnamed820();
   }
   buildCounterPlayerScoreSubmissionList--;
   return o;
@@ -1873,7 +1873,7 @@
   buildCounterPlayerScoreSubmissionList++;
   if (buildCounterPlayerScoreSubmissionList < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed44(o.scores);
+    checkUnnamed820(o.scores);
   }
   buildCounterPlayerScoreSubmissionList--;
 }
@@ -1945,14 +1945,14 @@
   buildCounterPushTokenId--;
 }
 
-buildUnnamed45() {
+buildUnnamed821() {
   var o = new core.List<api.QuestMilestone>();
   o.add(buildQuestMilestone());
   o.add(buildQuestMilestone());
   return o;
 }
 
-checkUnnamed45(core.List<api.QuestMilestone> o) {
+checkUnnamed821(core.List<api.QuestMilestone> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuestMilestone(o[0]);
   checkQuestMilestone(o[1]);
@@ -1974,7 +1974,7 @@
     o.isDefaultIconUrl = true;
     o.kind = "foo";
     o.lastUpdatedTimestampMillis = "foo";
-    o.milestones = buildUnnamed45();
+    o.milestones = buildUnnamed821();
     o.name = "foo";
     o.notifyTimestampMillis = "foo";
     o.startTimestampMillis = "foo";
@@ -1998,7 +1998,7 @@
     unittest.expect(o.isDefaultIconUrl, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastUpdatedTimestampMillis, unittest.equals('foo'));
-    checkUnnamed45(o.milestones);
+    checkUnnamed821(o.milestones);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notifyTimestampMillis, unittest.equals('foo'));
     unittest.expect(o.startTimestampMillis, unittest.equals('foo'));
@@ -2057,14 +2057,14 @@
   buildCounterQuestCriterion--;
 }
 
-buildUnnamed46() {
+buildUnnamed822() {
   var o = new core.List<api.Quest>();
   o.add(buildQuest());
   o.add(buildQuest());
   return o;
 }
 
-checkUnnamed46(core.List<api.Quest> o) {
+checkUnnamed822(core.List<api.Quest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuest(o[0]);
   checkQuest(o[1]);
@@ -2075,7 +2075,7 @@
   var o = new api.QuestListResponse();
   buildCounterQuestListResponse++;
   if (buildCounterQuestListResponse < 3) {
-    o.items = buildUnnamed46();
+    o.items = buildUnnamed822();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -2086,21 +2086,21 @@
 checkQuestListResponse(api.QuestListResponse o) {
   buildCounterQuestListResponse++;
   if (buildCounterQuestListResponse < 3) {
-    checkUnnamed46(o.items);
+    checkUnnamed822(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterQuestListResponse--;
 }
 
-buildUnnamed47() {
+buildUnnamed823() {
   var o = new core.List<api.QuestCriterion>();
   o.add(buildQuestCriterion());
   o.add(buildQuestCriterion());
   return o;
 }
 
-checkUnnamed47(core.List<api.QuestCriterion> o) {
+checkUnnamed823(core.List<api.QuestCriterion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuestCriterion(o[0]);
   checkQuestCriterion(o[1]);
@@ -2112,7 +2112,7 @@
   buildCounterQuestMilestone++;
   if (buildCounterQuestMilestone < 3) {
     o.completionRewardData = "foo";
-    o.criteria = buildUnnamed47();
+    o.criteria = buildUnnamed823();
     o.id = "foo";
     o.kind = "foo";
     o.state = "foo";
@@ -2125,7 +2125,7 @@
   buildCounterQuestMilestone++;
   if (buildCounterQuestMilestone < 3) {
     unittest.expect(o.completionRewardData, unittest.equals('foo'));
-    checkUnnamed47(o.criteria);
+    checkUnnamed823(o.criteria);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
@@ -2156,14 +2156,14 @@
   buildCounterRevisionCheckResponse--;
 }
 
-buildUnnamed48() {
+buildUnnamed824() {
   var o = new core.List<api.RoomParticipant>();
   o.add(buildRoomParticipant());
   o.add(buildRoomParticipant());
   return o;
 }
 
-checkUnnamed48(core.List<api.RoomParticipant> o) {
+checkUnnamed824(core.List<api.RoomParticipant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoomParticipant(o[0]);
   checkRoomParticipant(o[1]);
@@ -2182,7 +2182,7 @@
     o.inviterId = "foo";
     o.kind = "foo";
     o.lastUpdateDetails = buildRoomModification();
-    o.participants = buildUnnamed48();
+    o.participants = buildUnnamed824();
     o.roomId = "foo";
     o.roomStatusVersion = 42;
     o.status = "foo";
@@ -2203,7 +2203,7 @@
     unittest.expect(o.inviterId, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkRoomModification(o.lastUpdateDetails);
-    checkUnnamed48(o.participants);
+    checkUnnamed824(o.participants);
     unittest.expect(o.roomId, unittest.equals('foo'));
     unittest.expect(o.roomStatusVersion, unittest.equals(42));
     unittest.expect(o.status, unittest.equals('foo'));
@@ -2279,27 +2279,27 @@
   buildCounterRoomClientAddress--;
 }
 
-buildUnnamed49() {
+buildUnnamed825() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed49(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'));
 }
 
-buildUnnamed50() {
+buildUnnamed826() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed50(core.List<core.String> 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'));
@@ -2311,9 +2311,9 @@
   buildCounterRoomCreateRequest++;
   if (buildCounterRoomCreateRequest < 3) {
     o.autoMatchingCriteria = buildRoomAutoMatchingCriteria();
-    o.capabilities = buildUnnamed49();
+    o.capabilities = buildUnnamed825();
     o.clientAddress = buildRoomClientAddress();
-    o.invitedPlayerIds = buildUnnamed50();
+    o.invitedPlayerIds = buildUnnamed826();
     o.kind = "foo";
     o.networkDiagnostics = buildNetworkDiagnostics();
     o.requestId = "foo";
@@ -2327,9 +2327,9 @@
   buildCounterRoomCreateRequest++;
   if (buildCounterRoomCreateRequest < 3) {
     checkRoomAutoMatchingCriteria(o.autoMatchingCriteria);
-    checkUnnamed49(o.capabilities);
+    checkUnnamed825(o.capabilities);
     checkRoomClientAddress(o.clientAddress);
-    checkUnnamed50(o.invitedPlayerIds);
+    checkUnnamed826(o.invitedPlayerIds);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkNetworkDiagnostics(o.networkDiagnostics);
     unittest.expect(o.requestId, unittest.equals('foo'));
@@ -2338,14 +2338,14 @@
   buildCounterRoomCreateRequest--;
 }
 
-buildUnnamed51() {
+buildUnnamed827() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed51(core.List<core.String> 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'));
@@ -2356,7 +2356,7 @@
   var o = new api.RoomJoinRequest();
   buildCounterRoomJoinRequest++;
   if (buildCounterRoomJoinRequest < 3) {
-    o.capabilities = buildUnnamed51();
+    o.capabilities = buildUnnamed827();
     o.clientAddress = buildRoomClientAddress();
     o.kind = "foo";
     o.networkDiagnostics = buildNetworkDiagnostics();
@@ -2368,7 +2368,7 @@
 checkRoomJoinRequest(api.RoomJoinRequest o) {
   buildCounterRoomJoinRequest++;
   if (buildCounterRoomJoinRequest < 3) {
-    checkUnnamed51(o.capabilities);
+    checkUnnamed827(o.capabilities);
     checkRoomClientAddress(o.clientAddress);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkNetworkDiagnostics(o.networkDiagnostics);
@@ -2376,14 +2376,14 @@
   buildCounterRoomJoinRequest--;
 }
 
-buildUnnamed52() {
+buildUnnamed828() {
   var o = new core.List<api.PeerSessionDiagnostics>();
   o.add(buildPeerSessionDiagnostics());
   o.add(buildPeerSessionDiagnostics());
   return o;
 }
 
-checkUnnamed52(core.List<api.PeerSessionDiagnostics> o) {
+checkUnnamed828(core.List<api.PeerSessionDiagnostics> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPeerSessionDiagnostics(o[0]);
   checkPeerSessionDiagnostics(o[1]);
@@ -2400,7 +2400,7 @@
     o.kind = "foo";
     o.networkOperatorCode = "foo";
     o.networkOperatorName = "foo";
-    o.peerSession = buildUnnamed52();
+    o.peerSession = buildUnnamed828();
     o.socketsUsed = true;
   }
   buildCounterRoomLeaveDiagnostics--;
@@ -2416,7 +2416,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.networkOperatorCode, unittest.equals('foo'));
     unittest.expect(o.networkOperatorName, unittest.equals('foo'));
-    checkUnnamed52(o.peerSession);
+    checkUnnamed828(o.peerSession);
     unittest.expect(o.socketsUsed, unittest.isTrue);
   }
   buildCounterRoomLeaveDiagnostics--;
@@ -2445,14 +2445,14 @@
   buildCounterRoomLeaveRequest--;
 }
 
-buildUnnamed53() {
+buildUnnamed829() {
   var o = new core.List<api.Room>();
   o.add(buildRoom());
   o.add(buildRoom());
   return o;
 }
 
-checkUnnamed53(core.List<api.Room> o) {
+checkUnnamed829(core.List<api.Room> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoom(o[0]);
   checkRoom(o[1]);
@@ -2463,7 +2463,7 @@
   var o = new api.RoomList();
   buildCounterRoomList++;
   if (buildCounterRoomList < 3) {
-    o.items = buildUnnamed53();
+    o.items = buildUnnamed829();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -2474,7 +2474,7 @@
 checkRoomList(api.RoomList o) {
   buildCounterRoomList++;
   if (buildCounterRoomList < 3) {
-    checkUnnamed53(o.items);
+    checkUnnamed829(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -2535,14 +2535,14 @@
   buildCounterRoomP2PStatus--;
 }
 
-buildUnnamed54() {
+buildUnnamed830() {
   var o = new core.List<api.RoomP2PStatus>();
   o.add(buildRoomP2PStatus());
   o.add(buildRoomP2PStatus());
   return o;
 }
 
-checkUnnamed54(core.List<api.RoomP2PStatus> o) {
+checkUnnamed830(core.List<api.RoomP2PStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoomP2PStatus(o[0]);
   checkRoomP2PStatus(o[1]);
@@ -2554,7 +2554,7 @@
   buildCounterRoomP2PStatuses++;
   if (buildCounterRoomP2PStatuses < 3) {
     o.kind = "foo";
-    o.updates = buildUnnamed54();
+    o.updates = buildUnnamed830();
   }
   buildCounterRoomP2PStatuses--;
   return o;
@@ -2564,19 +2564,19 @@
   buildCounterRoomP2PStatuses++;
   if (buildCounterRoomP2PStatuses < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed54(o.updates);
+    checkUnnamed830(o.updates);
   }
   buildCounterRoomP2PStatuses--;
 }
 
-buildUnnamed55() {
+buildUnnamed831() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed55(core.List<core.String> o) {
+checkUnnamed831(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2589,7 +2589,7 @@
   if (buildCounterRoomParticipant < 3) {
     o.autoMatched = true;
     o.autoMatchedPlayer = buildAnonymousPlayer();
-    o.capabilities = buildUnnamed55();
+    o.capabilities = buildUnnamed831();
     o.clientAddress = buildRoomClientAddress();
     o.connected = true;
     o.id = "foo";
@@ -2607,7 +2607,7 @@
   if (buildCounterRoomParticipant < 3) {
     unittest.expect(o.autoMatched, unittest.isTrue);
     checkAnonymousPlayer(o.autoMatchedPlayer);
-    checkUnnamed55(o.capabilities);
+    checkUnnamed831(o.capabilities);
     checkRoomClientAddress(o.clientAddress);
     unittest.expect(o.connected, unittest.isTrue);
     unittest.expect(o.id, unittest.equals('foo'));
@@ -2619,14 +2619,14 @@
   buildCounterRoomParticipant--;
 }
 
-buildUnnamed56() {
+buildUnnamed832() {
   var o = new core.List<api.RoomParticipant>();
   o.add(buildRoomParticipant());
   o.add(buildRoomParticipant());
   return o;
 }
 
-checkUnnamed56(core.List<api.RoomParticipant> o) {
+checkUnnamed832(core.List<api.RoomParticipant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoomParticipant(o[0]);
   checkRoomParticipant(o[1]);
@@ -2639,7 +2639,7 @@
   if (buildCounterRoomStatus < 3) {
     o.autoMatchingStatus = buildRoomAutoMatchStatus();
     o.kind = "foo";
-    o.participants = buildUnnamed56();
+    o.participants = buildUnnamed832();
     o.roomId = "foo";
     o.status = "foo";
     o.statusVersion = 42;
@@ -2653,7 +2653,7 @@
   if (buildCounterRoomStatus < 3) {
     checkRoomAutoMatchStatus(o.autoMatchingStatus);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed56(o.participants);
+    checkUnnamed832(o.participants);
     unittest.expect(o.roomId, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.statusVersion, unittest.equals(42));
@@ -2700,6 +2700,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.lastModifiedMillis = "foo";
+    o.progressValue = "foo";
     o.title = "foo";
     o.type = "foo";
     o.uniqueName = "foo";
@@ -2718,6 +2719,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastModifiedMillis, unittest.equals('foo'));
+    unittest.expect(o.progressValue, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.uniqueName, unittest.equals('foo'));
@@ -2752,14 +2754,14 @@
   buildCounterSnapshotImage--;
 }
 
-buildUnnamed57() {
+buildUnnamed833() {
   var o = new core.List<api.Snapshot>();
   o.add(buildSnapshot());
   o.add(buildSnapshot());
   return o;
 }
 
-checkUnnamed57(core.List<api.Snapshot> o) {
+checkUnnamed833(core.List<api.Snapshot> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSnapshot(o[0]);
   checkSnapshot(o[1]);
@@ -2770,7 +2772,7 @@
   var o = new api.SnapshotListResponse();
   buildCounterSnapshotListResponse++;
   if (buildCounterSnapshotListResponse < 3) {
-    o.items = buildUnnamed57();
+    o.items = buildUnnamed833();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -2781,7 +2783,7 @@
 checkSnapshotListResponse(api.SnapshotListResponse o) {
   buildCounterSnapshotListResponse++;
   if (buildCounterSnapshotListResponse < 3) {
-    checkUnnamed57(o.items);
+    checkUnnamed833(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -2813,27 +2815,27 @@
   buildCounterTurnBasedAutoMatchingCriteria--;
 }
 
-buildUnnamed58() {
+buildUnnamed834() {
   var o = new core.List<api.TurnBasedMatchParticipant>();
   o.add(buildTurnBasedMatchParticipant());
   o.add(buildTurnBasedMatchParticipant());
   return o;
 }
 
-checkUnnamed58(core.List<api.TurnBasedMatchParticipant> o) {
+checkUnnamed834(core.List<api.TurnBasedMatchParticipant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTurnBasedMatchParticipant(o[0]);
   checkTurnBasedMatchParticipant(o[1]);
 }
 
-buildUnnamed59() {
+buildUnnamed835() {
   var o = new core.List<api.ParticipantResult>();
   o.add(buildParticipantResult());
   o.add(buildParticipantResult());
   return o;
 }
 
-checkUnnamed59(core.List<api.ParticipantResult> o) {
+checkUnnamed835(core.List<api.ParticipantResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParticipantResult(o[0]);
   checkParticipantResult(o[1]);
@@ -2855,11 +2857,11 @@
     o.matchId = "foo";
     o.matchNumber = 42;
     o.matchVersion = 42;
-    o.participants = buildUnnamed58();
+    o.participants = buildUnnamed834();
     o.pendingParticipantId = "foo";
     o.previousMatchData = buildTurnBasedMatchData();
     o.rematchId = "foo";
-    o.results = buildUnnamed59();
+    o.results = buildUnnamed835();
     o.status = "foo";
     o.userMatchStatus = "foo";
     o.variant = 42;
@@ -2883,11 +2885,11 @@
     unittest.expect(o.matchId, unittest.equals('foo'));
     unittest.expect(o.matchNumber, unittest.equals(42));
     unittest.expect(o.matchVersion, unittest.equals(42));
-    checkUnnamed58(o.participants);
+    checkUnnamed834(o.participants);
     unittest.expect(o.pendingParticipantId, unittest.equals('foo'));
     checkTurnBasedMatchData(o.previousMatchData);
     unittest.expect(o.rematchId, unittest.equals('foo'));
-    checkUnnamed59(o.results);
+    checkUnnamed835(o.results);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.userMatchStatus, unittest.equals('foo'));
     unittest.expect(o.variant, unittest.equals(42));
@@ -2896,14 +2898,14 @@
   buildCounterTurnBasedMatch--;
 }
 
-buildUnnamed60() {
+buildUnnamed836() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed60(core.List<core.String> o) {
+checkUnnamed836(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2915,7 +2917,7 @@
   buildCounterTurnBasedMatchCreateRequest++;
   if (buildCounterTurnBasedMatchCreateRequest < 3) {
     o.autoMatchingCriteria = buildTurnBasedAutoMatchingCriteria();
-    o.invitedPlayerIds = buildUnnamed60();
+    o.invitedPlayerIds = buildUnnamed836();
     o.kind = "foo";
     o.requestId = "foo";
     o.variant = 42;
@@ -2928,7 +2930,7 @@
   buildCounterTurnBasedMatchCreateRequest++;
   if (buildCounterTurnBasedMatchCreateRequest < 3) {
     checkTurnBasedAutoMatchingCriteria(o.autoMatchingCriteria);
-    checkUnnamed60(o.invitedPlayerIds);
+    checkUnnamed836(o.invitedPlayerIds);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.requestId, unittest.equals('foo'));
     unittest.expect(o.variant, unittest.equals(42));
@@ -2980,14 +2982,14 @@
   buildCounterTurnBasedMatchDataRequest--;
 }
 
-buildUnnamed61() {
+buildUnnamed837() {
   var o = new core.List<api.TurnBasedMatch>();
   o.add(buildTurnBasedMatch());
   o.add(buildTurnBasedMatch());
   return o;
 }
 
-checkUnnamed61(core.List<api.TurnBasedMatch> o) {
+checkUnnamed837(core.List<api.TurnBasedMatch> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTurnBasedMatch(o[0]);
   checkTurnBasedMatch(o[1]);
@@ -2998,7 +3000,7 @@
   var o = new api.TurnBasedMatchList();
   buildCounterTurnBasedMatchList++;
   if (buildCounterTurnBasedMatchList < 3) {
-    o.items = buildUnnamed61();
+    o.items = buildUnnamed837();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -3009,7 +3011,7 @@
 checkTurnBasedMatchList(api.TurnBasedMatchList o) {
   buildCounterTurnBasedMatchList++;
   if (buildCounterTurnBasedMatchList < 3) {
-    checkUnnamed61(o.items);
+    checkUnnamed837(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -3091,14 +3093,14 @@
   buildCounterTurnBasedMatchRematch--;
 }
 
-buildUnnamed62() {
+buildUnnamed838() {
   var o = new core.List<api.ParticipantResult>();
   o.add(buildParticipantResult());
   o.add(buildParticipantResult());
   return o;
 }
 
-checkUnnamed62(core.List<api.ParticipantResult> o) {
+checkUnnamed838(core.List<api.ParticipantResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParticipantResult(o[0]);
   checkParticipantResult(o[1]);
@@ -3112,7 +3114,7 @@
     o.data = buildTurnBasedMatchDataRequest();
     o.kind = "foo";
     o.matchVersion = 42;
-    o.results = buildUnnamed62();
+    o.results = buildUnnamed838();
   }
   buildCounterTurnBasedMatchResults--;
   return o;
@@ -3124,19 +3126,19 @@
     checkTurnBasedMatchDataRequest(o.data);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.matchVersion, unittest.equals(42));
-    checkUnnamed62(o.results);
+    checkUnnamed838(o.results);
   }
   buildCounterTurnBasedMatchResults--;
 }
 
-buildUnnamed63() {
+buildUnnamed839() {
   var o = new core.List<api.TurnBasedMatch>();
   o.add(buildTurnBasedMatch());
   o.add(buildTurnBasedMatch());
   return o;
 }
 
-checkUnnamed63(core.List<api.TurnBasedMatch> o) {
+checkUnnamed839(core.List<api.TurnBasedMatch> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTurnBasedMatch(o[0]);
   checkTurnBasedMatch(o[1]);
@@ -3147,7 +3149,7 @@
   var o = new api.TurnBasedMatchSync();
   buildCounterTurnBasedMatchSync++;
   if (buildCounterTurnBasedMatchSync < 3) {
-    o.items = buildUnnamed63();
+    o.items = buildUnnamed839();
     o.kind = "foo";
     o.moreAvailable = true;
     o.nextPageToken = "foo";
@@ -3159,7 +3161,7 @@
 checkTurnBasedMatchSync(api.TurnBasedMatchSync o) {
   buildCounterTurnBasedMatchSync++;
   if (buildCounterTurnBasedMatchSync < 3) {
-    checkUnnamed63(o.items);
+    checkUnnamed839(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.moreAvailable, unittest.isTrue);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -3167,14 +3169,14 @@
   buildCounterTurnBasedMatchSync--;
 }
 
-buildUnnamed64() {
+buildUnnamed840() {
   var o = new core.List<api.ParticipantResult>();
   o.add(buildParticipantResult());
   o.add(buildParticipantResult());
   return o;
 }
 
-checkUnnamed64(core.List<api.ParticipantResult> o) {
+checkUnnamed840(core.List<api.ParticipantResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParticipantResult(o[0]);
   checkParticipantResult(o[1]);
@@ -3189,7 +3191,7 @@
     o.kind = "foo";
     o.matchVersion = 42;
     o.pendingParticipantId = "foo";
-    o.results = buildUnnamed64();
+    o.results = buildUnnamed840();
   }
   buildCounterTurnBasedMatchTurn--;
   return o;
@@ -3202,7 +3204,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.matchVersion, unittest.equals(42));
     unittest.expect(o.pendingParticipantId, unittest.equals('foo'));
-    checkUnnamed64(o.results);
+    checkUnnamed840(o.results);
   }
   buildCounterTurnBasedMatchTurn--;
 }
diff --git a/generated/googleapis/test/gamesmanagement/v1management_test.dart b/generated/googleapis/test/gamesmanagement/v1management_test.dart
index c2b95d4..62bf113 100644
--- a/generated/googleapis/test/gamesmanagement/v1management_test.dart
+++ b/generated/googleapis/test/gamesmanagement/v1management_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed437() {
+buildUnnamed841() {
   var o = new core.List<api.AchievementResetResponse>();
   o.add(buildAchievementResetResponse());
   o.add(buildAchievementResetResponse());
   return o;
 }
 
-checkUnnamed437(core.List<api.AchievementResetResponse> o) {
+checkUnnamed841(core.List<api.AchievementResetResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAchievementResetResponse(o[0]);
   checkAchievementResetResponse(o[1]);
@@ -35,7 +35,7 @@
   buildCounterAchievementResetAllResponse++;
   if (buildCounterAchievementResetAllResponse < 3) {
     o.kind = "foo";
-    o.results = buildUnnamed437();
+    o.results = buildUnnamed841();
   }
   buildCounterAchievementResetAllResponse--;
   return o;
@@ -45,19 +45,19 @@
   buildCounterAchievementResetAllResponse++;
   if (buildCounterAchievementResetAllResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed437(o.results);
+    checkUnnamed841(o.results);
   }
   buildCounterAchievementResetAllResponse--;
 }
 
-buildUnnamed438() {
+buildUnnamed842() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed438(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'));
@@ -68,7 +68,7 @@
   var o = new api.AchievementResetMultipleForAllRequest();
   buildCounterAchievementResetMultipleForAllRequest++;
   if (buildCounterAchievementResetMultipleForAllRequest < 3) {
-    o.achievementIds = buildUnnamed438();
+    o.achievementIds = buildUnnamed842();
     o.kind = "foo";
   }
   buildCounterAchievementResetMultipleForAllRequest--;
@@ -78,7 +78,7 @@
 checkAchievementResetMultipleForAllRequest(api.AchievementResetMultipleForAllRequest o) {
   buildCounterAchievementResetMultipleForAllRequest++;
   if (buildCounterAchievementResetMultipleForAllRequest < 3) {
-    checkUnnamed438(o.achievementIds);
+    checkUnnamed842(o.achievementIds);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAchievementResetMultipleForAllRequest--;
@@ -109,6 +109,40 @@
   buildCounterAchievementResetResponse--;
 }
 
+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'));
+}
+
+core.int buildCounterEventsResetMultipleForAllRequest = 0;
+buildEventsResetMultipleForAllRequest() {
+  var o = new api.EventsResetMultipleForAllRequest();
+  buildCounterEventsResetMultipleForAllRequest++;
+  if (buildCounterEventsResetMultipleForAllRequest < 3) {
+    o.eventIds = buildUnnamed843();
+    o.kind = "foo";
+  }
+  buildCounterEventsResetMultipleForAllRequest--;
+  return o;
+}
+
+checkEventsResetMultipleForAllRequest(api.EventsResetMultipleForAllRequest o) {
+  buildCounterEventsResetMultipleForAllRequest++;
+  if (buildCounterEventsResetMultipleForAllRequest < 3) {
+    checkUnnamed843(o.eventIds);
+    unittest.expect(o.kind, unittest.equals('foo'));
+  }
+  buildCounterEventsResetMultipleForAllRequest--;
+}
+
 core.int buildCounterGamesPlayedResource = 0;
 buildGamesPlayedResource() {
   var o = new api.GamesPlayedResource();
@@ -201,14 +235,14 @@
   buildCounterHiddenPlayer--;
 }
 
-buildUnnamed439() {
+buildUnnamed844() {
   var o = new core.List<api.HiddenPlayer>();
   o.add(buildHiddenPlayer());
   o.add(buildHiddenPlayer());
   return o;
 }
 
-checkUnnamed439(core.List<api.HiddenPlayer> o) {
+checkUnnamed844(core.List<api.HiddenPlayer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHiddenPlayer(o[0]);
   checkHiddenPlayer(o[1]);
@@ -219,7 +253,7 @@
   var o = new api.HiddenPlayerList();
   buildCounterHiddenPlayerList++;
   if (buildCounterHiddenPlayerList < 3) {
-    o.items = buildUnnamed439();
+    o.items = buildUnnamed844();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -230,7 +264,7 @@
 checkHiddenPlayerList(api.HiddenPlayerList o) {
   buildCounterHiddenPlayerList++;
   if (buildCounterHiddenPlayerList < 3) {
-    checkUnnamed439(o.items);
+    checkUnnamed844(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -291,14 +325,48 @@
   buildCounterPlayer--;
 }
 
-buildUnnamed440() {
+buildUnnamed845() {
+  var o = new core.List<api.PlayerScoreResetResponse>();
+  o.add(buildPlayerScoreResetResponse());
+  o.add(buildPlayerScoreResetResponse());
+  return o;
+}
+
+checkUnnamed845(core.List<api.PlayerScoreResetResponse> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkPlayerScoreResetResponse(o[0]);
+  checkPlayerScoreResetResponse(o[1]);
+}
+
+core.int buildCounterPlayerScoreResetAllResponse = 0;
+buildPlayerScoreResetAllResponse() {
+  var o = new api.PlayerScoreResetAllResponse();
+  buildCounterPlayerScoreResetAllResponse++;
+  if (buildCounterPlayerScoreResetAllResponse < 3) {
+    o.kind = "foo";
+    o.results = buildUnnamed845();
+  }
+  buildCounterPlayerScoreResetAllResponse--;
+  return o;
+}
+
+checkPlayerScoreResetAllResponse(api.PlayerScoreResetAllResponse o) {
+  buildCounterPlayerScoreResetAllResponse++;
+  if (buildCounterPlayerScoreResetAllResponse < 3) {
+    unittest.expect(o.kind, unittest.equals('foo'));
+    checkUnnamed845(o.results);
+  }
+  buildCounterPlayerScoreResetAllResponse--;
+}
+
+buildUnnamed846() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed440(core.List<core.String> 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'));
@@ -309,8 +377,9 @@
   var o = new api.PlayerScoreResetResponse();
   buildCounterPlayerScoreResetResponse++;
   if (buildCounterPlayerScoreResetResponse < 3) {
+    o.definitionId = "foo";
     o.kind = "foo";
-    o.resetScoreTimeSpans = buildUnnamed440();
+    o.resetScoreTimeSpans = buildUnnamed846();
   }
   buildCounterPlayerScoreResetResponse--;
   return o;
@@ -319,12 +388,81 @@
 checkPlayerScoreResetResponse(api.PlayerScoreResetResponse o) {
   buildCounterPlayerScoreResetResponse++;
   if (buildCounterPlayerScoreResetResponse < 3) {
+    unittest.expect(o.definitionId, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed440(o.resetScoreTimeSpans);
+    checkUnnamed846(o.resetScoreTimeSpans);
   }
   buildCounterPlayerScoreResetResponse--;
 }
 
+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'));
+}
+
+core.int buildCounterQuestsResetMultipleForAllRequest = 0;
+buildQuestsResetMultipleForAllRequest() {
+  var o = new api.QuestsResetMultipleForAllRequest();
+  buildCounterQuestsResetMultipleForAllRequest++;
+  if (buildCounterQuestsResetMultipleForAllRequest < 3) {
+    o.kind = "foo";
+    o.questIds = buildUnnamed847();
+  }
+  buildCounterQuestsResetMultipleForAllRequest--;
+  return o;
+}
+
+checkQuestsResetMultipleForAllRequest(api.QuestsResetMultipleForAllRequest o) {
+  buildCounterQuestsResetMultipleForAllRequest++;
+  if (buildCounterQuestsResetMultipleForAllRequest < 3) {
+    unittest.expect(o.kind, unittest.equals('foo'));
+    checkUnnamed847(o.questIds);
+  }
+  buildCounterQuestsResetMultipleForAllRequest--;
+}
+
+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'));
+}
+
+core.int buildCounterScoresResetMultipleForAllRequest = 0;
+buildScoresResetMultipleForAllRequest() {
+  var o = new api.ScoresResetMultipleForAllRequest();
+  buildCounterScoresResetMultipleForAllRequest++;
+  if (buildCounterScoresResetMultipleForAllRequest < 3) {
+    o.kind = "foo";
+    o.leaderboardIds = buildUnnamed848();
+  }
+  buildCounterScoresResetMultipleForAllRequest--;
+  return o;
+}
+
+checkScoresResetMultipleForAllRequest(api.ScoresResetMultipleForAllRequest o) {
+  buildCounterScoresResetMultipleForAllRequest++;
+  if (buildCounterScoresResetMultipleForAllRequest < 3) {
+    unittest.expect(o.kind, unittest.equals('foo'));
+    checkUnnamed848(o.leaderboardIds);
+  }
+  buildCounterScoresResetMultipleForAllRequest--;
+}
+
 
 main() {
   unittest.group("obj-schema-AchievementResetAllResponse", () {
@@ -354,6 +492,15 @@
   });
 
 
+  unittest.group("obj-schema-EventsResetMultipleForAllRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildEventsResetMultipleForAllRequest();
+      var od = new api.EventsResetMultipleForAllRequest.fromJson(o.toJson());
+      checkEventsResetMultipleForAllRequest(od);
+    });
+  });
+
+
   unittest.group("obj-schema-GamesPlayedResource", () {
     unittest.test("to-json--from-json", () {
       var o = buildGamesPlayedResource();
@@ -417,6 +564,15 @@
   });
 
 
+  unittest.group("obj-schema-PlayerScoreResetAllResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildPlayerScoreResetAllResponse();
+      var od = new api.PlayerScoreResetAllResponse.fromJson(o.toJson());
+      checkPlayerScoreResetAllResponse(od);
+    });
+  });
+
+
   unittest.group("obj-schema-PlayerScoreResetResponse", () {
     unittest.test("to-json--from-json", () {
       var o = buildPlayerScoreResetResponse();
@@ -426,6 +582,24 @@
   });
 
 
+  unittest.group("obj-schema-QuestsResetMultipleForAllRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildQuestsResetMultipleForAllRequest();
+      var od = new api.QuestsResetMultipleForAllRequest.fromJson(o.toJson());
+      checkQuestsResetMultipleForAllRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ScoresResetMultipleForAllRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildScoresResetMultipleForAllRequest();
+      var od = new api.ScoresResetMultipleForAllRequest.fromJson(o.toJson());
+      checkScoresResetMultipleForAllRequest(od);
+    });
+  });
+
+
   unittest.group("resource-AchievementsResourceApi", () {
     unittest.test("method--reset", () {
 
@@ -825,6 +999,49 @@
       res.resetAll().then(unittest.expectAsync((_) {}));
     });
 
+    unittest.test("method--resetAllForAllPlayers", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.EventsResourceApi res = new api.GamesManagementApi(mock).events;
+      mock.register(unittest.expectAsync((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 + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 28), unittest.equals("events/resetAllForAllPlayers"));
+        pathOffset += 28;
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.resetAllForAllPlayers().then(unittest.expectAsync((_) {}));
+    });
+
     unittest.test("method--resetForAllPlayers", () {
 
       var mock = new common_test.HttpServerMock();
@@ -876,6 +1093,53 @@
       res.resetForAllPlayers(arg_eventId).then(unittest.expectAsync((_) {}));
     });
 
+    unittest.test("method--resetMultipleForAllPlayers", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.EventsResourceApi res = new api.GamesManagementApi(mock).events;
+      var arg_request = buildEventsResetMultipleForAllRequest();
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.EventsResetMultipleForAllRequest.fromJson(json);
+        checkEventsResetMultipleForAllRequest(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 + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 33), unittest.equals("events/resetMultipleForAllPlayers"));
+        pathOffset += 33;
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.resetMultipleForAllPlayers(arg_request).then(unittest.expectAsync((_) {}));
+    });
+
   });
 
 
@@ -1045,6 +1309,190 @@
       res.reset(arg_questId).then(unittest.expectAsync((_) {}));
     });
 
+    unittest.test("method--resetAll", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.QuestsResourceApi res = new api.GamesManagementApi(mock).quests;
+      mock.register(unittest.expectAsync((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 + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("quests/reset"));
+        pathOffset += 12;
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.resetAll().then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--resetAllForAllPlayers", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.QuestsResourceApi res = new api.GamesManagementApi(mock).quests;
+      mock.register(unittest.expectAsync((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 + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 28), unittest.equals("quests/resetAllForAllPlayers"));
+        pathOffset += 28;
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.resetAllForAllPlayers().then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--resetForAllPlayers", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.QuestsResourceApi res = new api.GamesManagementApi(mock).quests;
+      var arg_questId = "foo";
+      mock.register(unittest.expectAsync((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 + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
+        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));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_questId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/resetForAllPlayers"));
+        pathOffset += 19;
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.resetForAllPlayers(arg_questId).then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--resetMultipleForAllPlayers", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.QuestsResourceApi res = new api.GamesManagementApi(mock).quests;
+      var arg_request = buildQuestsResetMultipleForAllRequest();
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.QuestsResetMultipleForAllRequest.fromJson(json);
+        checkQuestsResetMultipleForAllRequest(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 + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 33), unittest.equals("quests/resetMultipleForAllPlayers"));
+        pathOffset += 33;
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.resetMultipleForAllPlayers(arg_request).then(unittest.expectAsync((_) {}));
+    });
+
   });
 
 
@@ -1092,6 +1540,49 @@
       res.reset().then(unittest.expectAsync((_) {}));
     });
 
+    unittest.test("method--resetForAllPlayers", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.RoomsResourceApi res = new api.GamesManagementApi(mock).rooms;
+      mock.register(unittest.expectAsync((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 + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("rooms/resetForAllPlayers"));
+        pathOffset += 24;
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.resetForAllPlayers().then(unittest.expectAsync((_) {}));
+    });
+
   });
 
 
@@ -1149,6 +1640,94 @@
       })));
     });
 
+    unittest.test("method--resetAll", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ScoresResourceApi res = new api.GamesManagementApi(mock).scores;
+      mock.register(unittest.expectAsync((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 + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("scores/reset"));
+        pathOffset += 12;
+
+        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(buildPlayerScoreResetAllResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.resetAll().then(unittest.expectAsync(((api.PlayerScoreResetAllResponse response) {
+        checkPlayerScoreResetAllResponse(response);
+      })));
+    });
+
+    unittest.test("method--resetAllForAllPlayers", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ScoresResourceApi res = new api.GamesManagementApi(mock).scores;
+      mock.register(unittest.expectAsync((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 + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 28), unittest.equals("scores/resetAllForAllPlayers"));
+        pathOffset += 28;
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.resetAllForAllPlayers().then(unittest.expectAsync((_) {}));
+    });
+
     unittest.test("method--resetForAllPlayers", () {
 
       var mock = new common_test.HttpServerMock();
@@ -1200,6 +1779,53 @@
       res.resetForAllPlayers(arg_leaderboardId).then(unittest.expectAsync((_) {}));
     });
 
+    unittest.test("method--resetMultipleForAllPlayers", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ScoresResourceApi res = new api.GamesManagementApi(mock).scores;
+      var arg_request = buildScoresResetMultipleForAllRequest();
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.ScoresResetMultipleForAllRequest.fromJson(json);
+        checkScoresResetMultipleForAllRequest(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 + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 33), unittest.equals("scores/resetMultipleForAllPlayers"));
+        pathOffset += 33;
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.resetMultipleForAllPlayers(arg_request).then(unittest.expectAsync((_) {}));
+    });
+
   });
 
 
@@ -1247,6 +1873,49 @@
       res.reset().then(unittest.expectAsync((_) {}));
     });
 
+    unittest.test("method--resetForAllPlayers", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.TurnBasedMatchesResourceApi res = new api.GamesManagementApi(mock).turnBasedMatches;
+      mock.register(unittest.expectAsync((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 + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 35), unittest.equals("turnbasedmatches/resetForAllPlayers"));
+        pathOffset += 35;
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.resetForAllPlayers().then(unittest.expectAsync((_) {}));
+    });
+
   });
 
 
diff --git a/generated/googleapis/test/gmail/v1_test.dart b/generated/googleapis/test/gmail/v1_test.dart
index cab0c85..27a57d1 100644
--- a/generated/googleapis/test/gmail/v1_test.dart
+++ b/generated/googleapis/test/gmail/v1_test.dart
@@ -37,14 +37,14 @@
   buildCounterDraft--;
 }
 
-buildUnnamed163() {
+buildUnnamed849() {
   var o = new core.List<api.Message>();
   o.add(buildMessage());
   o.add(buildMessage());
   return o;
 }
 
-checkUnnamed163(core.List<api.Message> o) {
+checkUnnamed849(core.List<api.Message> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMessage(o[0]);
   checkMessage(o[1]);
@@ -56,7 +56,7 @@
   buildCounterHistory++;
   if (buildCounterHistory < 3) {
     o.id = "foo";
-    o.messages = buildUnnamed163();
+    o.messages = buildUnnamed849();
   }
   buildCounterHistory--;
   return o;
@@ -66,7 +66,7 @@
   buildCounterHistory++;
   if (buildCounterHistory < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed163(o.messages);
+    checkUnnamed849(o.messages);
   }
   buildCounterHistory--;
 }
@@ -106,14 +106,14 @@
   buildCounterLabel--;
 }
 
-buildUnnamed164() {
+buildUnnamed850() {
   var o = new core.List<api.Draft>();
   o.add(buildDraft());
   o.add(buildDraft());
   return o;
 }
 
-checkUnnamed164(core.List<api.Draft> o) {
+checkUnnamed850(core.List<api.Draft> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDraft(o[0]);
   checkDraft(o[1]);
@@ -124,7 +124,7 @@
   var o = new api.ListDraftsResponse();
   buildCounterListDraftsResponse++;
   if (buildCounterListDraftsResponse < 3) {
-    o.drafts = buildUnnamed164();
+    o.drafts = buildUnnamed850();
     o.nextPageToken = "foo";
     o.resultSizeEstimate = 42;
   }
@@ -135,21 +135,21 @@
 checkListDraftsResponse(api.ListDraftsResponse o) {
   buildCounterListDraftsResponse++;
   if (buildCounterListDraftsResponse < 3) {
-    checkUnnamed164(o.drafts);
+    checkUnnamed850(o.drafts);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.resultSizeEstimate, unittest.equals(42));
   }
   buildCounterListDraftsResponse--;
 }
 
-buildUnnamed165() {
+buildUnnamed851() {
   var o = new core.List<api.History>();
   o.add(buildHistory());
   o.add(buildHistory());
   return o;
 }
 
-checkUnnamed165(core.List<api.History> o) {
+checkUnnamed851(core.List<api.History> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHistory(o[0]);
   checkHistory(o[1]);
@@ -160,7 +160,7 @@
   var o = new api.ListHistoryResponse();
   buildCounterListHistoryResponse++;
   if (buildCounterListHistoryResponse < 3) {
-    o.history = buildUnnamed165();
+    o.history = buildUnnamed851();
     o.historyId = "foo";
     o.nextPageToken = "foo";
   }
@@ -171,21 +171,21 @@
 checkListHistoryResponse(api.ListHistoryResponse o) {
   buildCounterListHistoryResponse++;
   if (buildCounterListHistoryResponse < 3) {
-    checkUnnamed165(o.history);
+    checkUnnamed851(o.history);
     unittest.expect(o.historyId, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListHistoryResponse--;
 }
 
-buildUnnamed166() {
+buildUnnamed852() {
   var o = new core.List<api.Label>();
   o.add(buildLabel());
   o.add(buildLabel());
   return o;
 }
 
-checkUnnamed166(core.List<api.Label> o) {
+checkUnnamed852(core.List<api.Label> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabel(o[0]);
   checkLabel(o[1]);
@@ -196,7 +196,7 @@
   var o = new api.ListLabelsResponse();
   buildCounterListLabelsResponse++;
   if (buildCounterListLabelsResponse < 3) {
-    o.labels = buildUnnamed166();
+    o.labels = buildUnnamed852();
   }
   buildCounterListLabelsResponse--;
   return o;
@@ -205,19 +205,19 @@
 checkListLabelsResponse(api.ListLabelsResponse o) {
   buildCounterListLabelsResponse++;
   if (buildCounterListLabelsResponse < 3) {
-    checkUnnamed166(o.labels);
+    checkUnnamed852(o.labels);
   }
   buildCounterListLabelsResponse--;
 }
 
-buildUnnamed167() {
+buildUnnamed853() {
   var o = new core.List<api.Message>();
   o.add(buildMessage());
   o.add(buildMessage());
   return o;
 }
 
-checkUnnamed167(core.List<api.Message> o) {
+checkUnnamed853(core.List<api.Message> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMessage(o[0]);
   checkMessage(o[1]);
@@ -228,7 +228,7 @@
   var o = new api.ListMessagesResponse();
   buildCounterListMessagesResponse++;
   if (buildCounterListMessagesResponse < 3) {
-    o.messages = buildUnnamed167();
+    o.messages = buildUnnamed853();
     o.nextPageToken = "foo";
     o.resultSizeEstimate = 42;
   }
@@ -239,21 +239,21 @@
 checkListMessagesResponse(api.ListMessagesResponse o) {
   buildCounterListMessagesResponse++;
   if (buildCounterListMessagesResponse < 3) {
-    checkUnnamed167(o.messages);
+    checkUnnamed853(o.messages);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.resultSizeEstimate, unittest.equals(42));
   }
   buildCounterListMessagesResponse--;
 }
 
-buildUnnamed168() {
+buildUnnamed854() {
   var o = new core.List<api.Thread>();
   o.add(buildThread());
   o.add(buildThread());
   return o;
 }
 
-checkUnnamed168(core.List<api.Thread> o) {
+checkUnnamed854(core.List<api.Thread> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThread(o[0]);
   checkThread(o[1]);
@@ -266,7 +266,7 @@
   if (buildCounterListThreadsResponse < 3) {
     o.nextPageToken = "foo";
     o.resultSizeEstimate = 42;
-    o.threads = buildUnnamed168();
+    o.threads = buildUnnamed854();
   }
   buildCounterListThreadsResponse--;
   return o;
@@ -277,19 +277,19 @@
   if (buildCounterListThreadsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.resultSizeEstimate, unittest.equals(42));
-    checkUnnamed168(o.threads);
+    checkUnnamed854(o.threads);
   }
   buildCounterListThreadsResponse--;
 }
 
-buildUnnamed169() {
+buildUnnamed855() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed169(core.List<core.String> o) {
+checkUnnamed855(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -302,7 +302,7 @@
   if (buildCounterMessage < 3) {
     o.historyId = "foo";
     o.id = "foo";
-    o.labelIds = buildUnnamed169();
+    o.labelIds = buildUnnamed855();
     o.payload = buildMessagePart();
     o.raw = "foo";
     o.sizeEstimate = 42;
@@ -318,7 +318,7 @@
   if (buildCounterMessage < 3) {
     unittest.expect(o.historyId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed169(o.labelIds);
+    checkUnnamed855(o.labelIds);
     checkMessagePart(o.payload);
     unittest.expect(o.raw, unittest.equals('foo'));
     unittest.expect(o.sizeEstimate, unittest.equals(42));
@@ -328,27 +328,27 @@
   buildCounterMessage--;
 }
 
-buildUnnamed170() {
+buildUnnamed856() {
   var o = new core.List<api.MessagePartHeader>();
   o.add(buildMessagePartHeader());
   o.add(buildMessagePartHeader());
   return o;
 }
 
-checkUnnamed170(core.List<api.MessagePartHeader> o) {
+checkUnnamed856(core.List<api.MessagePartHeader> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMessagePartHeader(o[0]);
   checkMessagePartHeader(o[1]);
 }
 
-buildUnnamed171() {
+buildUnnamed857() {
   var o = new core.List<api.MessagePart>();
   o.add(buildMessagePart());
   o.add(buildMessagePart());
   return o;
 }
 
-checkUnnamed171(core.List<api.MessagePart> o) {
+checkUnnamed857(core.List<api.MessagePart> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMessagePart(o[0]);
   checkMessagePart(o[1]);
@@ -361,10 +361,10 @@
   if (buildCounterMessagePart < 3) {
     o.body = buildMessagePartBody();
     o.filename = "foo";
-    o.headers = buildUnnamed170();
+    o.headers = buildUnnamed856();
     o.mimeType = "foo";
     o.partId = "foo";
-    o.parts = buildUnnamed171();
+    o.parts = buildUnnamed857();
   }
   buildCounterMessagePart--;
   return o;
@@ -375,10 +375,10 @@
   if (buildCounterMessagePart < 3) {
     checkMessagePartBody(o.body);
     unittest.expect(o.filename, unittest.equals('foo'));
-    checkUnnamed170(o.headers);
+    checkUnnamed856(o.headers);
     unittest.expect(o.mimeType, unittest.equals('foo'));
     unittest.expect(o.partId, unittest.equals('foo'));
-    checkUnnamed171(o.parts);
+    checkUnnamed857(o.parts);
   }
   buildCounterMessagePart--;
 }
@@ -427,27 +427,27 @@
   buildCounterMessagePartHeader--;
 }
 
-buildUnnamed172() {
+buildUnnamed858() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed172(core.List<core.String> o) {
+checkUnnamed858(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed173() {
+buildUnnamed859() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed173(core.List<core.String> o) {
+checkUnnamed859(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -458,8 +458,8 @@
   var o = new api.ModifyMessageRequest();
   buildCounterModifyMessageRequest++;
   if (buildCounterModifyMessageRequest < 3) {
-    o.addLabelIds = buildUnnamed172();
-    o.removeLabelIds = buildUnnamed173();
+    o.addLabelIds = buildUnnamed858();
+    o.removeLabelIds = buildUnnamed859();
   }
   buildCounterModifyMessageRequest--;
   return o;
@@ -468,33 +468,33 @@
 checkModifyMessageRequest(api.ModifyMessageRequest o) {
   buildCounterModifyMessageRequest++;
   if (buildCounterModifyMessageRequest < 3) {
-    checkUnnamed172(o.addLabelIds);
-    checkUnnamed173(o.removeLabelIds);
+    checkUnnamed858(o.addLabelIds);
+    checkUnnamed859(o.removeLabelIds);
   }
   buildCounterModifyMessageRequest--;
 }
 
-buildUnnamed174() {
+buildUnnamed860() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed174(core.List<core.String> o) {
+checkUnnamed860(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed175() {
+buildUnnamed861() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed175(core.List<core.String> o) {
+checkUnnamed861(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -505,8 +505,8 @@
   var o = new api.ModifyThreadRequest();
   buildCounterModifyThreadRequest++;
   if (buildCounterModifyThreadRequest < 3) {
-    o.addLabelIds = buildUnnamed174();
-    o.removeLabelIds = buildUnnamed175();
+    o.addLabelIds = buildUnnamed860();
+    o.removeLabelIds = buildUnnamed861();
   }
   buildCounterModifyThreadRequest--;
   return o;
@@ -515,8 +515,8 @@
 checkModifyThreadRequest(api.ModifyThreadRequest o) {
   buildCounterModifyThreadRequest++;
   if (buildCounterModifyThreadRequest < 3) {
-    checkUnnamed174(o.addLabelIds);
-    checkUnnamed175(o.removeLabelIds);
+    checkUnnamed860(o.addLabelIds);
+    checkUnnamed861(o.removeLabelIds);
   }
   buildCounterModifyThreadRequest--;
 }
@@ -546,14 +546,14 @@
   buildCounterProfile--;
 }
 
-buildUnnamed176() {
+buildUnnamed862() {
   var o = new core.List<api.Message>();
   o.add(buildMessage());
   o.add(buildMessage());
   return o;
 }
 
-checkUnnamed176(core.List<api.Message> o) {
+checkUnnamed862(core.List<api.Message> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMessage(o[0]);
   checkMessage(o[1]);
@@ -566,7 +566,7 @@
   if (buildCounterThread < 3) {
     o.historyId = "foo";
     o.id = "foo";
-    o.messages = buildUnnamed176();
+    o.messages = buildUnnamed862();
     o.snippet = "foo";
   }
   buildCounterThread--;
@@ -578,46 +578,59 @@
   if (buildCounterThread < 3) {
     unittest.expect(o.historyId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed176(o.messages);
+    checkUnnamed862(o.messages);
     unittest.expect(o.snippet, unittest.equals('foo'));
   }
   buildCounterThread--;
 }
 
-buildUnnamed177() {
+buildUnnamed863() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed177(core.List<core.String> o) {
+checkUnnamed863(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed178() {
+buildUnnamed864() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed178(core.List<core.String> o) {
+checkUnnamed864(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed179() {
+buildUnnamed865() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed179(core.List<core.String> o) {
+checkUnnamed865(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed866() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed866(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1469,7 +1482,7 @@
       var arg_userId = "foo";
       var arg_id = "foo";
       var arg_format = "foo";
-      var arg_metadataHeaders = buildUnnamed177();
+      var arg_metadataHeaders = buildUnnamed863();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1615,7 +1628,7 @@
       api.UsersMessagesResourceApi res = new api.GmailApi(mock).users.messages;
       var arg_userId = "foo";
       var arg_includeSpamTrash = true;
-      var arg_labelIds = buildUnnamed178();
+      var arg_labelIds = buildUnnamed864();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_q = "foo";
@@ -1941,6 +1954,8 @@
       api.UsersThreadsResourceApi res = new api.GmailApi(mock).users.threads;
       var arg_userId = "foo";
       var arg_id = "foo";
+      var arg_format = "foo";
+      var arg_metadataHeaders = buildUnnamed865();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1965,6 +1980,8 @@
             addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(queryMap["format"].first, unittest.equals(arg_format));
+        unittest.expect(queryMap["metadataHeaders"], unittest.equals(arg_metadataHeaders));
 
 
         var h = {
@@ -1973,7 +1990,7 @@
         var resp = convert.JSON.encode(buildThread());
         return new async.Future.value(common_test.stringResponse(200, h, resp));
       }), true);
-      res.get(arg_userId, arg_id).then(unittest.expectAsync(((api.Thread response) {
+      res.get(arg_userId, arg_id, format: arg_format, metadataHeaders: arg_metadataHeaders).then(unittest.expectAsync(((api.Thread response) {
         checkThread(response);
       })));
     });
@@ -1984,7 +2001,7 @@
       api.UsersThreadsResourceApi res = new api.GmailApi(mock).users.threads;
       var arg_userId = "foo";
       var arg_includeSpamTrash = true;
-      var arg_labelIds = buildUnnamed179();
+      var arg_labelIds = buildUnnamed866();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_q = "foo";
diff --git a/generated/googleapis/test/identitytoolkit/v3_test.dart b/generated/googleapis/test/identitytoolkit/v3_test.dart
index d559021..058a1b9 100644
--- a/generated/googleapis/test/identitytoolkit/v3_test.dart
+++ b/generated/googleapis/test/identitytoolkit/v3_test.dart
@@ -64,14 +64,14 @@
   buildCounterDeleteAccountResponse--;
 }
 
-buildUnnamed971() {
+buildUnnamed867() {
   var o = new core.List<api.UserInfo>();
   o.add(buildUserInfo());
   o.add(buildUserInfo());
   return o;
 }
 
-checkUnnamed971(core.List<api.UserInfo> o) {
+checkUnnamed867(core.List<api.UserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserInfo(o[0]);
   checkUserInfo(o[1]);
@@ -84,7 +84,7 @@
   if (buildCounterDownloadAccountResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.users = buildUnnamed971();
+    o.users = buildUnnamed867();
   }
   buildCounterDownloadAccountResponse--;
   return o;
@@ -95,19 +95,19 @@
   if (buildCounterDownloadAccountResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed971(o.users);
+    checkUnnamed867(o.users);
   }
   buildCounterDownloadAccountResponse--;
 }
 
-buildUnnamed972() {
+buildUnnamed868() {
   var o = new core.List<api.UserInfo>();
   o.add(buildUserInfo());
   o.add(buildUserInfo());
   return o;
 }
 
-checkUnnamed972(core.List<api.UserInfo> o) {
+checkUnnamed868(core.List<api.UserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserInfo(o[0]);
   checkUserInfo(o[1]);
@@ -119,7 +119,7 @@
   buildCounterGetAccountInfoResponse++;
   if (buildCounterGetAccountInfoResponse < 3) {
     o.kind = "foo";
-    o.users = buildUnnamed972();
+    o.users = buildUnnamed868();
   }
   buildCounterGetAccountInfoResponse--;
   return o;
@@ -129,7 +129,7 @@
   buildCounterGetAccountInfoResponse++;
   if (buildCounterGetAccountInfoResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed972(o.users);
+    checkUnnamed868(o.users);
   }
   buildCounterGetAccountInfoResponse--;
 }
@@ -228,27 +228,27 @@
   buildCounterIdentitytoolkitRelyingpartyDownloadAccountRequest--;
 }
 
-buildUnnamed973() {
+buildUnnamed869() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed973(core.List<core.String> o) {
+checkUnnamed869(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed974() {
+buildUnnamed870() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed974(core.List<core.String> o) {
+checkUnnamed870(core.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,9 +259,9 @@
   var o = new api.IdentitytoolkitRelyingpartyGetAccountInfoRequest();
   buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest++;
   if (buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest < 3) {
-    o.email = buildUnnamed973();
+    o.email = buildUnnamed869();
     o.idToken = "foo";
-    o.localId = buildUnnamed974();
+    o.localId = buildUnnamed870();
   }
   buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest--;
   return o;
@@ -270,9 +270,9 @@
 checkIdentitytoolkitRelyingpartyGetAccountInfoRequest(api.IdentitytoolkitRelyingpartyGetAccountInfoRequest o) {
   buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest++;
   if (buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest < 3) {
-    checkUnnamed973(o.email);
+    checkUnnamed869(o.email);
     unittest.expect(o.idToken, unittest.equals('foo'));
-    checkUnnamed974(o.localId);
+    checkUnnamed870(o.localId);
   }
   buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest--;
 }
@@ -315,14 +315,14 @@
   buildCounterIdentitytoolkitRelyingpartyResetPasswordRequest--;
 }
 
-buildUnnamed975() {
+buildUnnamed871() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed975(core.List<core.String> o) {
+checkUnnamed871(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -342,7 +342,7 @@
     o.localId = "foo";
     o.oobCode = "foo";
     o.password = "foo";
-    o.provider = buildUnnamed975();
+    o.provider = buildUnnamed871();
     o.upgradeToFederatedLogin = true;
   }
   buildCounterIdentitytoolkitRelyingpartySetAccountInfoRequest--;
@@ -361,20 +361,20 @@
     unittest.expect(o.localId, unittest.equals('foo'));
     unittest.expect(o.oobCode, unittest.equals('foo'));
     unittest.expect(o.password, unittest.equals('foo'));
-    checkUnnamed975(o.provider);
+    checkUnnamed871(o.provider);
     unittest.expect(o.upgradeToFederatedLogin, unittest.isTrue);
   }
   buildCounterIdentitytoolkitRelyingpartySetAccountInfoRequest--;
 }
 
-buildUnnamed976() {
+buildUnnamed872() {
   var o = new core.List<api.UserInfo>();
   o.add(buildUserInfo());
   o.add(buildUserInfo());
   return o;
 }
 
-checkUnnamed976(core.List<api.UserInfo> o) {
+checkUnnamed872(core.List<api.UserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserInfo(o[0]);
   checkUserInfo(o[1]);
@@ -390,7 +390,7 @@
     o.rounds = 42;
     o.saltSeparator = "foo";
     o.signerKey = "foo";
-    o.users = buildUnnamed976();
+    o.users = buildUnnamed872();
   }
   buildCounterIdentitytoolkitRelyingpartyUploadAccountRequest--;
   return o;
@@ -404,7 +404,7 @@
     unittest.expect(o.rounds, unittest.equals(42));
     unittest.expect(o.saltSeparator, unittest.equals('foo'));
     unittest.expect(o.signerKey, unittest.equals('foo'));
-    checkUnnamed976(o.users);
+    checkUnnamed872(o.users);
   }
   buildCounterIdentitytoolkitRelyingpartyUploadAccountRequest--;
 }
@@ -536,14 +536,14 @@
   buildCounterSetAccountInfoResponseProviderUserInfo--;
 }
 
-buildUnnamed977() {
+buildUnnamed873() {
   var o = new core.List<api.SetAccountInfoResponseProviderUserInfo>();
   o.add(buildSetAccountInfoResponseProviderUserInfo());
   o.add(buildSetAccountInfoResponseProviderUserInfo());
   return o;
 }
 
-checkUnnamed977(core.List<api.SetAccountInfoResponseProviderUserInfo> o) {
+checkUnnamed873(core.List<api.SetAccountInfoResponseProviderUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSetAccountInfoResponseProviderUserInfo(o[0]);
   checkSetAccountInfoResponseProviderUserInfo(o[1]);
@@ -558,7 +558,7 @@
     o.email = "foo";
     o.idToken = "foo";
     o.kind = "foo";
-    o.providerUserInfo = buildUnnamed977();
+    o.providerUserInfo = buildUnnamed873();
   }
   buildCounterSetAccountInfoResponse--;
   return o;
@@ -571,7 +571,7 @@
     unittest.expect(o.email, unittest.equals('foo'));
     unittest.expect(o.idToken, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed977(o.providerUserInfo);
+    checkUnnamed873(o.providerUserInfo);
   }
   buildCounterSetAccountInfoResponse--;
 }
@@ -597,14 +597,14 @@
   buildCounterUploadAccountResponseError--;
 }
 
-buildUnnamed978() {
+buildUnnamed874() {
   var o = new core.List<api.UploadAccountResponseError>();
   o.add(buildUploadAccountResponseError());
   o.add(buildUploadAccountResponseError());
   return o;
 }
 
-checkUnnamed978(core.List<api.UploadAccountResponseError> o) {
+checkUnnamed874(core.List<api.UploadAccountResponseError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUploadAccountResponseError(o[0]);
   checkUploadAccountResponseError(o[1]);
@@ -615,7 +615,7 @@
   var o = new api.UploadAccountResponse();
   buildCounterUploadAccountResponse++;
   if (buildCounterUploadAccountResponse < 3) {
-    o.error = buildUnnamed978();
+    o.error = buildUnnamed874();
     o.kind = "foo";
   }
   buildCounterUploadAccountResponse--;
@@ -625,7 +625,7 @@
 checkUploadAccountResponse(api.UploadAccountResponse o) {
   buildCounterUploadAccountResponse++;
   if (buildCounterUploadAccountResponse < 3) {
-    checkUnnamed978(o.error);
+    checkUnnamed874(o.error);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterUploadAccountResponse--;
@@ -656,14 +656,14 @@
   buildCounterUserInfoProviderUserInfo--;
 }
 
-buildUnnamed979() {
+buildUnnamed875() {
   var o = new core.List<api.UserInfoProviderUserInfo>();
   o.add(buildUserInfoProviderUserInfo());
   o.add(buildUserInfoProviderUserInfo());
   return o;
 }
 
-checkUnnamed979(core.List<api.UserInfoProviderUserInfo> o) {
+checkUnnamed875(core.List<api.UserInfoProviderUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserInfoProviderUserInfo(o[0]);
   checkUserInfoProviderUserInfo(o[1]);
@@ -681,7 +681,7 @@
     o.passwordHash = "foo";
     o.passwordUpdatedAt = 42.0;
     o.photoUrl = "foo";
-    o.providerUserInfo = buildUnnamed979();
+    o.providerUserInfo = buildUnnamed875();
     o.salt = "foo";
     o.version = 42;
   }
@@ -699,21 +699,21 @@
     unittest.expect(o.passwordHash, unittest.equals('foo'));
     unittest.expect(o.passwordUpdatedAt, unittest.equals(42.0));
     unittest.expect(o.photoUrl, unittest.equals('foo'));
-    checkUnnamed979(o.providerUserInfo);
+    checkUnnamed875(o.providerUserInfo);
     unittest.expect(o.salt, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals(42));
   }
   buildCounterUserInfo--;
 }
 
-buildUnnamed980() {
+buildUnnamed876() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed980(core.List<core.String> o) {
+checkUnnamed876(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -750,7 +750,7 @@
     o.photoUrl = "foo";
     o.providerId = "foo";
     o.timeZone = "foo";
-    o.verifiedProvider = buildUnnamed980();
+    o.verifiedProvider = buildUnnamed876();
   }
   buildCounterVerifyAssertionResponse--;
   return o;
@@ -785,7 +785,7 @@
     unittest.expect(o.photoUrl, unittest.equals('foo'));
     unittest.expect(o.providerId, unittest.equals('foo'));
     unittest.expect(o.timeZone, unittest.equals('foo'));
-    checkUnnamed980(o.verifiedProvider);
+    checkUnnamed876(o.verifiedProvider);
   }
   buildCounterVerifyAssertionResponse--;
 }
diff --git a/generated/googleapis/test/licensing/v1_test.dart b/generated/googleapis/test/licensing/v1_test.dart
index 722a59d..70bceb9 100644
--- a/generated/googleapis/test/licensing/v1_test.dart
+++ b/generated/googleapis/test/licensing/v1_test.dart
@@ -64,14 +64,14 @@
   buildCounterLicenseAssignmentInsert--;
 }
 
-buildUnnamed872() {
+buildUnnamed877() {
   var o = new core.List<api.LicenseAssignment>();
   o.add(buildLicenseAssignment());
   o.add(buildLicenseAssignment());
   return o;
 }
 
-checkUnnamed872(core.List<api.LicenseAssignment> o) {
+checkUnnamed877(core.List<api.LicenseAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLicenseAssignment(o[0]);
   checkLicenseAssignment(o[1]);
@@ -83,7 +83,7 @@
   buildCounterLicenseAssignmentList++;
   if (buildCounterLicenseAssignmentList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed872();
+    o.items = buildUnnamed877();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -95,7 +95,7 @@
   buildCounterLicenseAssignmentList++;
   if (buildCounterLicenseAssignmentList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed872(o.items);
+    checkUnnamed877(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
diff --git a/generated/googleapis/test/mapsengine/v1_test.dart b/generated/googleapis/test/mapsengine/v1_test.dart
index ac2f2ce..004b738 100644
--- a/generated/googleapis/test/mapsengine/v1_test.dart
+++ b/generated/googleapis/test/mapsengine/v1_test.dart
@@ -39,27 +39,27 @@
   buildCounterAcquisitionTime--;
 }
 
-buildUnnamed91() {
+buildUnnamed878() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed91(core.List<core.double> o) {
+checkUnnamed878(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));
 }
 
-buildUnnamed92() {
+buildUnnamed879() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed92(core.List<core.String> o) {
+checkUnnamed879(core.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 +70,7 @@
   var o = new api.Asset();
   buildCounterAsset++;
   if (buildCounterAsset < 3) {
-    o.bbox = buildUnnamed91();
+    o.bbox = buildUnnamed878();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.creatorEmail = "foo";
     o.description = "foo";
@@ -81,7 +81,7 @@
     o.name = "foo";
     o.projectId = "foo";
     o.resource = "foo";
-    o.tags = buildUnnamed92();
+    o.tags = buildUnnamed879();
     o.type = "foo";
     o.writersCanEditPermissions = true;
   }
@@ -92,7 +92,7 @@
 checkAsset(api.Asset o) {
   buildCounterAsset++;
   if (buildCounterAsset < 3) {
-    checkUnnamed91(o.bbox);
+    checkUnnamed878(o.bbox);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.creatorEmail, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
@@ -103,21 +103,21 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.resource, unittest.equals('foo'));
-    checkUnnamed92(o.tags);
+    checkUnnamed879(o.tags);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.writersCanEditPermissions, unittest.isTrue);
   }
   buildCounterAsset--;
 }
 
-buildUnnamed93() {
+buildUnnamed880() {
   var o = new core.List<api.Asset>();
   o.add(buildAsset());
   o.add(buildAsset());
   return o;
 }
 
-checkUnnamed93(core.List<api.Asset> o) {
+checkUnnamed880(core.List<api.Asset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAsset(o[0]);
   checkAsset(o[1]);
@@ -128,7 +128,7 @@
   var o = new api.AssetsListResponse();
   buildCounterAssetsListResponse++;
   if (buildCounterAssetsListResponse < 3) {
-    o.assets = buildUnnamed93();
+    o.assets = buildUnnamed880();
     o.nextPageToken = "foo";
   }
   buildCounterAssetsListResponse--;
@@ -138,7 +138,7 @@
 checkAssetsListResponse(api.AssetsListResponse o) {
   buildCounterAssetsListResponse++;
   if (buildCounterAssetsListResponse < 3) {
-    checkUnnamed93(o.assets);
+    checkUnnamed880(o.assets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterAssetsListResponse--;
@@ -220,14 +220,14 @@
   checkDatasource(o[1]);
 }
 
-buildUnnamed94() {
+buildUnnamed881() {
   var o = new core.List<api.Filter>();
   o.add(buildFilter());
   o.add(buildFilter());
   return o;
 }
 
-checkUnnamed94(core.List<api.Filter> o) {
+checkUnnamed881(core.List<api.Filter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilter(o[0]);
   checkFilter(o[1]);
@@ -238,7 +238,7 @@
   var o = new api.DisplayRule();
   buildCounterDisplayRule++;
   if (buildCounterDisplayRule < 3) {
-    o.filters = buildUnnamed94();
+    o.filters = buildUnnamed881();
     o.lineOptions = buildLineStyle();
     o.name = "foo";
     o.pointOptions = buildPointStyle();
@@ -252,7 +252,7 @@
 checkDisplayRule(api.DisplayRule o) {
   buildCounterDisplayRule++;
   if (buildCounterDisplayRule < 3) {
-    checkUnnamed94(o.filters);
+    checkUnnamed881(o.filters);
     checkLineStyle(o.lineOptions);
     unittest.expect(o.name, unittest.equals('foo'));
     checkPointStyle(o.pointOptions);
@@ -304,27 +304,27 @@
   buildCounterFeatureInfo--;
 }
 
-buildUnnamed95() {
+buildUnnamed882() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed95(core.List<core.String> o) {
+checkUnnamed882(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed96() {
+buildUnnamed883() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed96(core.List<core.String> o) {
+checkUnnamed883(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -335,8 +335,8 @@
   var o = new api.FeaturesBatchDeleteRequest();
   buildCounterFeaturesBatchDeleteRequest++;
   if (buildCounterFeaturesBatchDeleteRequest < 3) {
-    o.gxIds = buildUnnamed95();
-    o.primaryKeys = buildUnnamed96();
+    o.gxIds = buildUnnamed882();
+    o.primaryKeys = buildUnnamed883();
   }
   buildCounterFeaturesBatchDeleteRequest--;
   return o;
@@ -345,20 +345,20 @@
 checkFeaturesBatchDeleteRequest(api.FeaturesBatchDeleteRequest o) {
   buildCounterFeaturesBatchDeleteRequest++;
   if (buildCounterFeaturesBatchDeleteRequest < 3) {
-    checkUnnamed95(o.gxIds);
-    checkUnnamed96(o.primaryKeys);
+    checkUnnamed882(o.gxIds);
+    checkUnnamed883(o.primaryKeys);
   }
   buildCounterFeaturesBatchDeleteRequest--;
 }
 
-buildUnnamed97() {
+buildUnnamed884() {
   var o = new core.List<api.Feature>();
   o.add(buildFeature());
   o.add(buildFeature());
   return o;
 }
 
-checkUnnamed97(core.List<api.Feature> o) {
+checkUnnamed884(core.List<api.Feature> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFeature(o[0]);
   checkFeature(o[1]);
@@ -369,7 +369,7 @@
   var o = new api.FeaturesBatchInsertRequest();
   buildCounterFeaturesBatchInsertRequest++;
   if (buildCounterFeaturesBatchInsertRequest < 3) {
-    o.features = buildUnnamed97();
+    o.features = buildUnnamed884();
     o.normalizeGeometries = true;
   }
   buildCounterFeaturesBatchInsertRequest--;
@@ -379,20 +379,20 @@
 checkFeaturesBatchInsertRequest(api.FeaturesBatchInsertRequest o) {
   buildCounterFeaturesBatchInsertRequest++;
   if (buildCounterFeaturesBatchInsertRequest < 3) {
-    checkUnnamed97(o.features);
+    checkUnnamed884(o.features);
     unittest.expect(o.normalizeGeometries, unittest.isTrue);
   }
   buildCounterFeaturesBatchInsertRequest--;
 }
 
-buildUnnamed98() {
+buildUnnamed885() {
   var o = new core.List<api.Feature>();
   o.add(buildFeature());
   o.add(buildFeature());
   return o;
 }
 
-checkUnnamed98(core.List<api.Feature> o) {
+checkUnnamed885(core.List<api.Feature> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFeature(o[0]);
   checkFeature(o[1]);
@@ -403,7 +403,7 @@
   var o = new api.FeaturesBatchPatchRequest();
   buildCounterFeaturesBatchPatchRequest++;
   if (buildCounterFeaturesBatchPatchRequest < 3) {
-    o.features = buildUnnamed98();
+    o.features = buildUnnamed885();
     o.normalizeGeometries = true;
   }
   buildCounterFeaturesBatchPatchRequest--;
@@ -413,20 +413,20 @@
 checkFeaturesBatchPatchRequest(api.FeaturesBatchPatchRequest o) {
   buildCounterFeaturesBatchPatchRequest++;
   if (buildCounterFeaturesBatchPatchRequest < 3) {
-    checkUnnamed98(o.features);
+    checkUnnamed885(o.features);
     unittest.expect(o.normalizeGeometries, unittest.isTrue);
   }
   buildCounterFeaturesBatchPatchRequest--;
 }
 
-buildUnnamed99() {
+buildUnnamed886() {
   var o = new core.List<api.Feature>();
   o.add(buildFeature());
   o.add(buildFeature());
   return o;
 }
 
-checkUnnamed99(core.List<api.Feature> o) {
+checkUnnamed886(core.List<api.Feature> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFeature(o[0]);
   checkFeature(o[1]);
@@ -438,7 +438,7 @@
   buildCounterFeaturesListResponse++;
   if (buildCounterFeaturesListResponse < 3) {
     o.allowedQueriesPerSecond = 42.0;
-    o.features = buildUnnamed99();
+    o.features = buildUnnamed886();
     o.nextPageToken = "foo";
     o.schema = buildSchema();
     o.type = "foo";
@@ -451,7 +451,7 @@
   buildCounterFeaturesListResponse++;
   if (buildCounterFeaturesListResponse < 3) {
     unittest.expect(o.allowedQueriesPerSecond, unittest.equals(42.0));
-    checkUnnamed99(o.features);
+    checkUnnamed886(o.features);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkSchema(o.schema);
     unittest.expect(o.type, unittest.equals('foo'));
@@ -513,7 +513,7 @@
   checkGeoJsonGeometryCollection(api.GeoJsonGeometryCollection o) {
   buildCounterGeoJsonGeometryCollection++;
   if (buildCounterGeoJsonGeometryCollection < 3) {
-    checkUnnamed100(o.geometries);
+    checkUnnamed887(o.geometries);
   }
   buildCounterGeoJsonGeometryCollection--;
 }
@@ -521,14 +521,14 @@
 (o);
 }
 
-buildUnnamed100() {
+buildUnnamed887() {
   var o = new core.List<api.GeoJsonGeometry>();
   o.add(buildGeoJsonGeometry());
   o.add(buildGeoJsonGeometry());
   return o;
 }
 
-checkUnnamed100(core.List<api.GeoJsonGeometry> o) {
+checkUnnamed887(core.List<api.GeoJsonGeometry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeoJsonGeometry(o[0]);
   checkGeoJsonGeometry(o[1]);
@@ -539,7 +539,7 @@
   var o = new api.GeoJsonGeometryCollection();
   buildCounterGeoJsonGeometryCollection++;
   if (buildCounterGeoJsonGeometryCollection < 3) {
-    o.geometries = buildUnnamed100();
+    o.geometries = buildUnnamed887();
   }
   buildCounterGeoJsonGeometryCollection--;
   return o;
@@ -548,19 +548,19 @@
 checkGeoJsonGeometryCollection(api.GeoJsonGeometryCollection o) {
   buildCounterGeoJsonGeometryCollection++;
   if (buildCounterGeoJsonGeometryCollection < 3) {
-    checkUnnamed100(o.geometries);
+    checkUnnamed887(o.geometries);
   }
   buildCounterGeoJsonGeometryCollection--;
 }
 
-buildUnnamed101() {
+buildUnnamed888() {
   var o = new core.List<api.GeoJsonPosition>();
   o.add(buildGeoJsonPosition());
   o.add(buildGeoJsonPosition());
   return o;
 }
 
-checkUnnamed101(core.List<api.GeoJsonPosition> o) {
+checkUnnamed888(core.List<api.GeoJsonPosition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeoJsonPosition(o[0]);
   checkGeoJsonPosition(o[1]);
@@ -571,7 +571,7 @@
   var o = new api.GeoJsonLineString();
   buildCounterGeoJsonLineString++;
   if (buildCounterGeoJsonLineString < 3) {
-    o.coordinates = buildUnnamed101();
+    o.coordinates = buildUnnamed888();
   }
   buildCounterGeoJsonLineString--;
   return o;
@@ -580,35 +580,35 @@
 checkGeoJsonLineString(api.GeoJsonLineString o) {
   buildCounterGeoJsonLineString++;
   if (buildCounterGeoJsonLineString < 3) {
-    checkUnnamed101(o.coordinates);
+    checkUnnamed888(o.coordinates);
   }
   buildCounterGeoJsonLineString--;
 }
 
-buildUnnamed102() {
+buildUnnamed889() {
   var o = new core.List<api.GeoJsonPosition>();
   o.add(buildGeoJsonPosition());
   o.add(buildGeoJsonPosition());
   return o;
 }
 
-checkUnnamed102(core.List<api.GeoJsonPosition> o) {
+checkUnnamed889(core.List<api.GeoJsonPosition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeoJsonPosition(o[0]);
   checkGeoJsonPosition(o[1]);
 }
 
-buildUnnamed103() {
+buildUnnamed890() {
   var o = new core.List<core.List<api.GeoJsonPosition>>();
-  o.add(buildUnnamed102());
-  o.add(buildUnnamed102());
+  o.add(buildUnnamed889());
+  o.add(buildUnnamed889());
   return o;
 }
 
-checkUnnamed103(core.List<core.List<api.GeoJsonPosition>> o) {
+checkUnnamed890(core.List<core.List<api.GeoJsonPosition>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed102(o[0]);
-  checkUnnamed102(o[1]);
+  checkUnnamed889(o[0]);
+  checkUnnamed889(o[1]);
 }
 
 core.int buildCounterGeoJsonMultiLineString = 0;
@@ -616,7 +616,7 @@
   var o = new api.GeoJsonMultiLineString();
   buildCounterGeoJsonMultiLineString++;
   if (buildCounterGeoJsonMultiLineString < 3) {
-    o.coordinates = buildUnnamed103();
+    o.coordinates = buildUnnamed890();
   }
   buildCounterGeoJsonMultiLineString--;
   return o;
@@ -625,19 +625,19 @@
 checkGeoJsonMultiLineString(api.GeoJsonMultiLineString o) {
   buildCounterGeoJsonMultiLineString++;
   if (buildCounterGeoJsonMultiLineString < 3) {
-    checkUnnamed103(o.coordinates);
+    checkUnnamed890(o.coordinates);
   }
   buildCounterGeoJsonMultiLineString--;
 }
 
-buildUnnamed104() {
+buildUnnamed891() {
   var o = new core.List<api.GeoJsonPosition>();
   o.add(buildGeoJsonPosition());
   o.add(buildGeoJsonPosition());
   return o;
 }
 
-checkUnnamed104(core.List<api.GeoJsonPosition> o) {
+checkUnnamed891(core.List<api.GeoJsonPosition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeoJsonPosition(o[0]);
   checkGeoJsonPosition(o[1]);
@@ -648,7 +648,7 @@
   var o = new api.GeoJsonMultiPoint();
   buildCounterGeoJsonMultiPoint++;
   if (buildCounterGeoJsonMultiPoint < 3) {
-    o.coordinates = buildUnnamed104();
+    o.coordinates = buildUnnamed891();
   }
   buildCounterGeoJsonMultiPoint--;
   return o;
@@ -657,48 +657,48 @@
 checkGeoJsonMultiPoint(api.GeoJsonMultiPoint o) {
   buildCounterGeoJsonMultiPoint++;
   if (buildCounterGeoJsonMultiPoint < 3) {
-    checkUnnamed104(o.coordinates);
+    checkUnnamed891(o.coordinates);
   }
   buildCounterGeoJsonMultiPoint--;
 }
 
-buildUnnamed105() {
+buildUnnamed892() {
   var o = new core.List<api.GeoJsonPosition>();
   o.add(buildGeoJsonPosition());
   o.add(buildGeoJsonPosition());
   return o;
 }
 
-checkUnnamed105(core.List<api.GeoJsonPosition> o) {
+checkUnnamed892(core.List<api.GeoJsonPosition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeoJsonPosition(o[0]);
   checkGeoJsonPosition(o[1]);
 }
 
-buildUnnamed106() {
+buildUnnamed893() {
   var o = new core.List<core.List<api.GeoJsonPosition>>();
-  o.add(buildUnnamed105());
-  o.add(buildUnnamed105());
+  o.add(buildUnnamed892());
+  o.add(buildUnnamed892());
   return o;
 }
 
-checkUnnamed106(core.List<core.List<api.GeoJsonPosition>> o) {
+checkUnnamed893(core.List<core.List<api.GeoJsonPosition>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed105(o[0]);
-  checkUnnamed105(o[1]);
+  checkUnnamed892(o[0]);
+  checkUnnamed892(o[1]);
 }
 
-buildUnnamed107() {
+buildUnnamed894() {
   var o = new core.List<core.List<core.List<api.GeoJsonPosition>>>();
-  o.add(buildUnnamed106());
-  o.add(buildUnnamed106());
+  o.add(buildUnnamed893());
+  o.add(buildUnnamed893());
   return o;
 }
 
-checkUnnamed107(core.List<core.List<core.List<api.GeoJsonPosition>>> o) {
+checkUnnamed894(core.List<core.List<core.List<api.GeoJsonPosition>>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed106(o[0]);
-  checkUnnamed106(o[1]);
+  checkUnnamed893(o[0]);
+  checkUnnamed893(o[1]);
 }
 
 core.int buildCounterGeoJsonMultiPolygon = 0;
@@ -706,7 +706,7 @@
   var o = new api.GeoJsonMultiPolygon();
   buildCounterGeoJsonMultiPolygon++;
   if (buildCounterGeoJsonMultiPolygon < 3) {
-    o.coordinates = buildUnnamed107();
+    o.coordinates = buildUnnamed894();
   }
   buildCounterGeoJsonMultiPolygon--;
   return o;
@@ -715,7 +715,7 @@
 checkGeoJsonMultiPolygon(api.GeoJsonMultiPolygon o) {
   buildCounterGeoJsonMultiPolygon++;
   if (buildCounterGeoJsonMultiPolygon < 3) {
-    checkUnnamed107(o.coordinates);
+    checkUnnamed894(o.coordinates);
   }
   buildCounterGeoJsonMultiPolygon--;
 }
@@ -739,30 +739,30 @@
   buildCounterGeoJsonPoint--;
 }
 
-buildUnnamed108() {
+buildUnnamed895() {
   var o = new core.List<api.GeoJsonPosition>();
   o.add(buildGeoJsonPosition());
   o.add(buildGeoJsonPosition());
   return o;
 }
 
-checkUnnamed108(core.List<api.GeoJsonPosition> o) {
+checkUnnamed895(core.List<api.GeoJsonPosition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeoJsonPosition(o[0]);
   checkGeoJsonPosition(o[1]);
 }
 
-buildUnnamed109() {
+buildUnnamed896() {
   var o = new core.List<core.List<api.GeoJsonPosition>>();
-  o.add(buildUnnamed108());
-  o.add(buildUnnamed108());
+  o.add(buildUnnamed895());
+  o.add(buildUnnamed895());
   return o;
 }
 
-checkUnnamed109(core.List<core.List<api.GeoJsonPosition>> o) {
+checkUnnamed896(core.List<core.List<api.GeoJsonPosition>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed108(o[0]);
-  checkUnnamed108(o[1]);
+  checkUnnamed895(o[0]);
+  checkUnnamed895(o[1]);
 }
 
 core.int buildCounterGeoJsonPolygon = 0;
@@ -770,7 +770,7 @@
   var o = new api.GeoJsonPolygon();
   buildCounterGeoJsonPolygon++;
   if (buildCounterGeoJsonPolygon < 3) {
-    o.coordinates = buildUnnamed109();
+    o.coordinates = buildUnnamed896();
   }
   buildCounterGeoJsonPolygon--;
   return o;
@@ -779,7 +779,7 @@
 checkGeoJsonPolygon(api.GeoJsonPolygon o) {
   buildCounterGeoJsonPolygon++;
   if (buildCounterGeoJsonPolygon < 3) {
-    checkUnnamed109(o.coordinates);
+    checkUnnamed896(o.coordinates);
   }
   buildCounterGeoJsonPolygon--;
 }
@@ -858,14 +858,14 @@
   buildCounterIconStyle--;
 }
 
-buildUnnamed110() {
+buildUnnamed897() {
   var o = new core.List<api.Icon>();
   o.add(buildIcon());
   o.add(buildIcon());
   return o;
 }
 
-checkUnnamed110(core.List<api.Icon> o) {
+checkUnnamed897(core.List<api.Icon> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkIcon(o[0]);
   checkIcon(o[1]);
@@ -876,7 +876,7 @@
   var o = new api.IconsListResponse();
   buildCounterIconsListResponse++;
   if (buildCounterIconsListResponse < 3) {
-    o.icons = buildUnnamed110();
+    o.icons = buildUnnamed897();
     o.nextPageToken = "foo";
   }
   buildCounterIconsListResponse--;
@@ -886,7 +886,7 @@
 checkIconsListResponse(api.IconsListResponse o) {
   buildCounterIconsListResponse++;
   if (buildCounterIconsListResponse < 3) {
-    checkUnnamed110(o.icons);
+    checkUnnamed897(o.icons);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterIconsListResponse--;
@@ -936,14 +936,14 @@
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed111() {
+buildUnnamed898() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed111(core.List<core.double> o) {
+checkUnnamed898(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));
@@ -954,7 +954,7 @@
   var o = new api.Layer();
   buildCounterLayer++;
   if (buildCounterLayer < 3) {
-    o.bbox = buildUnnamed111();
+    o.bbox = buildUnnamed898();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.creatorEmail = "foo";
     o.datasourceType = "foo";
@@ -982,7 +982,7 @@
 checkLayer(api.Layer o) {
   buildCounterLayer++;
   if (buildCounterLayer < 3) {
-    checkUnnamed111(o.bbox);
+    checkUnnamed898(o.bbox);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.creatorEmail, unittest.equals('foo'));
     unittest.expect(o.datasourceType, unittest.equals('foo'));
@@ -1006,14 +1006,14 @@
   buildCounterLayer--;
 }
 
-buildUnnamed112() {
+buildUnnamed899() {
   var o = new core.List<api.Layer>();
   o.add(buildLayer());
   o.add(buildLayer());
   return o;
 }
 
-checkUnnamed112(core.List<api.Layer> o) {
+checkUnnamed899(core.List<api.Layer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLayer(o[0]);
   checkLayer(o[1]);
@@ -1024,7 +1024,7 @@
   var o = new api.LayersListResponse();
   buildCounterLayersListResponse++;
   if (buildCounterLayersListResponse < 3) {
-    o.layers = buildUnnamed112();
+    o.layers = buildUnnamed899();
     o.nextPageToken = "foo";
   }
   buildCounterLayersListResponse--;
@@ -1034,20 +1034,20 @@
 checkLayersListResponse(api.LayersListResponse o) {
   buildCounterLayersListResponse++;
   if (buildCounterLayersListResponse < 3) {
-    checkUnnamed112(o.layers);
+    checkUnnamed899(o.layers);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterLayersListResponse--;
 }
 
-buildUnnamed113() {
+buildUnnamed900() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed113(core.List<core.double> o) {
+checkUnnamed900(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));
@@ -1082,7 +1082,7 @@
   buildCounterLineStyle++;
   if (buildCounterLineStyle < 3) {
     o.border = buildBorder();
-    o.dash = buildUnnamed113();
+    o.dash = buildUnnamed900();
     o.label = buildLabelStyle();
     o.stroke = buildLineStyleStroke();
   }
@@ -1094,34 +1094,34 @@
   buildCounterLineStyle++;
   if (buildCounterLineStyle < 3) {
     checkBorder(o.border);
-    checkUnnamed113(o.dash);
+    checkUnnamed900(o.dash);
     checkLabelStyle(o.label);
     checkLineStyleStroke(o.stroke);
   }
   buildCounterLineStyle--;
 }
 
-buildUnnamed114() {
+buildUnnamed901() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed114(core.List<core.double> o) {
+checkUnnamed901(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));
 }
 
-buildUnnamed115() {
+buildUnnamed902() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed115(core.List<core.String> o) {
+checkUnnamed902(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1132,7 +1132,7 @@
   var o = new api.Map();
   buildCounterMap++;
   if (buildCounterMap < 3) {
-    o.bbox = buildUnnamed114();
+    o.bbox = buildUnnamed901();
     o.contents = buildMapContents();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.creatorEmail = "foo";
@@ -1149,7 +1149,7 @@
     o.publishedAccessList = "foo";
     o.publishingStatus = "foo";
     o.tags = buildTags();
-    o.versions = buildUnnamed115();
+    o.versions = buildUnnamed902();
     o.writersCanEditPermissions = true;
   }
   buildCounterMap--;
@@ -1159,7 +1159,7 @@
 checkMap(api.Map o) {
   buildCounterMap++;
   if (buildCounterMap < 3) {
-    checkUnnamed114(o.bbox);
+    checkUnnamed901(o.bbox);
     checkMapContents(o.contents);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.creatorEmail, unittest.equals('foo'));
@@ -1176,7 +1176,7 @@
     unittest.expect(o.publishedAccessList, unittest.equals('foo'));
     unittest.expect(o.publishingStatus, unittest.equals('foo'));
     checkTags(o.tags);
-    checkUnnamed115(o.versions);
+    checkUnnamed902(o.versions);
     unittest.expect(o.writersCanEditPermissions, unittest.isTrue);
   }
   buildCounterMap--;
@@ -1195,27 +1195,27 @@
   checkMapItem(o[1]);
 }
 
-buildUnnamed116() {
+buildUnnamed903() {
   var o = new core.List<api.MapItem>();
   o.add(buildMapItem());
   o.add(buildMapItem());
   return o;
 }
 
-checkUnnamed116(core.List<api.MapItem> o) {
+checkUnnamed903(core.List<api.MapItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMapItem(o[0]);
   checkMapItem(o[1]);
 }
 
-buildUnnamed117() {
+buildUnnamed904() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed117(core.List<core.double> o) {
+checkUnnamed904(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));
@@ -1226,8 +1226,8 @@
   var o = new api.MapFolder();
   buildCounterMapFolder++;
   if (buildCounterMapFolder < 3) {
-    o.contents = buildUnnamed116();
-    o.defaultViewport = buildUnnamed117();
+    o.contents = buildUnnamed903();
+    o.defaultViewport = buildUnnamed904();
     o.expandable = true;
     o.key = "foo";
     o.name = "foo";
@@ -1240,8 +1240,8 @@
 checkMapFolder(api.MapFolder o) {
   buildCounterMapFolder++;
   if (buildCounterMapFolder < 3) {
-    checkUnnamed116(o.contents);
-    checkUnnamed117(o.defaultViewport);
+    checkUnnamed903(o.contents);
+    checkUnnamed904(o.defaultViewport);
     unittest.expect(o.expandable, unittest.isTrue);
     unittest.expect(o.key, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -1258,8 +1258,8 @@
   checkMapFolder(api.MapFolder o) {
   buildCounterMapFolder++;
   if (buildCounterMapFolder < 3) {
-    checkUnnamed116(o.contents);
-    checkUnnamed117(o.defaultViewport);
+    checkUnnamed903(o.contents);
+    checkUnnamed904(o.defaultViewport);
     unittest.expect(o.expandable, unittest.isTrue);
     unittest.expect(o.key, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -1271,14 +1271,14 @@
 (o);
 }
 
-buildUnnamed118() {
+buildUnnamed905() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed118(core.List<core.double> o) {
+checkUnnamed905(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));
@@ -1289,7 +1289,7 @@
   var o = new api.MapKmlLink();
   buildCounterMapKmlLink++;
   if (buildCounterMapKmlLink < 3) {
-    o.defaultViewport = buildUnnamed118();
+    o.defaultViewport = buildUnnamed905();
     o.kmlUrl = "foo";
     o.name = "foo";
     o.visibility = "foo";
@@ -1301,7 +1301,7 @@
 checkMapKmlLink(api.MapKmlLink o) {
   buildCounterMapKmlLink++;
   if (buildCounterMapKmlLink < 3) {
-    checkUnnamed118(o.defaultViewport);
+    checkUnnamed905(o.defaultViewport);
     unittest.expect(o.kmlUrl, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.visibility, unittest.equals('foo'));
@@ -1309,14 +1309,14 @@
   buildCounterMapKmlLink--;
 }
 
-buildUnnamed119() {
+buildUnnamed906() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed119(core.List<core.double> o) {
+checkUnnamed906(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));
@@ -1327,7 +1327,7 @@
   var o = new api.MapLayer();
   buildCounterMapLayer++;
   if (buildCounterMapLayer < 3) {
-    o.defaultViewport = buildUnnamed119();
+    o.defaultViewport = buildUnnamed906();
     o.id = "foo";
     o.key = "foo";
     o.name = "foo";
@@ -1340,7 +1340,7 @@
 checkMapLayer(api.MapLayer o) {
   buildCounterMapLayer++;
   if (buildCounterMapLayer < 3) {
-    checkUnnamed119(o.defaultViewport);
+    checkUnnamed906(o.defaultViewport);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.key, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -1349,14 +1349,14 @@
   buildCounterMapLayer--;
 }
 
-buildUnnamed120() {
+buildUnnamed907() {
   var o = new core.List<api.Map>();
   o.add(buildMap());
   o.add(buildMap());
   return o;
 }
 
-checkUnnamed120(core.List<api.Map> o) {
+checkUnnamed907(core.List<api.Map> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMap(o[0]);
   checkMap(o[1]);
@@ -1367,7 +1367,7 @@
   var o = new api.MapsListResponse();
   buildCounterMapsListResponse++;
   if (buildCounterMapsListResponse < 3) {
-    o.maps = buildUnnamed120();
+    o.maps = buildUnnamed907();
     o.nextPageToken = "foo";
   }
   buildCounterMapsListResponse--;
@@ -1377,7 +1377,7 @@
 checkMapsListResponse(api.MapsListResponse o) {
   buildCounterMapsListResponse++;
   if (buildCounterMapsListResponse < 3) {
-    checkUnnamed120(o.maps);
+    checkUnnamed907(o.maps);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterMapsListResponse--;
@@ -1402,14 +1402,14 @@
   buildCounterParent--;
 }
 
-buildUnnamed121() {
+buildUnnamed908() {
   var o = new core.List<api.Parent>();
   o.add(buildParent());
   o.add(buildParent());
   return o;
 }
 
-checkUnnamed121(core.List<api.Parent> o) {
+checkUnnamed908(core.List<api.Parent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParent(o[0]);
   checkParent(o[1]);
@@ -1421,7 +1421,7 @@
   buildCounterParentsListResponse++;
   if (buildCounterParentsListResponse < 3) {
     o.nextPageToken = "foo";
-    o.parents = buildUnnamed121();
+    o.parents = buildUnnamed908();
   }
   buildCounterParentsListResponse--;
   return o;
@@ -1431,7 +1431,7 @@
   buildCounterParentsListResponse++;
   if (buildCounterParentsListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed121(o.parents);
+    checkUnnamed908(o.parents);
   }
   buildCounterParentsListResponse--;
 }
@@ -1461,14 +1461,14 @@
   buildCounterPermission--;
 }
 
-buildUnnamed122() {
+buildUnnamed909() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed122(core.List<core.String> o) {
+checkUnnamed909(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1479,7 +1479,7 @@
   var o = new api.PermissionsBatchDeleteRequest();
   buildCounterPermissionsBatchDeleteRequest++;
   if (buildCounterPermissionsBatchDeleteRequest < 3) {
-    o.ids = buildUnnamed122();
+    o.ids = buildUnnamed909();
   }
   buildCounterPermissionsBatchDeleteRequest--;
   return o;
@@ -1488,7 +1488,7 @@
 checkPermissionsBatchDeleteRequest(api.PermissionsBatchDeleteRequest o) {
   buildCounterPermissionsBatchDeleteRequest++;
   if (buildCounterPermissionsBatchDeleteRequest < 3) {
-    checkUnnamed122(o.ids);
+    checkUnnamed909(o.ids);
   }
   buildCounterPermissionsBatchDeleteRequest--;
 }
@@ -1510,14 +1510,14 @@
   buildCounterPermissionsBatchDeleteResponse--;
 }
 
-buildUnnamed123() {
+buildUnnamed910() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed123(core.List<api.Permission> o) {
+checkUnnamed910(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
@@ -1528,7 +1528,7 @@
   var o = new api.PermissionsBatchUpdateRequest();
   buildCounterPermissionsBatchUpdateRequest++;
   if (buildCounterPermissionsBatchUpdateRequest < 3) {
-    o.permissions = buildUnnamed123();
+    o.permissions = buildUnnamed910();
   }
   buildCounterPermissionsBatchUpdateRequest--;
   return o;
@@ -1537,7 +1537,7 @@
 checkPermissionsBatchUpdateRequest(api.PermissionsBatchUpdateRequest o) {
   buildCounterPermissionsBatchUpdateRequest++;
   if (buildCounterPermissionsBatchUpdateRequest < 3) {
-    checkUnnamed123(o.permissions);
+    checkUnnamed910(o.permissions);
   }
   buildCounterPermissionsBatchUpdateRequest--;
 }
@@ -1559,14 +1559,14 @@
   buildCounterPermissionsBatchUpdateResponse--;
 }
 
-buildUnnamed124() {
+buildUnnamed911() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed124(core.List<api.Permission> o) {
+checkUnnamed911(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
@@ -1577,7 +1577,7 @@
   var o = new api.PermissionsListResponse();
   buildCounterPermissionsListResponse++;
   if (buildCounterPermissionsListResponse < 3) {
-    o.permissions = buildUnnamed124();
+    o.permissions = buildUnnamed911();
   }
   buildCounterPermissionsListResponse--;
   return o;
@@ -1586,7 +1586,7 @@
 checkPermissionsListResponse(api.PermissionsListResponse o) {
   buildCounterPermissionsListResponse++;
   if (buildCounterPermissionsListResponse < 3) {
-    checkUnnamed124(o.permissions);
+    checkUnnamed911(o.permissions);
   }
   buildCounterPermissionsListResponse--;
 }
@@ -1618,6 +1618,7 @@
   buildCounterPolygonStyle++;
   if (buildCounterPolygonStyle < 3) {
     o.fill = buildColor();
+    o.label = buildLabelStyle();
     o.stroke = buildBorder();
   }
   buildCounterPolygonStyle--;
@@ -1628,6 +1629,7 @@
   buildCounterPolygonStyle++;
   if (buildCounterPolygonStyle < 3) {
     checkColor(o.fill);
+    checkLabelStyle(o.label);
     checkBorder(o.stroke);
   }
   buildCounterPolygonStyle--;
@@ -1671,14 +1673,14 @@
   buildCounterProject--;
 }
 
-buildUnnamed125() {
+buildUnnamed912() {
   var o = new core.List<api.Project>();
   o.add(buildProject());
   o.add(buildProject());
   return o;
 }
 
-checkUnnamed125(core.List<api.Project> o) {
+checkUnnamed912(core.List<api.Project> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProject(o[0]);
   checkProject(o[1]);
@@ -1689,7 +1691,7 @@
   var o = new api.ProjectsListResponse();
   buildCounterProjectsListResponse++;
   if (buildCounterProjectsListResponse < 3) {
-    o.projects = buildUnnamed125();
+    o.projects = buildUnnamed912();
   }
   buildCounterProjectsListResponse--;
   return o;
@@ -1698,7 +1700,7 @@
 checkProjectsListResponse(api.ProjectsListResponse o) {
   buildCounterProjectsListResponse++;
   if (buildCounterProjectsListResponse < 3) {
-    checkUnnamed125(o.projects);
+    checkUnnamed912(o.projects);
   }
   buildCounterProjectsListResponse--;
 }
@@ -1747,14 +1749,14 @@
   buildCounterPublishedLayer--;
 }
 
-buildUnnamed126() {
+buildUnnamed913() {
   var o = new core.List<api.PublishedLayer>();
   o.add(buildPublishedLayer());
   o.add(buildPublishedLayer());
   return o;
 }
 
-checkUnnamed126(core.List<api.PublishedLayer> o) {
+checkUnnamed913(core.List<api.PublishedLayer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPublishedLayer(o[0]);
   checkPublishedLayer(o[1]);
@@ -1765,7 +1767,7 @@
   var o = new api.PublishedLayersListResponse();
   buildCounterPublishedLayersListResponse++;
   if (buildCounterPublishedLayersListResponse < 3) {
-    o.layers = buildUnnamed126();
+    o.layers = buildUnnamed913();
     o.nextPageToken = "foo";
   }
   buildCounterPublishedLayersListResponse--;
@@ -1775,7 +1777,7 @@
 checkPublishedLayersListResponse(api.PublishedLayersListResponse o) {
   buildCounterPublishedLayersListResponse++;
   if (buildCounterPublishedLayersListResponse < 3) {
-    checkUnnamed126(o.layers);
+    checkUnnamed913(o.layers);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterPublishedLayersListResponse--;
@@ -1810,14 +1812,14 @@
   buildCounterPublishedMap--;
 }
 
-buildUnnamed127() {
+buildUnnamed914() {
   var o = new core.List<api.PublishedMap>();
   o.add(buildPublishedMap());
   o.add(buildPublishedMap());
   return o;
 }
 
-checkUnnamed127(core.List<api.PublishedMap> o) {
+checkUnnamed914(core.List<api.PublishedMap> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPublishedMap(o[0]);
   checkPublishedMap(o[1]);
@@ -1828,7 +1830,7 @@
   var o = new api.PublishedMapsListResponse();
   buildCounterPublishedMapsListResponse++;
   if (buildCounterPublishedMapsListResponse < 3) {
-    o.maps = buildUnnamed127();
+    o.maps = buildUnnamed914();
     o.nextPageToken = "foo";
   }
   buildCounterPublishedMapsListResponse--;
@@ -1838,33 +1840,33 @@
 checkPublishedMapsListResponse(api.PublishedMapsListResponse o) {
   buildCounterPublishedMapsListResponse++;
   if (buildCounterPublishedMapsListResponse < 3) {
-    checkUnnamed127(o.maps);
+    checkUnnamed914(o.maps);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterPublishedMapsListResponse--;
 }
 
-buildUnnamed128() {
+buildUnnamed915() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed128(core.List<core.double> o) {
+checkUnnamed915(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));
 }
 
-buildUnnamed129() {
+buildUnnamed916() {
   var o = new core.List<api.File>();
   o.add(buildFile());
   o.add(buildFile());
   return o;
 }
 
-checkUnnamed129(core.List<api.File> o) {
+checkUnnamed916(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFile(o[0]);
   checkFile(o[1]);
@@ -1877,13 +1879,13 @@
   if (buildCounterRaster < 3) {
     o.acquisitionTime = buildAcquisitionTime();
     o.attribution = "foo";
-    o.bbox = buildUnnamed128();
+    o.bbox = buildUnnamed915();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.creatorEmail = "foo";
     o.description = "foo";
     o.draftAccessList = "foo";
     o.etag = "foo";
-    o.files = buildUnnamed129();
+    o.files = buildUnnamed916();
     o.id = "foo";
     o.lastModifiedTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.lastModifierEmail = "foo";
@@ -1904,13 +1906,13 @@
   if (buildCounterRaster < 3) {
     checkAcquisitionTime(o.acquisitionTime);
     unittest.expect(o.attribution, unittest.equals('foo'));
-    checkUnnamed128(o.bbox);
+    checkUnnamed915(o.bbox);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.creatorEmail, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.draftAccessList, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed129(o.files);
+    checkUnnamed916(o.files);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.lastModifiedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.lastModifierEmail, unittest.equals('foo'));
@@ -1925,14 +1927,14 @@
   buildCounterRaster--;
 }
 
-buildUnnamed130() {
+buildUnnamed917() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed130(core.List<core.double> o) {
+checkUnnamed917(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));
@@ -1944,7 +1946,7 @@
   buildCounterRasterCollection++;
   if (buildCounterRasterCollection < 3) {
     o.attribution = "foo";
-    o.bbox = buildUnnamed130();
+    o.bbox = buildUnnamed917();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.creatorEmail = "foo";
     o.description = "foo";
@@ -1969,7 +1971,7 @@
   buildCounterRasterCollection++;
   if (buildCounterRasterCollection < 3) {
     unittest.expect(o.attribution, unittest.equals('foo'));
-    checkUnnamed130(o.bbox);
+    checkUnnamed917(o.bbox);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.creatorEmail, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
@@ -1989,14 +1991,14 @@
   buildCounterRasterCollection--;
 }
 
-buildUnnamed131() {
+buildUnnamed918() {
   var o = new core.List<api.RasterCollection>();
   o.add(buildRasterCollection());
   o.add(buildRasterCollection());
   return o;
 }
 
-checkUnnamed131(core.List<api.RasterCollection> o) {
+checkUnnamed918(core.List<api.RasterCollection> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRasterCollection(o[0]);
   checkRasterCollection(o[1]);
@@ -2008,7 +2010,7 @@
   buildCounterRasterCollectionsListResponse++;
   if (buildCounterRasterCollectionsListResponse < 3) {
     o.nextPageToken = "foo";
-    o.rasterCollections = buildUnnamed131();
+    o.rasterCollections = buildUnnamed918();
   }
   buildCounterRasterCollectionsListResponse--;
   return o;
@@ -2018,32 +2020,32 @@
   buildCounterRasterCollectionsListResponse++;
   if (buildCounterRasterCollectionsListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed131(o.rasterCollections);
+    checkUnnamed918(o.rasterCollections);
   }
   buildCounterRasterCollectionsListResponse--;
 }
 
-buildUnnamed132() {
+buildUnnamed919() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed132(core.List<core.double> o) {
+checkUnnamed919(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));
 }
 
-buildUnnamed133() {
+buildUnnamed920() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed133(core.List<core.String> o) {
+checkUnnamed920(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2054,7 +2056,7 @@
   var o = new api.RasterCollectionsRaster();
   buildCounterRasterCollectionsRaster++;
   if (buildCounterRasterCollectionsRaster < 3) {
-    o.bbox = buildUnnamed132();
+    o.bbox = buildUnnamed919();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.description = "foo";
     o.id = "foo";
@@ -2062,7 +2064,7 @@
     o.name = "foo";
     o.projectId = "foo";
     o.rasterType = "foo";
-    o.tags = buildUnnamed133();
+    o.tags = buildUnnamed920();
   }
   buildCounterRasterCollectionsRaster--;
   return o;
@@ -2071,7 +2073,7 @@
 checkRasterCollectionsRaster(api.RasterCollectionsRaster o) {
   buildCounterRasterCollectionsRaster++;
   if (buildCounterRasterCollectionsRaster < 3) {
-    checkUnnamed132(o.bbox);
+    checkUnnamed919(o.bbox);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -2079,19 +2081,19 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.rasterType, unittest.equals('foo'));
-    checkUnnamed133(o.tags);
+    checkUnnamed920(o.tags);
   }
   buildCounterRasterCollectionsRaster--;
 }
 
-buildUnnamed134() {
+buildUnnamed921() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed134(core.List<core.String> o) {
+checkUnnamed921(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2102,7 +2104,7 @@
   var o = new api.RasterCollectionsRasterBatchDeleteRequest();
   buildCounterRasterCollectionsRasterBatchDeleteRequest++;
   if (buildCounterRasterCollectionsRasterBatchDeleteRequest < 3) {
-    o.ids = buildUnnamed134();
+    o.ids = buildUnnamed921();
   }
   buildCounterRasterCollectionsRasterBatchDeleteRequest--;
   return o;
@@ -2111,7 +2113,7 @@
 checkRasterCollectionsRasterBatchDeleteRequest(api.RasterCollectionsRasterBatchDeleteRequest o) {
   buildCounterRasterCollectionsRasterBatchDeleteRequest++;
   if (buildCounterRasterCollectionsRasterBatchDeleteRequest < 3) {
-    checkUnnamed134(o.ids);
+    checkUnnamed921(o.ids);
   }
   buildCounterRasterCollectionsRasterBatchDeleteRequest--;
 }
@@ -2133,14 +2135,14 @@
   buildCounterRasterCollectionsRastersBatchDeleteResponse--;
 }
 
-buildUnnamed135() {
+buildUnnamed922() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed135(core.List<core.String> o) {
+checkUnnamed922(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2151,7 +2153,7 @@
   var o = new api.RasterCollectionsRastersBatchInsertRequest();
   buildCounterRasterCollectionsRastersBatchInsertRequest++;
   if (buildCounterRasterCollectionsRastersBatchInsertRequest < 3) {
-    o.ids = buildUnnamed135();
+    o.ids = buildUnnamed922();
   }
   buildCounterRasterCollectionsRastersBatchInsertRequest--;
   return o;
@@ -2160,7 +2162,7 @@
 checkRasterCollectionsRastersBatchInsertRequest(api.RasterCollectionsRastersBatchInsertRequest o) {
   buildCounterRasterCollectionsRastersBatchInsertRequest++;
   if (buildCounterRasterCollectionsRastersBatchInsertRequest < 3) {
-    checkUnnamed135(o.ids);
+    checkUnnamed922(o.ids);
   }
   buildCounterRasterCollectionsRastersBatchInsertRequest--;
 }
@@ -2182,14 +2184,14 @@
   buildCounterRasterCollectionsRastersBatchInsertResponse--;
 }
 
-buildUnnamed136() {
+buildUnnamed923() {
   var o = new core.List<api.RasterCollectionsRaster>();
   o.add(buildRasterCollectionsRaster());
   o.add(buildRasterCollectionsRaster());
   return o;
 }
 
-checkUnnamed136(core.List<api.RasterCollectionsRaster> o) {
+checkUnnamed923(core.List<api.RasterCollectionsRaster> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRasterCollectionsRaster(o[0]);
   checkRasterCollectionsRaster(o[1]);
@@ -2201,7 +2203,7 @@
   buildCounterRasterCollectionsRastersListResponse++;
   if (buildCounterRasterCollectionsRastersListResponse < 3) {
     o.nextPageToken = "foo";
-    o.rasters = buildUnnamed136();
+    o.rasters = buildUnnamed923();
   }
   buildCounterRasterCollectionsRastersListResponse--;
   return o;
@@ -2211,19 +2213,19 @@
   buildCounterRasterCollectionsRastersListResponse++;
   if (buildCounterRasterCollectionsRastersListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed136(o.rasters);
+    checkUnnamed923(o.rasters);
   }
   buildCounterRasterCollectionsRastersListResponse--;
 }
 
-buildUnnamed137() {
+buildUnnamed924() {
   var o = new core.List<api.Raster>();
   o.add(buildRaster());
   o.add(buildRaster());
   return o;
 }
 
-checkUnnamed137(core.List<api.Raster> o) {
+checkUnnamed924(core.List<api.Raster> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRaster(o[0]);
   checkRaster(o[1]);
@@ -2235,7 +2237,7 @@
   buildCounterRastersListResponse++;
   if (buildCounterRastersListResponse < 3) {
     o.nextPageToken = "foo";
-    o.rasters = buildUnnamed137();
+    o.rasters = buildUnnamed924();
   }
   buildCounterRastersListResponse--;
   return o;
@@ -2245,7 +2247,7 @@
   buildCounterRastersListResponse++;
   if (buildCounterRastersListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed137(o.rasters);
+    checkUnnamed924(o.rasters);
   }
   buildCounterRastersListResponse--;
 }
@@ -2298,14 +2300,14 @@
   buildCounterScalingFunction--;
 }
 
-buildUnnamed138() {
+buildUnnamed925() {
   var o = new core.List<api.TableColumn>();
   o.add(buildTableColumn());
   o.add(buildTableColumn());
   return o;
 }
 
-checkUnnamed138(core.List<api.TableColumn> o) {
+checkUnnamed925(core.List<api.TableColumn> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableColumn(o[0]);
   checkTableColumn(o[1]);
@@ -2316,7 +2318,7 @@
   var o = new api.Schema();
   buildCounterSchema++;
   if (buildCounterSchema < 3) {
-    o.columns = buildUnnamed138();
+    o.columns = buildUnnamed925();
     o.primaryGeometry = "foo";
     o.primaryKey = "foo";
   }
@@ -2327,7 +2329,7 @@
 checkSchema(api.Schema o) {
   buildCounterSchema++;
   if (buildCounterSchema < 3) {
-    checkUnnamed138(o.columns);
+    checkUnnamed925(o.columns);
     unittest.expect(o.primaryGeometry, unittest.equals('foo'));
     unittest.expect(o.primaryKey, unittest.equals('foo'));
   }
@@ -2355,27 +2357,27 @@
   buildCounterSizeRange--;
 }
 
-buildUnnamed139() {
+buildUnnamed926() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed139(core.List<core.double> o) {
+checkUnnamed926(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));
 }
 
-buildUnnamed140() {
+buildUnnamed927() {
   var o = new core.List<api.File>();
   o.add(buildFile());
   o.add(buildFile());
   return o;
 }
 
-checkUnnamed140(core.List<api.File> o) {
+checkUnnamed927(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFile(o[0]);
   checkFile(o[1]);
@@ -2386,13 +2388,13 @@
   var o = new api.Table();
   buildCounterTable++;
   if (buildCounterTable < 3) {
-    o.bbox = buildUnnamed139();
+    o.bbox = buildUnnamed926();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.creatorEmail = "foo";
     o.description = "foo";
     o.draftAccessList = "foo";
     o.etag = "foo";
-    o.files = buildUnnamed140();
+    o.files = buildUnnamed927();
     o.id = "foo";
     o.lastModifiedTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.lastModifierEmail = "foo";
@@ -2412,13 +2414,13 @@
 checkTable(api.Table o) {
   buildCounterTable++;
   if (buildCounterTable < 3) {
-    checkUnnamed139(o.bbox);
+    checkUnnamed926(o.bbox);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.creatorEmail, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.draftAccessList, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed140(o.files);
+    checkUnnamed927(o.files);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.lastModifiedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.lastModifierEmail, unittest.equals('foo'));
@@ -2455,14 +2457,14 @@
   buildCounterTableColumn--;
 }
 
-buildUnnamed141() {
+buildUnnamed928() {
   var o = new core.List<api.Table>();
   o.add(buildTable());
   o.add(buildTable());
   return o;
 }
 
-checkUnnamed141(core.List<api.Table> o) {
+checkUnnamed928(core.List<api.Table> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTable(o[0]);
   checkTable(o[1]);
@@ -2474,7 +2476,7 @@
   buildCounterTablesListResponse++;
   if (buildCounterTablesListResponse < 3) {
     o.nextPageToken = "foo";
-    o.tables = buildUnnamed141();
+    o.tables = buildUnnamed928();
   }
   buildCounterTablesListResponse--;
   return o;
@@ -2484,7 +2486,7 @@
   buildCounterTablesListResponse++;
   if (buildCounterTablesListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed141(o.tables);
+    checkUnnamed928(o.tables);
   }
   buildCounterTablesListResponse--;
 }
@@ -2523,14 +2525,14 @@
   buildCounterValueRange--;
 }
 
-buildUnnamed142() {
+buildUnnamed929() {
   var o = new core.List<api.DisplayRule>();
   o.add(buildDisplayRule());
   o.add(buildDisplayRule());
   return o;
 }
 
-checkUnnamed142(core.List<api.DisplayRule> o) {
+checkUnnamed929(core.List<api.DisplayRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisplayRule(o[0]);
   checkDisplayRule(o[1]);
@@ -2541,7 +2543,7 @@
   var o = new api.VectorStyle();
   buildCounterVectorStyle++;
   if (buildCounterVectorStyle < 3) {
-    o.displayRules = buildUnnamed142();
+    o.displayRules = buildUnnamed929();
     o.featureInfo = buildFeatureInfo();
     o.type = "foo";
   }
@@ -2552,7 +2554,7 @@
 checkVectorStyle(api.VectorStyle o) {
   buildCounterVectorStyle++;
   if (buildCounterVectorStyle < 3) {
-    checkUnnamed142(o.displayRules);
+    checkUnnamed929(o.displayRules);
     checkFeatureInfo(o.featureInfo);
     unittest.expect(o.type, unittest.equals('foo'));
   }
diff --git a/generated/googleapis/test/mirror/v1_test.dart b/generated/googleapis/test/mirror/v1_test.dart
index f808136..784f3a9 100644
--- a/generated/googleapis/test/mirror/v1_test.dart
+++ b/generated/googleapis/test/mirror/v1_test.dart
@@ -16,40 +16,40 @@
 
 
 
-buildUnnamed754() {
+buildUnnamed930() {
   var o = new core.List<api.AuthToken>();
   o.add(buildAuthToken());
   o.add(buildAuthToken());
   return o;
 }
 
-checkUnnamed754(core.List<api.AuthToken> o) {
+checkUnnamed930(core.List<api.AuthToken> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthToken(o[0]);
   checkAuthToken(o[1]);
 }
 
-buildUnnamed755() {
+buildUnnamed931() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed755(core.List<core.String> o) {
+checkUnnamed931(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed756() {
+buildUnnamed932() {
   var o = new core.List<api.UserData>();
   o.add(buildUserData());
   o.add(buildUserData());
   return o;
 }
 
-checkUnnamed756(core.List<api.UserData> o) {
+checkUnnamed932(core.List<api.UserData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserData(o[0]);
   checkUserData(o[1]);
@@ -60,10 +60,10 @@
   var o = new api.Account();
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    o.authTokens = buildUnnamed754();
-    o.features = buildUnnamed755();
+    o.authTokens = buildUnnamed930();
+    o.features = buildUnnamed931();
     o.password = "foo";
-    o.userData = buildUnnamed756();
+    o.userData = buildUnnamed932();
   }
   buildCounterAccount--;
   return o;
@@ -72,10 +72,10 @@
 checkAccount(api.Account o) {
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    checkUnnamed754(o.authTokens);
-    checkUnnamed755(o.features);
+    checkUnnamed930(o.authTokens);
+    checkUnnamed931(o.features);
     unittest.expect(o.password, unittest.equals('foo'));
-    checkUnnamed756(o.userData);
+    checkUnnamed932(o.userData);
   }
   buildCounterAccount--;
 }
@@ -105,14 +105,14 @@
   buildCounterAttachment--;
 }
 
-buildUnnamed757() {
+buildUnnamed933() {
   var o = new core.List<api.Attachment>();
   o.add(buildAttachment());
   o.add(buildAttachment());
   return o;
 }
 
-checkUnnamed757(core.List<api.Attachment> o) {
+checkUnnamed933(core.List<api.Attachment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachment(o[0]);
   checkAttachment(o[1]);
@@ -123,7 +123,7 @@
   var o = new api.AttachmentsListResponse();
   buildCounterAttachmentsListResponse++;
   if (buildCounterAttachmentsListResponse < 3) {
-    o.items = buildUnnamed757();
+    o.items = buildUnnamed933();
     o.kind = "foo";
   }
   buildCounterAttachmentsListResponse--;
@@ -133,7 +133,7 @@
 checkAttachmentsListResponse(api.AttachmentsListResponse o) {
   buildCounterAttachmentsListResponse++;
   if (buildCounterAttachmentsListResponse < 3) {
-    checkUnnamed757(o.items);
+    checkUnnamed933(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAttachmentsListResponse--;
@@ -179,53 +179,53 @@
   buildCounterCommand--;
 }
 
-buildUnnamed758() {
+buildUnnamed934() {
   var o = new core.List<api.Command>();
   o.add(buildCommand());
   o.add(buildCommand());
   return o;
 }
 
-checkUnnamed758(core.List<api.Command> o) {
+checkUnnamed934(core.List<api.Command> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommand(o[0]);
   checkCommand(o[1]);
 }
 
-buildUnnamed759() {
+buildUnnamed935() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed759(core.List<core.String> o) {
+checkUnnamed935(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed760() {
+buildUnnamed936() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed760(core.List<core.String> o) {
+checkUnnamed936(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed761() {
+buildUnnamed937() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed761(core.List<core.String> o) {
+checkUnnamed937(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -236,15 +236,15 @@
   var o = new api.Contact();
   buildCounterContact++;
   if (buildCounterContact < 3) {
-    o.acceptCommands = buildUnnamed758();
-    o.acceptTypes = buildUnnamed759();
+    o.acceptCommands = buildUnnamed934();
+    o.acceptTypes = buildUnnamed935();
     o.displayName = "foo";
     o.id = "foo";
-    o.imageUrls = buildUnnamed760();
+    o.imageUrls = buildUnnamed936();
     o.kind = "foo";
     o.phoneNumber = "foo";
     o.priority = 42;
-    o.sharingFeatures = buildUnnamed761();
+    o.sharingFeatures = buildUnnamed937();
     o.source = "foo";
     o.speakableName = "foo";
     o.type = "foo";
@@ -256,15 +256,15 @@
 checkContact(api.Contact o) {
   buildCounterContact++;
   if (buildCounterContact < 3) {
-    checkUnnamed758(o.acceptCommands);
-    checkUnnamed759(o.acceptTypes);
+    checkUnnamed934(o.acceptCommands);
+    checkUnnamed935(o.acceptTypes);
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed760(o.imageUrls);
+    checkUnnamed936(o.imageUrls);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.phoneNumber, unittest.equals('foo'));
     unittest.expect(o.priority, unittest.equals(42));
-    checkUnnamed761(o.sharingFeatures);
+    checkUnnamed937(o.sharingFeatures);
     unittest.expect(o.source, unittest.equals('foo'));
     unittest.expect(o.speakableName, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -272,14 +272,14 @@
   buildCounterContact--;
 }
 
-buildUnnamed762() {
+buildUnnamed938() {
   var o = new core.List<api.Contact>();
   o.add(buildContact());
   o.add(buildContact());
   return o;
 }
 
-checkUnnamed762(core.List<api.Contact> o) {
+checkUnnamed938(core.List<api.Contact> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContact(o[0]);
   checkContact(o[1]);
@@ -290,7 +290,7 @@
   var o = new api.ContactsListResponse();
   buildCounterContactsListResponse++;
   if (buildCounterContactsListResponse < 3) {
-    o.items = buildUnnamed762();
+    o.items = buildUnnamed938();
     o.kind = "foo";
   }
   buildCounterContactsListResponse--;
@@ -300,7 +300,7 @@
 checkContactsListResponse(api.ContactsListResponse o) {
   buildCounterContactsListResponse++;
   if (buildCounterContactsListResponse < 3) {
-    checkUnnamed762(o.items);
+    checkUnnamed938(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterContactsListResponse--;
@@ -339,14 +339,14 @@
   buildCounterLocation--;
 }
 
-buildUnnamed763() {
+buildUnnamed939() {
   var o = new core.List<api.Location>();
   o.add(buildLocation());
   o.add(buildLocation());
   return o;
 }
 
-checkUnnamed763(core.List<api.Location> o) {
+checkUnnamed939(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocation(o[0]);
   checkLocation(o[1]);
@@ -357,7 +357,7 @@
   var o = new api.LocationsListResponse();
   buildCounterLocationsListResponse++;
   if (buildCounterLocationsListResponse < 3) {
-    o.items = buildUnnamed763();
+    o.items = buildUnnamed939();
     o.kind = "foo";
   }
   buildCounterLocationsListResponse--;
@@ -367,20 +367,20 @@
 checkLocationsListResponse(api.LocationsListResponse o) {
   buildCounterLocationsListResponse++;
   if (buildCounterLocationsListResponse < 3) {
-    checkUnnamed763(o.items);
+    checkUnnamed939(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterLocationsListResponse--;
 }
 
-buildUnnamed764() {
+buildUnnamed940() {
   var o = new core.List<api.MenuValue>();
   o.add(buildMenuValue());
   o.add(buildMenuValue());
   return o;
 }
 
-checkUnnamed764(core.List<api.MenuValue> o) {
+checkUnnamed940(core.List<api.MenuValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMenuValue(o[0]);
   checkMenuValue(o[1]);
@@ -396,7 +396,7 @@
     o.id = "foo";
     o.payload = "foo";
     o.removeWhenSelected = true;
-    o.values = buildUnnamed764();
+    o.values = buildUnnamed940();
   }
   buildCounterMenuItem--;
   return o;
@@ -410,7 +410,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.payload, unittest.equals('foo'));
     unittest.expect(o.removeWhenSelected, unittest.isTrue);
-    checkUnnamed764(o.values);
+    checkUnnamed940(o.values);
   }
   buildCounterMenuItem--;
 }
@@ -438,14 +438,14 @@
   buildCounterMenuValue--;
 }
 
-buildUnnamed765() {
+buildUnnamed941() {
   var o = new core.List<api.UserAction>();
   o.add(buildUserAction());
   o.add(buildUserAction());
   return o;
 }
 
-checkUnnamed765(core.List<api.UserAction> o) {
+checkUnnamed941(core.List<api.UserAction> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserAction(o[0]);
   checkUserAction(o[1]);
@@ -459,7 +459,7 @@
     o.collection = "foo";
     o.itemId = "foo";
     o.operation = "foo";
-    o.userActions = buildUnnamed765();
+    o.userActions = buildUnnamed941();
     o.userToken = "foo";
     o.verifyToken = "foo";
   }
@@ -473,7 +473,7 @@
     unittest.expect(o.collection, unittest.equals('foo'));
     unittest.expect(o.itemId, unittest.equals('foo'));
     unittest.expect(o.operation, unittest.equals('foo'));
-    checkUnnamed765(o.userActions);
+    checkUnnamed941(o.userActions);
     unittest.expect(o.userToken, unittest.equals('foo'));
     unittest.expect(o.verifyToken, unittest.equals('foo'));
   }
@@ -524,14 +524,14 @@
   buildCounterSetting--;
 }
 
-buildUnnamed766() {
+buildUnnamed942() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed766(core.List<core.String> o) {
+checkUnnamed942(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -547,7 +547,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.notification = buildNotification();
-    o.operation = buildUnnamed766();
+    o.operation = buildUnnamed942();
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
     o.userToken = "foo";
     o.verifyToken = "foo";
@@ -564,7 +564,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkNotification(o.notification);
-    checkUnnamed766(o.operation);
+    checkUnnamed942(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'));
@@ -572,14 +572,14 @@
   buildCounterSubscription--;
 }
 
-buildUnnamed767() {
+buildUnnamed943() {
   var o = new core.List<api.Subscription>();
   o.add(buildSubscription());
   o.add(buildSubscription());
   return o;
 }
 
-checkUnnamed767(core.List<api.Subscription> o) {
+checkUnnamed943(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubscription(o[0]);
   checkSubscription(o[1]);
@@ -590,7 +590,7 @@
   var o = new api.SubscriptionsListResponse();
   buildCounterSubscriptionsListResponse++;
   if (buildCounterSubscriptionsListResponse < 3) {
-    o.items = buildUnnamed767();
+    o.items = buildUnnamed943();
     o.kind = "foo";
   }
   buildCounterSubscriptionsListResponse--;
@@ -600,46 +600,46 @@
 checkSubscriptionsListResponse(api.SubscriptionsListResponse o) {
   buildCounterSubscriptionsListResponse++;
   if (buildCounterSubscriptionsListResponse < 3) {
-    checkUnnamed767(o.items);
+    checkUnnamed943(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterSubscriptionsListResponse--;
 }
 
-buildUnnamed768() {
+buildUnnamed944() {
   var o = new core.List<api.Attachment>();
   o.add(buildAttachment());
   o.add(buildAttachment());
   return o;
 }
 
-checkUnnamed768(core.List<api.Attachment> o) {
+checkUnnamed944(core.List<api.Attachment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachment(o[0]);
   checkAttachment(o[1]);
 }
 
-buildUnnamed769() {
+buildUnnamed945() {
   var o = new core.List<api.MenuItem>();
   o.add(buildMenuItem());
   o.add(buildMenuItem());
   return o;
 }
 
-checkUnnamed769(core.List<api.MenuItem> o) {
+checkUnnamed945(core.List<api.MenuItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMenuItem(o[0]);
   checkMenuItem(o[1]);
 }
 
-buildUnnamed770() {
+buildUnnamed946() {
   var o = new core.List<api.Contact>();
   o.add(buildContact());
   o.add(buildContact());
   return o;
 }
 
-checkUnnamed770(core.List<api.Contact> o) {
+checkUnnamed946(core.List<api.Contact> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContact(o[0]);
   checkContact(o[1]);
@@ -650,7 +650,7 @@
   var o = new api.TimelineItem();
   buildCounterTimelineItem++;
   if (buildCounterTimelineItem < 3) {
-    o.attachments = buildUnnamed768();
+    o.attachments = buildUnnamed944();
     o.bundleId = "foo";
     o.canonicalUrl = "foo";
     o.created = core.DateTime.parse("2002-02-27T14:01:02");
@@ -665,10 +665,10 @@
     o.isPinned = true;
     o.kind = "foo";
     o.location = buildLocation();
-    o.menuItems = buildUnnamed769();
+    o.menuItems = buildUnnamed945();
     o.notification = buildNotificationConfig();
     o.pinScore = 42;
-    o.recipients = buildUnnamed770();
+    o.recipients = buildUnnamed946();
     o.selfLink = "foo";
     o.sourceItemId = "foo";
     o.speakableText = "foo";
@@ -684,7 +684,7 @@
 checkTimelineItem(api.TimelineItem o) {
   buildCounterTimelineItem++;
   if (buildCounterTimelineItem < 3) {
-    checkUnnamed768(o.attachments);
+    checkUnnamed944(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")));
@@ -699,10 +699,10 @@
     unittest.expect(o.isPinned, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkLocation(o.location);
-    checkUnnamed769(o.menuItems);
+    checkUnnamed945(o.menuItems);
     checkNotificationConfig(o.notification);
     unittest.expect(o.pinScore, unittest.equals(42));
-    checkUnnamed770(o.recipients);
+    checkUnnamed946(o.recipients);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.sourceItemId, unittest.equals('foo'));
     unittest.expect(o.speakableText, unittest.equals('foo'));
@@ -714,14 +714,14 @@
   buildCounterTimelineItem--;
 }
 
-buildUnnamed771() {
+buildUnnamed947() {
   var o = new core.List<api.TimelineItem>();
   o.add(buildTimelineItem());
   o.add(buildTimelineItem());
   return o;
 }
 
-checkUnnamed771(core.List<api.TimelineItem> o) {
+checkUnnamed947(core.List<api.TimelineItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTimelineItem(o[0]);
   checkTimelineItem(o[1]);
@@ -732,7 +732,7 @@
   var o = new api.TimelineListResponse();
   buildCounterTimelineListResponse++;
   if (buildCounterTimelineListResponse < 3) {
-    o.items = buildUnnamed771();
+    o.items = buildUnnamed947();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -743,7 +743,7 @@
 checkTimelineListResponse(api.TimelineListResponse o) {
   buildCounterTimelineListResponse++;
   if (buildCounterTimelineListResponse < 3) {
-    checkUnnamed771(o.items);
+    checkUnnamed947(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
diff --git a/generated/googleapis/test/pagespeedonline/v1_test.dart b/generated/googleapis/test/pagespeedonline/v1_test.dart
index 56e76f6..f5c1b09 100644
--- a/generated/googleapis/test/pagespeedonline/v1_test.dart
+++ b/generated/googleapis/test/pagespeedonline/v1_test.dart
@@ -37,14 +37,14 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs--;
 }
 
-buildUnnamed1020() {
+buildUnnamed948() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs());
   return o;
 }
 
-checkUnnamed1020(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs> o) {
+checkUnnamed948(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs(o[0]);
   checkResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs(o[1]);
@@ -55,7 +55,7 @@
   var o = new api.ResultFormattedResultsRuleResultsValueUrlBlocksHeader();
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader < 3) {
-    o.args = buildUnnamed1020();
+    o.args = buildUnnamed948();
     o.format = "foo";
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader--;
@@ -65,7 +65,7 @@
 checkResultFormattedResultsRuleResultsValueUrlBlocksHeader(api.ResultFormattedResultsRuleResultsValueUrlBlocksHeader o) {
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader < 3) {
-    checkUnnamed1020(o.args);
+    checkUnnamed948(o.args);
     unittest.expect(o.format, unittest.equals('foo'));
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader--;
@@ -92,14 +92,14 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs--;
 }
 
-buildUnnamed1021() {
+buildUnnamed949() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs());
   return o;
 }
 
-checkUnnamed1021(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs> o) {
+checkUnnamed949(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs(o[0]);
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs(o[1]);
@@ -110,7 +110,7 @@
   var o = new api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails();
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails < 3) {
-    o.args = buildUnnamed1021();
+    o.args = buildUnnamed949();
     o.format = "foo";
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails--;
@@ -120,20 +120,20 @@
 checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails(api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails o) {
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails < 3) {
-    checkUnnamed1021(o.args);
+    checkUnnamed949(o.args);
     unittest.expect(o.format, unittest.equals('foo'));
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails--;
 }
 
-buildUnnamed1022() {
+buildUnnamed950() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails());
   return o;
 }
 
-checkUnnamed1022(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails> o) {
+checkUnnamed950(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails(o[0]);
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails(o[1]);
@@ -160,14 +160,14 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs--;
 }
 
-buildUnnamed1023() {
+buildUnnamed951() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs());
   return o;
 }
 
-checkUnnamed1023(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs> o) {
+checkUnnamed951(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs(o[0]);
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs(o[1]);
@@ -178,7 +178,7 @@
   var o = new api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult();
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult < 3) {
-    o.args = buildUnnamed1023();
+    o.args = buildUnnamed951();
     o.format = "foo";
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult--;
@@ -188,7 +188,7 @@
 checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult(api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult o) {
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult < 3) {
-    checkUnnamed1023(o.args);
+    checkUnnamed951(o.args);
     unittest.expect(o.format, unittest.equals('foo'));
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult--;
@@ -199,7 +199,7 @@
   var o = new api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls();
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls < 3) {
-    o.details = buildUnnamed1022();
+    o.details = buildUnnamed950();
     o.result = buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult();
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls--;
@@ -209,20 +209,20 @@
 checkResultFormattedResultsRuleResultsValueUrlBlocksUrls(api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls o) {
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls < 3) {
-    checkUnnamed1022(o.details);
+    checkUnnamed950(o.details);
     checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult(o.result);
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls--;
 }
 
-buildUnnamed1024() {
+buildUnnamed952() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrls());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrls());
   return o;
 }
 
-checkUnnamed1024(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls> o) {
+checkUnnamed952(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrls(o[0]);
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrls(o[1]);
@@ -234,7 +234,7 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocks++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocks < 3) {
     o.header = buildResultFormattedResultsRuleResultsValueUrlBlocksHeader();
-    o.urls = buildUnnamed1024();
+    o.urls = buildUnnamed952();
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocks--;
   return o;
@@ -244,19 +244,19 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocks++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocks < 3) {
     checkResultFormattedResultsRuleResultsValueUrlBlocksHeader(o.header);
-    checkUnnamed1024(o.urls);
+    checkUnnamed952(o.urls);
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocks--;
 }
 
-buildUnnamed1025() {
+buildUnnamed953() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocks>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocks());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocks());
   return o;
 }
 
-checkUnnamed1025(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocks> o) {
+checkUnnamed953(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocks> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocks(o[0]);
   checkResultFormattedResultsRuleResultsValueUrlBlocks(o[1]);
@@ -269,7 +269,7 @@
   if (buildCounterResultFormattedResultsRuleResultsValue < 3) {
     o.localizedRuleName = "foo";
     o.ruleImpact = 42.0;
-    o.urlBlocks = buildUnnamed1025();
+    o.urlBlocks = buildUnnamed953();
   }
   buildCounterResultFormattedResultsRuleResultsValue--;
   return o;
@@ -280,19 +280,19 @@
   if (buildCounterResultFormattedResultsRuleResultsValue < 3) {
     unittest.expect(o.localizedRuleName, unittest.equals('foo'));
     unittest.expect(o.ruleImpact, unittest.equals(42.0));
-    checkUnnamed1025(o.urlBlocks);
+    checkUnnamed953(o.urlBlocks);
   }
   buildCounterResultFormattedResultsRuleResultsValue--;
 }
 
-buildUnnamed1026() {
+buildUnnamed954() {
   var o = new core.Map<core.String, api.ResultFormattedResultsRuleResultsValue>();
   o["x"] = buildResultFormattedResultsRuleResultsValue();
   o["y"] = buildResultFormattedResultsRuleResultsValue();
   return o;
 }
 
-checkUnnamed1026(core.Map<core.String, api.ResultFormattedResultsRuleResultsValue> o) {
+checkUnnamed954(core.Map<core.String, api.ResultFormattedResultsRuleResultsValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValue(o["x"]);
   checkResultFormattedResultsRuleResultsValue(o["y"]);
@@ -304,7 +304,7 @@
   buildCounterResultFormattedResults++;
   if (buildCounterResultFormattedResults < 3) {
     o.locale = "foo";
-    o.ruleResults = buildUnnamed1026();
+    o.ruleResults = buildUnnamed954();
   }
   buildCounterResultFormattedResults--;
   return o;
@@ -314,19 +314,19 @@
   buildCounterResultFormattedResults++;
   if (buildCounterResultFormattedResults < 3) {
     unittest.expect(o.locale, unittest.equals('foo'));
-    checkUnnamed1026(o.ruleResults);
+    checkUnnamed954(o.ruleResults);
   }
   buildCounterResultFormattedResults--;
 }
 
-buildUnnamed1027() {
+buildUnnamed955() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1027(core.List<core.String> o) {
+checkUnnamed955(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -428,7 +428,7 @@
   if (buildCounterResult < 3) {
     o.formattedResults = buildResultFormattedResults();
     o.id = "foo";
-    o.invalidRules = buildUnnamed1027();
+    o.invalidRules = buildUnnamed955();
     o.kind = "foo";
     o.pageStats = buildResultPageStats();
     o.responseCode = 42;
@@ -446,7 +446,7 @@
   if (buildCounterResult < 3) {
     checkResultFormattedResults(o.formattedResults);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1027(o.invalidRules);
+    checkUnnamed955(o.invalidRules);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkResultPageStats(o.pageStats);
     unittest.expect(o.responseCode, unittest.equals(42));
@@ -458,14 +458,14 @@
   buildCounterResult--;
 }
 
-buildUnnamed1028() {
+buildUnnamed956() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1028(core.List<core.String> o) {
+checkUnnamed956(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -607,7 +607,7 @@
       var arg_url = "foo";
       var arg_filterThirdPartyResources = true;
       var arg_locale = "foo";
-      var arg_rule = buildUnnamed1028();
+      var arg_rule = buildUnnamed956();
       var arg_screenshot = true;
       var arg_strategy = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
diff --git a/generated/googleapis/test/plus/v1_test.dart b/generated/googleapis/test/plus/v1_test.dart
index 68212ed..4dbd6b1 100644
--- a/generated/googleapis/test/plus/v1_test.dart
+++ b/generated/googleapis/test/plus/v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed143() {
+buildUnnamed957() {
   var o = new core.List<api.PlusAclentryResource>();
   o.add(buildPlusAclentryResource());
   o.add(buildPlusAclentryResource());
   return o;
 }
 
-checkUnnamed143(core.List<api.PlusAclentryResource> o) {
+checkUnnamed957(core.List<api.PlusAclentryResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlusAclentryResource(o[0]);
   checkPlusAclentryResource(o[1]);
@@ -35,7 +35,7 @@
   buildCounterAcl++;
   if (buildCounterAcl < 3) {
     o.description = "foo";
-    o.items = buildUnnamed143();
+    o.items = buildUnnamed957();
     o.kind = "foo";
   }
   buildCounterAcl--;
@@ -46,7 +46,7 @@
   buildCounterAcl++;
   if (buildCounterAcl < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed143(o.items);
+    checkUnnamed957(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAcl--;
@@ -282,14 +282,14 @@
   buildCounterActivityObjectAttachmentsThumbnails--;
 }
 
-buildUnnamed144() {
+buildUnnamed958() {
   var o = new core.List<api.ActivityObjectAttachmentsThumbnails>();
   o.add(buildActivityObjectAttachmentsThumbnails());
   o.add(buildActivityObjectAttachmentsThumbnails());
   return o;
 }
 
-checkUnnamed144(core.List<api.ActivityObjectAttachmentsThumbnails> o) {
+checkUnnamed958(core.List<api.ActivityObjectAttachmentsThumbnails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachmentsThumbnails(o[0]);
   checkActivityObjectAttachmentsThumbnails(o[1]);
@@ -307,7 +307,7 @@
     o.id = "foo";
     o.image = buildActivityObjectAttachmentsImage();
     o.objectType = "foo";
-    o.thumbnails = buildUnnamed144();
+    o.thumbnails = buildUnnamed958();
     o.url = "foo";
   }
   buildCounterActivityObjectAttachments--;
@@ -324,20 +324,20 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkActivityObjectAttachmentsImage(o.image);
     unittest.expect(o.objectType, unittest.equals('foo'));
-    checkUnnamed144(o.thumbnails);
+    checkUnnamed958(o.thumbnails);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterActivityObjectAttachments--;
 }
 
-buildUnnamed145() {
+buildUnnamed959() {
   var o = new core.List<api.ActivityObjectAttachments>();
   o.add(buildActivityObjectAttachments());
   o.add(buildActivityObjectAttachments());
   return o;
 }
 
-checkUnnamed145(core.List<api.ActivityObjectAttachments> o) {
+checkUnnamed959(core.List<api.ActivityObjectAttachments> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachments(o[0]);
   checkActivityObjectAttachments(o[1]);
@@ -412,7 +412,7 @@
   buildCounterActivityObject++;
   if (buildCounterActivityObject < 3) {
     o.actor = buildActivityObjectActor();
-    o.attachments = buildUnnamed145();
+    o.attachments = buildUnnamed959();
     o.content = "foo";
     o.id = "foo";
     o.objectType = "foo";
@@ -430,7 +430,7 @@
   buildCounterActivityObject++;
   if (buildCounterActivityObject < 3) {
     checkActivityObjectActor(o.actor);
-    checkUnnamed145(o.attachments);
+    checkUnnamed959(o.attachments);
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
@@ -519,14 +519,14 @@
   buildCounterActivity--;
 }
 
-buildUnnamed146() {
+buildUnnamed960() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed146(core.List<api.Activity> o) {
+checkUnnamed960(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -539,7 +539,7 @@
   if (buildCounterActivityFeed < 3) {
     o.etag = "foo";
     o.id = "foo";
-    o.items = buildUnnamed146();
+    o.items = buildUnnamed960();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -556,7 +556,7 @@
   if (buildCounterActivityFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed146(o.items);
+    checkUnnamed960(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -632,14 +632,14 @@
   buildCounterCommentInReplyTo--;
 }
 
-buildUnnamed147() {
+buildUnnamed961() {
   var o = new core.List<api.CommentInReplyTo>();
   o.add(buildCommentInReplyTo());
   o.add(buildCommentInReplyTo());
   return o;
 }
 
-checkUnnamed147(core.List<api.CommentInReplyTo> o) {
+checkUnnamed961(core.List<api.CommentInReplyTo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentInReplyTo(o[0]);
   checkCommentInReplyTo(o[1]);
@@ -695,7 +695,7 @@
     o.actor = buildCommentActor();
     o.etag = "foo";
     o.id = "foo";
-    o.inReplyTo = buildUnnamed147();
+    o.inReplyTo = buildUnnamed961();
     o.kind = "foo";
     o.object = buildCommentObject();
     o.plusoners = buildCommentPlusoners();
@@ -714,7 +714,7 @@
     checkCommentActor(o.actor);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed147(o.inReplyTo);
+    checkUnnamed961(o.inReplyTo);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkCommentObject(o.object);
     checkCommentPlusoners(o.plusoners);
@@ -726,14 +726,14 @@
   buildCounterComment--;
 }
 
-buildUnnamed148() {
+buildUnnamed962() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed148(core.List<api.Comment> o) {
+checkUnnamed962(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -746,7 +746,7 @@
   if (buildCounterCommentFeed < 3) {
     o.etag = "foo";
     o.id = "foo";
-    o.items = buildUnnamed148();
+    o.items = buildUnnamed962();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -762,7 +762,7 @@
   if (buildCounterCommentFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed148(o.items);
+    checkUnnamed962(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -772,79 +772,79 @@
   buildCounterCommentFeed--;
 }
 
-buildUnnamed149() {
+buildUnnamed963() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed149(core.List<core.String> o) {
+checkUnnamed963(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed150() {
+buildUnnamed964() {
   var o = new core.List<api.ItemScope>();
   o.add(buildItemScope());
   o.add(buildItemScope());
   return o;
 }
 
-checkUnnamed150(core.List<api.ItemScope> o) {
+checkUnnamed964(core.List<api.ItemScope> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkItemScope(o[0]);
   checkItemScope(o[1]);
 }
 
-buildUnnamed151() {
+buildUnnamed965() {
   var o = new core.List<api.ItemScope>();
   o.add(buildItemScope());
   o.add(buildItemScope());
   return o;
 }
 
-checkUnnamed151(core.List<api.ItemScope> o) {
+checkUnnamed965(core.List<api.ItemScope> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkItemScope(o[0]);
   checkItemScope(o[1]);
 }
 
-buildUnnamed152() {
+buildUnnamed966() {
   var o = new core.List<api.ItemScope>();
   o.add(buildItemScope());
   o.add(buildItemScope());
   return o;
 }
 
-checkUnnamed152(core.List<api.ItemScope> o) {
+checkUnnamed966(core.List<api.ItemScope> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkItemScope(o[0]);
   checkItemScope(o[1]);
 }
 
-buildUnnamed153() {
+buildUnnamed967() {
   var o = new core.List<api.ItemScope>();
   o.add(buildItemScope());
   o.add(buildItemScope());
   return o;
 }
 
-checkUnnamed153(core.List<api.ItemScope> o) {
+checkUnnamed967(core.List<api.ItemScope> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkItemScope(o[0]);
   checkItemScope(o[1]);
 }
 
-buildUnnamed154() {
+buildUnnamed968() {
   var o = new core.List<api.ItemScope>();
   o.add(buildItemScope());
   o.add(buildItemScope());
   return o;
 }
 
-checkUnnamed154(core.List<api.ItemScope> o) {
+checkUnnamed968(core.List<api.ItemScope> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkItemScope(o[0]);
   checkItemScope(o[1]);
@@ -856,23 +856,23 @@
   buildCounterItemScope++;
   if (buildCounterItemScope < 3) {
     o.about = buildItemScope();
-    o.additionalName = buildUnnamed149();
+    o.additionalName = buildUnnamed963();
     o.address = buildItemScope();
     o.addressCountry = "foo";
     o.addressLocality = "foo";
     o.addressRegion = "foo";
-    o.associatedMedia = buildUnnamed150();
+    o.associatedMedia = buildUnnamed964();
     o.attendeeCount = 42;
-    o.attendees = buildUnnamed151();
+    o.attendees = buildUnnamed965();
     o.audio = buildItemScope();
-    o.author = buildUnnamed152();
+    o.author = buildUnnamed966();
     o.bestRating = "foo";
     o.birthDate = "foo";
     o.byArtist = buildItemScope();
     o.caption = "foo";
     o.contentSize = "foo";
     o.contentUrl = "foo";
-    o.contributor = buildUnnamed153();
+    o.contributor = buildUnnamed967();
     o.dateCreated = "foo";
     o.dateModified = "foo";
     o.datePublished = "foo";
@@ -894,7 +894,7 @@
     o.longitude = 42.0;
     o.name = "foo";
     o.partOfTVSeries = buildItemScope();
-    o.performers = buildUnnamed154();
+    o.performers = buildUnnamed968();
     o.playerType = "foo";
     o.postOfficeBoxNumber = "foo";
     o.postalCode = "foo";
@@ -919,23 +919,23 @@
   buildCounterItemScope++;
   if (buildCounterItemScope < 3) {
     checkItemScope(o.about);
-    checkUnnamed149(o.additionalName);
+    checkUnnamed963(o.additionalName);
     checkItemScope(o.address);
     unittest.expect(o.addressCountry, unittest.equals('foo'));
     unittest.expect(o.addressLocality, unittest.equals('foo'));
     unittest.expect(o.addressRegion, unittest.equals('foo'));
-    checkUnnamed150(o.associatedMedia);
+    checkUnnamed964(o.associatedMedia);
     unittest.expect(o.attendeeCount, unittest.equals(42));
-    checkUnnamed151(o.attendees);
+    checkUnnamed965(o.attendees);
     checkItemScope(o.audio);
-    checkUnnamed152(o.author);
+    checkUnnamed966(o.author);
     unittest.expect(o.bestRating, unittest.equals('foo'));
     unittest.expect(o.birthDate, unittest.equals('foo'));
     checkItemScope(o.byArtist);
     unittest.expect(o.caption, unittest.equals('foo'));
     unittest.expect(o.contentSize, unittest.equals('foo'));
     unittest.expect(o.contentUrl, unittest.equals('foo'));
-    checkUnnamed153(o.contributor);
+    checkUnnamed967(o.contributor);
     unittest.expect(o.dateCreated, unittest.equals('foo'));
     unittest.expect(o.dateModified, unittest.equals('foo'));
     unittest.expect(o.datePublished, unittest.equals('foo'));
@@ -957,7 +957,7 @@
     unittest.expect(o.longitude, unittest.equals(42.0));
     unittest.expect(o.name, unittest.equals('foo'));
     checkItemScope(o.partOfTVSeries);
-    checkUnnamed154(o.performers);
+    checkUnnamed968(o.performers);
     unittest.expect(o.playerType, unittest.equals('foo'));
     unittest.expect(o.postOfficeBoxNumber, unittest.equals('foo'));
     unittest.expect(o.postalCode, unittest.equals('foo'));
@@ -1008,14 +1008,14 @@
   buildCounterMoment--;
 }
 
-buildUnnamed155() {
+buildUnnamed969() {
   var o = new core.List<api.Moment>();
   o.add(buildMoment());
   o.add(buildMoment());
   return o;
 }
 
-checkUnnamed155(core.List<api.Moment> o) {
+checkUnnamed969(core.List<api.Moment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMoment(o[0]);
   checkMoment(o[1]);
@@ -1027,7 +1027,7 @@
   buildCounterMomentsFeed++;
   if (buildCounterMomentsFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed155();
+    o.items = buildUnnamed969();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -1043,7 +1043,7 @@
   buildCounterMomentsFeed++;
   if (buildCounterMomentsFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed155(o.items);
+    checkUnnamed969(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -1054,14 +1054,14 @@
   buildCounterMomentsFeed--;
 }
 
-buildUnnamed156() {
+buildUnnamed970() {
   var o = new core.List<api.Person>();
   o.add(buildPerson());
   o.add(buildPerson());
   return o;
 }
 
-checkUnnamed156(core.List<api.Person> o) {
+checkUnnamed970(core.List<api.Person> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPerson(o[0]);
   checkPerson(o[1]);
@@ -1073,7 +1073,7 @@
   buildCounterPeopleFeed++;
   if (buildCounterPeopleFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed156();
+    o.items = buildUnnamed970();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1088,7 +1088,7 @@
   buildCounterPeopleFeed++;
   if (buildCounterPeopleFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed156(o.items);
+    checkUnnamed970(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1207,14 +1207,14 @@
   buildCounterPersonEmails--;
 }
 
-buildUnnamed157() {
+buildUnnamed971() {
   var o = new core.List<api.PersonEmails>();
   o.add(buildPersonEmails());
   o.add(buildPersonEmails());
   return o;
 }
 
-checkUnnamed157(core.List<api.PersonEmails> o) {
+checkUnnamed971(core.List<api.PersonEmails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonEmails(o[0]);
   checkPersonEmails(o[1]);
@@ -1305,14 +1305,14 @@
   buildCounterPersonOrganizations--;
 }
 
-buildUnnamed158() {
+buildUnnamed972() {
   var o = new core.List<api.PersonOrganizations>();
   o.add(buildPersonOrganizations());
   o.add(buildPersonOrganizations());
   return o;
 }
 
-checkUnnamed158(core.List<api.PersonOrganizations> o) {
+checkUnnamed972(core.List<api.PersonOrganizations> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonOrganizations(o[0]);
   checkPersonOrganizations(o[1]);
@@ -1339,14 +1339,14 @@
   buildCounterPersonPlacesLived--;
 }
 
-buildUnnamed159() {
+buildUnnamed973() {
   var o = new core.List<api.PersonPlacesLived>();
   o.add(buildPersonPlacesLived());
   o.add(buildPersonPlacesLived());
   return o;
 }
 
-checkUnnamed159(core.List<api.PersonPlacesLived> o) {
+checkUnnamed973(core.List<api.PersonPlacesLived> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonPlacesLived(o[0]);
   checkPersonPlacesLived(o[1]);
@@ -1375,14 +1375,14 @@
   buildCounterPersonUrls--;
 }
 
-buildUnnamed160() {
+buildUnnamed974() {
   var o = new core.List<api.PersonUrls>();
   o.add(buildPersonUrls());
   o.add(buildPersonUrls());
   return o;
 }
 
-checkUnnamed160(core.List<api.PersonUrls> o) {
+checkUnnamed974(core.List<api.PersonUrls> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonUrls(o[0]);
   checkPersonUrls(o[1]);
@@ -1402,7 +1402,7 @@
     o.currentLocation = "foo";
     o.displayName = "foo";
     o.domain = "foo";
-    o.emails = buildUnnamed157();
+    o.emails = buildUnnamed971();
     o.etag = "foo";
     o.gender = "foo";
     o.id = "foo";
@@ -1414,14 +1414,14 @@
     o.nickname = "foo";
     o.objectType = "foo";
     o.occupation = "foo";
-    o.organizations = buildUnnamed158();
-    o.placesLived = buildUnnamed159();
+    o.organizations = buildUnnamed972();
+    o.placesLived = buildUnnamed973();
     o.plusOneCount = 42;
     o.relationshipStatus = "foo";
     o.skills = "foo";
     o.tagline = "foo";
     o.url = "foo";
-    o.urls = buildUnnamed160();
+    o.urls = buildUnnamed974();
     o.verified = true;
   }
   buildCounterPerson--;
@@ -1440,7 +1440,7 @@
     unittest.expect(o.currentLocation, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.domain, unittest.equals('foo'));
-    checkUnnamed157(o.emails);
+    checkUnnamed971(o.emails);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.gender, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -1452,14 +1452,14 @@
     unittest.expect(o.nickname, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
     unittest.expect(o.occupation, unittest.equals('foo'));
-    checkUnnamed158(o.organizations);
-    checkUnnamed159(o.placesLived);
+    checkUnnamed972(o.organizations);
+    checkUnnamed973(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'));
-    checkUnnamed160(o.urls);
+    checkUnnamed974(o.urls);
     unittest.expect(o.verified, unittest.isTrue);
   }
   buildCounterPerson--;
diff --git a/generated/googleapis/test/plusdomains/v1_test.dart b/generated/googleapis/test/plusdomains/v1_test.dart
index bfa448b..47d325f 100644
--- a/generated/googleapis/test/plusdomains/v1_test.dart
+++ b/generated/googleapis/test/plusdomains/v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed648() {
+buildUnnamed975() {
   var o = new core.List<api.PlusDomainsAclentryResource>();
   o.add(buildPlusDomainsAclentryResource());
   o.add(buildPlusDomainsAclentryResource());
   return o;
 }
 
-checkUnnamed648(core.List<api.PlusDomainsAclentryResource> o) {
+checkUnnamed975(core.List<api.PlusDomainsAclentryResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlusDomainsAclentryResource(o[0]);
   checkPlusDomainsAclentryResource(o[1]);
@@ -36,7 +36,7 @@
   if (buildCounterAcl < 3) {
     o.description = "foo";
     o.domainRestricted = true;
-    o.items = buildUnnamed648();
+    o.items = buildUnnamed975();
     o.kind = "foo";
   }
   buildCounterAcl--;
@@ -48,7 +48,7 @@
   if (buildCounterAcl < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.domainRestricted, unittest.isTrue);
-    checkUnnamed648(o.items);
+    checkUnnamed975(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAcl--;
@@ -255,14 +255,14 @@
   buildCounterActivityObjectAttachmentsPreviewThumbnails--;
 }
 
-buildUnnamed649() {
+buildUnnamed976() {
   var o = new core.List<api.ActivityObjectAttachmentsPreviewThumbnails>();
   o.add(buildActivityObjectAttachmentsPreviewThumbnails());
   o.add(buildActivityObjectAttachmentsPreviewThumbnails());
   return o;
 }
 
-checkUnnamed649(core.List<api.ActivityObjectAttachmentsPreviewThumbnails> o) {
+checkUnnamed976(core.List<api.ActivityObjectAttachmentsPreviewThumbnails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachmentsPreviewThumbnails(o[0]);
   checkActivityObjectAttachmentsPreviewThumbnails(o[1]);
@@ -316,14 +316,14 @@
   buildCounterActivityObjectAttachmentsThumbnails--;
 }
 
-buildUnnamed650() {
+buildUnnamed977() {
   var o = new core.List<api.ActivityObjectAttachmentsThumbnails>();
   o.add(buildActivityObjectAttachmentsThumbnails());
   o.add(buildActivityObjectAttachmentsThumbnails());
   return o;
 }
 
-checkUnnamed650(core.List<api.ActivityObjectAttachmentsThumbnails> o) {
+checkUnnamed977(core.List<api.ActivityObjectAttachmentsThumbnails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachmentsThumbnails(o[0]);
   checkActivityObjectAttachmentsThumbnails(o[1]);
@@ -341,8 +341,8 @@
     o.id = "foo";
     o.image = buildActivityObjectAttachmentsImage();
     o.objectType = "foo";
-    o.previewThumbnails = buildUnnamed649();
-    o.thumbnails = buildUnnamed650();
+    o.previewThumbnails = buildUnnamed976();
+    o.thumbnails = buildUnnamed977();
     o.url = "foo";
   }
   buildCounterActivityObjectAttachments--;
@@ -359,21 +359,21 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkActivityObjectAttachmentsImage(o.image);
     unittest.expect(o.objectType, unittest.equals('foo'));
-    checkUnnamed649(o.previewThumbnails);
-    checkUnnamed650(o.thumbnails);
+    checkUnnamed976(o.previewThumbnails);
+    checkUnnamed977(o.thumbnails);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterActivityObjectAttachments--;
 }
 
-buildUnnamed651() {
+buildUnnamed978() {
   var o = new core.List<api.ActivityObjectAttachments>();
   o.add(buildActivityObjectAttachments());
   o.add(buildActivityObjectAttachments());
   return o;
 }
 
-checkUnnamed651(core.List<api.ActivityObjectAttachments> o) {
+checkUnnamed978(core.List<api.ActivityObjectAttachments> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachments(o[0]);
   checkActivityObjectAttachments(o[1]);
@@ -475,7 +475,7 @@
   buildCounterActivityObject++;
   if (buildCounterActivityObject < 3) {
     o.actor = buildActivityObjectActor();
-    o.attachments = buildUnnamed651();
+    o.attachments = buildUnnamed978();
     o.content = "foo";
     o.id = "foo";
     o.objectType = "foo";
@@ -494,7 +494,7 @@
   buildCounterActivityObject++;
   if (buildCounterActivityObject < 3) {
     checkActivityObjectActor(o.actor);
-    checkUnnamed651(o.attachments);
+    checkUnnamed978(o.attachments);
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
@@ -584,14 +584,14 @@
   buildCounterActivity--;
 }
 
-buildUnnamed652() {
+buildUnnamed979() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed652(core.List<api.Activity> o) {
+checkUnnamed979(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -604,7 +604,7 @@
   if (buildCounterActivityFeed < 3) {
     o.etag = "foo";
     o.id = "foo";
-    o.items = buildUnnamed652();
+    o.items = buildUnnamed979();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -621,7 +621,7 @@
   if (buildCounterActivityFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed652(o.items);
+    checkUnnamed979(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -659,14 +659,14 @@
   buildCounterAudience--;
 }
 
-buildUnnamed653() {
+buildUnnamed980() {
   var o = new core.List<api.Audience>();
   o.add(buildAudience());
   o.add(buildAudience());
   return o;
 }
 
-checkUnnamed653(core.List<api.Audience> o) {
+checkUnnamed980(core.List<api.Audience> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAudience(o[0]);
   checkAudience(o[1]);
@@ -678,7 +678,7 @@
   buildCounterAudiencesFeed++;
   if (buildCounterAudiencesFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed653();
+    o.items = buildUnnamed980();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -691,7 +691,7 @@
   buildCounterAudiencesFeed++;
   if (buildCounterAudiencesFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed653(o.items);
+    checkUnnamed980(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -749,14 +749,14 @@
   buildCounterCircle--;
 }
 
-buildUnnamed654() {
+buildUnnamed981() {
   var o = new core.List<api.Circle>();
   o.add(buildCircle());
   o.add(buildCircle());
   return o;
 }
 
-checkUnnamed654(core.List<api.Circle> o) {
+checkUnnamed981(core.List<api.Circle> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCircle(o[0]);
   checkCircle(o[1]);
@@ -768,7 +768,7 @@
   buildCounterCircleFeed++;
   if (buildCounterCircleFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed654();
+    o.items = buildUnnamed981();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -784,7 +784,7 @@
   buildCounterCircleFeed++;
   if (buildCounterCircleFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed654(o.items);
+    checkUnnamed981(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -860,14 +860,14 @@
   buildCounterCommentInReplyTo--;
 }
 
-buildUnnamed655() {
+buildUnnamed982() {
   var o = new core.List<api.CommentInReplyTo>();
   o.add(buildCommentInReplyTo());
   o.add(buildCommentInReplyTo());
   return o;
 }
 
-checkUnnamed655(core.List<api.CommentInReplyTo> o) {
+checkUnnamed982(core.List<api.CommentInReplyTo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentInReplyTo(o[0]);
   checkCommentInReplyTo(o[1]);
@@ -923,7 +923,7 @@
     o.actor = buildCommentActor();
     o.etag = "foo";
     o.id = "foo";
-    o.inReplyTo = buildUnnamed655();
+    o.inReplyTo = buildUnnamed982();
     o.kind = "foo";
     o.object = buildCommentObject();
     o.plusoners = buildCommentPlusoners();
@@ -942,7 +942,7 @@
     checkCommentActor(o.actor);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed655(o.inReplyTo);
+    checkUnnamed982(o.inReplyTo);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkCommentObject(o.object);
     checkCommentPlusoners(o.plusoners);
@@ -954,14 +954,14 @@
   buildCounterComment--;
 }
 
-buildUnnamed656() {
+buildUnnamed983() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed656(core.List<api.Comment> o) {
+checkUnnamed983(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -974,7 +974,7 @@
   if (buildCounterCommentFeed < 3) {
     o.etag = "foo";
     o.id = "foo";
-    o.items = buildUnnamed656();
+    o.items = buildUnnamed983();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -990,7 +990,7 @@
   if (buildCounterCommentFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed656(o.items);
+    checkUnnamed983(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -1063,14 +1063,14 @@
   buildCounterMediaExif--;
 }
 
-buildUnnamed657() {
+buildUnnamed984() {
   var o = new core.List<api.Videostream>();
   o.add(buildVideostream());
   o.add(buildVideostream());
   return o;
 }
 
-checkUnnamed657(core.List<api.Videostream> o) {
+checkUnnamed984(core.List<api.Videostream> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideostream(o[0]);
   checkVideostream(o[1]);
@@ -1092,7 +1092,7 @@
     o.mediaUrl = "foo";
     o.published = core.DateTime.parse("2002-02-27T14:01:02");
     o.sizeBytes = "foo";
-    o.streams = buildUnnamed657();
+    o.streams = buildUnnamed984();
     o.summary = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
     o.url = "foo";
@@ -1118,7 +1118,7 @@
     unittest.expect(o.mediaUrl, unittest.equals('foo'));
     unittest.expect(o.published, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.sizeBytes, unittest.equals('foo'));
-    checkUnnamed657(o.streams);
+    checkUnnamed984(o.streams);
     unittest.expect(o.summary, unittest.equals('foo'));
     unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.url, unittest.equals('foo'));
@@ -1129,14 +1129,14 @@
   buildCounterMedia--;
 }
 
-buildUnnamed658() {
+buildUnnamed985() {
   var o = new core.List<api.Person>();
   o.add(buildPerson());
   o.add(buildPerson());
   return o;
 }
 
-checkUnnamed658(core.List<api.Person> o) {
+checkUnnamed985(core.List<api.Person> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPerson(o[0]);
   checkPerson(o[1]);
@@ -1148,7 +1148,7 @@
   buildCounterPeopleFeed++;
   if (buildCounterPeopleFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed658();
+    o.items = buildUnnamed985();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1163,7 +1163,7 @@
   buildCounterPeopleFeed++;
   if (buildCounterPeopleFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed658(o.items);
+    checkUnnamed985(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1261,14 +1261,14 @@
   buildCounterPersonEmails--;
 }
 
-buildUnnamed659() {
+buildUnnamed986() {
   var o = new core.List<api.PersonEmails>();
   o.add(buildPersonEmails());
   o.add(buildPersonEmails());
   return o;
 }
 
-checkUnnamed659(core.List<api.PersonEmails> o) {
+checkUnnamed986(core.List<api.PersonEmails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonEmails(o[0]);
   checkPersonEmails(o[1]);
@@ -1359,14 +1359,14 @@
   buildCounterPersonOrganizations--;
 }
 
-buildUnnamed660() {
+buildUnnamed987() {
   var o = new core.List<api.PersonOrganizations>();
   o.add(buildPersonOrganizations());
   o.add(buildPersonOrganizations());
   return o;
 }
 
-checkUnnamed660(core.List<api.PersonOrganizations> o) {
+checkUnnamed987(core.List<api.PersonOrganizations> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonOrganizations(o[0]);
   checkPersonOrganizations(o[1]);
@@ -1393,14 +1393,14 @@
   buildCounterPersonPlacesLived--;
 }
 
-buildUnnamed661() {
+buildUnnamed988() {
   var o = new core.List<api.PersonPlacesLived>();
   o.add(buildPersonPlacesLived());
   o.add(buildPersonPlacesLived());
   return o;
 }
 
-checkUnnamed661(core.List<api.PersonPlacesLived> o) {
+checkUnnamed988(core.List<api.PersonPlacesLived> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonPlacesLived(o[0]);
   checkPersonPlacesLived(o[1]);
@@ -1429,14 +1429,14 @@
   buildCounterPersonUrls--;
 }
 
-buildUnnamed662() {
+buildUnnamed989() {
   var o = new core.List<api.PersonUrls>();
   o.add(buildPersonUrls());
   o.add(buildPersonUrls());
   return o;
 }
 
-checkUnnamed662(core.List<api.PersonUrls> o) {
+checkUnnamed989(core.List<api.PersonUrls> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonUrls(o[0]);
   checkPersonUrls(o[1]);
@@ -1455,7 +1455,7 @@
     o.currentLocation = "foo";
     o.displayName = "foo";
     o.domain = "foo";
-    o.emails = buildUnnamed659();
+    o.emails = buildUnnamed986();
     o.etag = "foo";
     o.gender = "foo";
     o.id = "foo";
@@ -1466,14 +1466,14 @@
     o.nickname = "foo";
     o.objectType = "foo";
     o.occupation = "foo";
-    o.organizations = buildUnnamed660();
-    o.placesLived = buildUnnamed661();
+    o.organizations = buildUnnamed987();
+    o.placesLived = buildUnnamed988();
     o.plusOneCount = 42;
     o.relationshipStatus = "foo";
     o.skills = "foo";
     o.tagline = "foo";
     o.url = "foo";
-    o.urls = buildUnnamed662();
+    o.urls = buildUnnamed989();
     o.verified = true;
   }
   buildCounterPerson--;
@@ -1491,7 +1491,7 @@
     unittest.expect(o.currentLocation, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.domain, unittest.equals('foo'));
-    checkUnnamed659(o.emails);
+    checkUnnamed986(o.emails);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.gender, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -1502,14 +1502,14 @@
     unittest.expect(o.nickname, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
     unittest.expect(o.occupation, unittest.equals('foo'));
-    checkUnnamed660(o.organizations);
-    checkUnnamed661(o.placesLived);
+    checkUnnamed987(o.organizations);
+    checkUnnamed988(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'));
-    checkUnnamed662(o.urls);
+    checkUnnamed989(o.urls);
     unittest.expect(o.verified, unittest.isTrue);
   }
   buildCounterPerson--;
@@ -1630,53 +1630,53 @@
   buildCounterVideostream--;
 }
 
-buildUnnamed663() {
+buildUnnamed990() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed663(core.List<core.String> o) {
+checkUnnamed990(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed664() {
+buildUnnamed991() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed664(core.List<core.String> o) {
+checkUnnamed991(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed665() {
+buildUnnamed992() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed665(core.List<core.String> o) {
+checkUnnamed992(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed666() {
+buildUnnamed993() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed666(core.List<core.String> o) {
+checkUnnamed993(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2401,8 +2401,8 @@
       var mock = new common_test.HttpServerMock();
       api.CirclesResourceApi res = new api.PlusDomainsApi(mock).circles;
       var arg_circleId = "foo";
-      var arg_email = buildUnnamed663();
-      var arg_userId = buildUnnamed664();
+      var arg_email = buildUnnamed990();
+      var arg_userId = buildUnnamed991();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2721,8 +2721,8 @@
       var mock = new common_test.HttpServerMock();
       api.CirclesResourceApi res = new api.PlusDomainsApi(mock).circles;
       var arg_circleId = "foo";
-      var arg_email = buildUnnamed665();
-      var arg_userId = buildUnnamed666();
+      var arg_email = buildUnnamed992();
+      var arg_userId = buildUnnamed993();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
diff --git a/generated/googleapis/test/prediction/v1_6_test.dart b/generated/googleapis/test/prediction/v1_6_test.dart
index 0f6a7bc..792c78d 100644
--- a/generated/googleapis/test/prediction/v1_6_test.dart
+++ b/generated/googleapis/test/prediction/v1_6_test.dart
@@ -37,14 +37,14 @@
   buildCounterAnalyzeDataDescriptionFeaturesCategoricalValues--;
 }
 
-buildUnnamed799() {
+buildUnnamed994() {
   var o = new core.List<api.AnalyzeDataDescriptionFeaturesCategoricalValues>();
   o.add(buildAnalyzeDataDescriptionFeaturesCategoricalValues());
   o.add(buildAnalyzeDataDescriptionFeaturesCategoricalValues());
   return o;
 }
 
-checkUnnamed799(core.List<api.AnalyzeDataDescriptionFeaturesCategoricalValues> o) {
+checkUnnamed994(core.List<api.AnalyzeDataDescriptionFeaturesCategoricalValues> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnalyzeDataDescriptionFeaturesCategoricalValues(o[0]);
   checkAnalyzeDataDescriptionFeaturesCategoricalValues(o[1]);
@@ -56,7 +56,7 @@
   buildCounterAnalyzeDataDescriptionFeaturesCategorical++;
   if (buildCounterAnalyzeDataDescriptionFeaturesCategorical < 3) {
     o.count = "foo";
-    o.values = buildUnnamed799();
+    o.values = buildUnnamed994();
   }
   buildCounterAnalyzeDataDescriptionFeaturesCategorical--;
   return o;
@@ -66,7 +66,7 @@
   buildCounterAnalyzeDataDescriptionFeaturesCategorical++;
   if (buildCounterAnalyzeDataDescriptionFeaturesCategorical < 3) {
     unittest.expect(o.count, unittest.equals('foo'));
-    checkUnnamed799(o.values);
+    checkUnnamed994(o.values);
   }
   buildCounterAnalyzeDataDescriptionFeaturesCategorical--;
 }
@@ -138,14 +138,14 @@
   buildCounterAnalyzeDataDescriptionFeatures--;
 }
 
-buildUnnamed800() {
+buildUnnamed995() {
   var o = new core.List<api.AnalyzeDataDescriptionFeatures>();
   o.add(buildAnalyzeDataDescriptionFeatures());
   o.add(buildAnalyzeDataDescriptionFeatures());
   return o;
 }
 
-checkUnnamed800(core.List<api.AnalyzeDataDescriptionFeatures> o) {
+checkUnnamed995(core.List<api.AnalyzeDataDescriptionFeatures> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnalyzeDataDescriptionFeatures(o[0]);
   checkAnalyzeDataDescriptionFeatures(o[1]);
@@ -195,14 +195,14 @@
   buildCounterAnalyzeDataDescriptionOutputFeatureText--;
 }
 
-buildUnnamed801() {
+buildUnnamed996() {
   var o = new core.List<api.AnalyzeDataDescriptionOutputFeatureText>();
   o.add(buildAnalyzeDataDescriptionOutputFeatureText());
   o.add(buildAnalyzeDataDescriptionOutputFeatureText());
   return o;
 }
 
-checkUnnamed801(core.List<api.AnalyzeDataDescriptionOutputFeatureText> o) {
+checkUnnamed996(core.List<api.AnalyzeDataDescriptionOutputFeatureText> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnalyzeDataDescriptionOutputFeatureText(o[0]);
   checkAnalyzeDataDescriptionOutputFeatureText(o[1]);
@@ -214,7 +214,7 @@
   buildCounterAnalyzeDataDescriptionOutputFeature++;
   if (buildCounterAnalyzeDataDescriptionOutputFeature < 3) {
     o.numeric = buildAnalyzeDataDescriptionOutputFeatureNumeric();
-    o.text = buildUnnamed801();
+    o.text = buildUnnamed996();
   }
   buildCounterAnalyzeDataDescriptionOutputFeature--;
   return o;
@@ -224,7 +224,7 @@
   buildCounterAnalyzeDataDescriptionOutputFeature++;
   if (buildCounterAnalyzeDataDescriptionOutputFeature < 3) {
     checkAnalyzeDataDescriptionOutputFeatureNumeric(o.numeric);
-    checkUnnamed801(o.text);
+    checkUnnamed996(o.text);
   }
   buildCounterAnalyzeDataDescriptionOutputFeature--;
 }
@@ -234,7 +234,7 @@
   var o = new api.AnalyzeDataDescription();
   buildCounterAnalyzeDataDescription++;
   if (buildCounterAnalyzeDataDescription < 3) {
-    o.features = buildUnnamed800();
+    o.features = buildUnnamed995();
     o.outputFeature = buildAnalyzeDataDescriptionOutputFeature();
   }
   buildCounterAnalyzeDataDescription--;
@@ -244,72 +244,72 @@
 checkAnalyzeDataDescription(api.AnalyzeDataDescription o) {
   buildCounterAnalyzeDataDescription++;
   if (buildCounterAnalyzeDataDescription < 3) {
-    checkUnnamed800(o.features);
+    checkUnnamed995(o.features);
     checkAnalyzeDataDescriptionOutputFeature(o.outputFeature);
   }
   buildCounterAnalyzeDataDescription--;
 }
 
-buildUnnamed802() {
+buildUnnamed997() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed802(core.Map<core.String, core.String> o) {
+checkUnnamed997(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'));
 }
 
-buildUnnamed803() {
+buildUnnamed998() {
   var o = new core.List<core.Map<core.String, core.String>>();
-  o.add(buildUnnamed802());
-  o.add(buildUnnamed802());
+  o.add(buildUnnamed997());
+  o.add(buildUnnamed997());
   return o;
 }
 
-checkUnnamed803(core.List<core.Map<core.String, core.String>> o) {
+checkUnnamed998(core.List<core.Map<core.String, core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed802(o[0]);
-  checkUnnamed802(o[1]);
+  checkUnnamed997(o[0]);
+  checkUnnamed997(o[1]);
 }
 
-buildUnnamed804() {
+buildUnnamed999() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed804(core.Map<core.String, core.String> o) {
+checkUnnamed999(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'));
 }
 
-buildUnnamed805() {
+buildUnnamed1000() {
   var o = new core.Map<core.String, core.Map<core.String, core.String>>();
-  o["x"] = buildUnnamed804();
-  o["y"] = buildUnnamed804();
+  o["x"] = buildUnnamed999();
+  o["y"] = buildUnnamed999();
   return o;
 }
 
-checkUnnamed805(core.Map<core.String, core.Map<core.String, core.String>> o) {
+checkUnnamed1000(core.Map<core.String, core.Map<core.String, core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed804(o["x"]);
-  checkUnnamed804(o["y"]);
+  checkUnnamed999(o["x"]);
+  checkUnnamed999(o["y"]);
 }
 
-buildUnnamed806() {
+buildUnnamed1001() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed806(core.Map<core.String, core.String> o) {
+checkUnnamed1001(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,8 +320,8 @@
   var o = new api.AnalyzeModelDescription();
   buildCounterAnalyzeModelDescription++;
   if (buildCounterAnalyzeModelDescription < 3) {
-    o.confusionMatrix = buildUnnamed805();
-    o.confusionMatrixRowTotals = buildUnnamed806();
+    o.confusionMatrix = buildUnnamed1000();
+    o.confusionMatrixRowTotals = buildUnnamed1001();
     o.modelinfo = buildInsert2();
   }
   buildCounterAnalyzeModelDescription--;
@@ -331,8 +331,8 @@
 checkAnalyzeModelDescription(api.AnalyzeModelDescription o) {
   buildCounterAnalyzeModelDescription++;
   if (buildCounterAnalyzeModelDescription < 3) {
-    checkUnnamed805(o.confusionMatrix);
-    checkUnnamed806(o.confusionMatrixRowTotals);
+    checkUnnamed1000(o.confusionMatrix);
+    checkUnnamed1001(o.confusionMatrixRowTotals);
     checkInsert2(o.modelinfo);
   }
   buildCounterAnalyzeModelDescription--;
@@ -344,7 +344,7 @@
   buildCounterAnalyze++;
   if (buildCounterAnalyze < 3) {
     o.dataDescription = buildAnalyzeDataDescription();
-    o.errors = buildUnnamed803();
+    o.errors = buildUnnamed998();
     o.id = "foo";
     o.kind = "foo";
     o.modelDescription = buildAnalyzeModelDescription();
@@ -358,7 +358,7 @@
   buildCounterAnalyze++;
   if (buildCounterAnalyze < 3) {
     checkAnalyzeDataDescription(o.dataDescription);
-    checkUnnamed803(o.errors);
+    checkUnnamed998(o.errors);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkAnalyzeModelDescription(o.modelDescription);
@@ -367,14 +367,14 @@
   buildCounterAnalyze--;
 }
 
-buildUnnamed807() {
+buildUnnamed1002() {
   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'});
   return o;
 }
 
-checkUnnamed807(core.List<core.Object> o) {
+checkUnnamed1002(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')); 
@@ -385,7 +385,7 @@
   var o = new api.InputInput();
   buildCounterInputInput++;
   if (buildCounterInputInput < 3) {
-    o.csvInstance = buildUnnamed807();
+    o.csvInstance = buildUnnamed1002();
   }
   buildCounterInputInput--;
   return o;
@@ -394,7 +394,7 @@
 checkInputInput(api.InputInput o) {
   buildCounterInputInput++;
   if (buildCounterInputInput < 3) {
-    checkUnnamed807(o.csvInstance);
+    checkUnnamed1002(o.csvInstance);
   }
   buildCounterInputInput--;
 }
@@ -418,14 +418,14 @@
   buildCounterInput--;
 }
 
-buildUnnamed808() {
+buildUnnamed1003() {
   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'});
   return o;
 }
 
-checkUnnamed808(core.List<core.Object> o) {
+checkUnnamed1003(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')); 
@@ -436,7 +436,7 @@
   var o = new api.InsertTrainingInstances();
   buildCounterInsertTrainingInstances++;
   if (buildCounterInsertTrainingInstances < 3) {
-    o.csvInstance = buildUnnamed808();
+    o.csvInstance = buildUnnamed1003();
     o.output = "foo";
   }
   buildCounterInsertTrainingInstances--;
@@ -446,49 +446,49 @@
 checkInsertTrainingInstances(api.InsertTrainingInstances o) {
   buildCounterInsertTrainingInstances++;
   if (buildCounterInsertTrainingInstances < 3) {
-    checkUnnamed808(o.csvInstance);
+    checkUnnamed1003(o.csvInstance);
     unittest.expect(o.output, unittest.equals('foo'));
   }
   buildCounterInsertTrainingInstances--;
 }
 
-buildUnnamed809() {
+buildUnnamed1004() {
   var o = new core.List<api.InsertTrainingInstances>();
   o.add(buildInsertTrainingInstances());
   o.add(buildInsertTrainingInstances());
   return o;
 }
 
-checkUnnamed809(core.List<api.InsertTrainingInstances> o) {
+checkUnnamed1004(core.List<api.InsertTrainingInstances> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInsertTrainingInstances(o[0]);
   checkInsertTrainingInstances(o[1]);
 }
 
-buildUnnamed810() {
+buildUnnamed1005() {
   var o = new core.Map<core.String, core.double>();
   o["x"] = 42.0;
   o["y"] = 42.0;
   return o;
 }
 
-checkUnnamed810(core.Map<core.String, core.double> o) {
+checkUnnamed1005(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));
 }
 
-buildUnnamed811() {
+buildUnnamed1006() {
   var o = new core.List<core.Map<core.String, core.double>>();
-  o.add(buildUnnamed810());
-  o.add(buildUnnamed810());
+  o.add(buildUnnamed1005());
+  o.add(buildUnnamed1005());
   return o;
 }
 
-checkUnnamed811(core.List<core.Map<core.String, core.double>> o) {
+checkUnnamed1006(core.List<core.Map<core.String, core.double>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed810(o[0]);
-  checkUnnamed810(o[1]);
+  checkUnnamed1005(o[0]);
+  checkUnnamed1005(o[1]);
 }
 
 core.int buildCounterInsert = 0;
@@ -502,8 +502,8 @@
     o.storageDataLocation = "foo";
     o.storagePMMLLocation = "foo";
     o.storagePMMLModelLocation = "foo";
-    o.trainingInstances = buildUnnamed809();
-    o.utility = buildUnnamed811();
+    o.trainingInstances = buildUnnamed1004();
+    o.utility = buildUnnamed1006();
   }
   buildCounterInsert--;
   return o;
@@ -518,8 +518,8 @@
     unittest.expect(o.storageDataLocation, unittest.equals('foo'));
     unittest.expect(o.storagePMMLLocation, unittest.equals('foo'));
     unittest.expect(o.storagePMMLModelLocation, unittest.equals('foo'));
-    checkUnnamed809(o.trainingInstances);
-    checkUnnamed811(o.utility);
+    checkUnnamed1004(o.trainingInstances);
+    checkUnnamed1006(o.utility);
   }
   buildCounterInsert--;
 }
@@ -592,14 +592,14 @@
   buildCounterInsert2--;
 }
 
-buildUnnamed812() {
+buildUnnamed1007() {
   var o = new core.List<api.Insert2>();
   o.add(buildInsert2());
   o.add(buildInsert2());
   return o;
 }
 
-checkUnnamed812(core.List<api.Insert2> o) {
+checkUnnamed1007(core.List<api.Insert2> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInsert2(o[0]);
   checkInsert2(o[1]);
@@ -610,7 +610,7 @@
   var o = new api.List();
   buildCounterList++;
   if (buildCounterList < 3) {
-    o.items = buildUnnamed812();
+    o.items = buildUnnamed1007();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -622,7 +622,7 @@
 checkList(api.List o) {
   buildCounterList++;
   if (buildCounterList < 3) {
-    checkUnnamed812(o.items);
+    checkUnnamed1007(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -651,14 +651,14 @@
   buildCounterOutputOutputMulti--;
 }
 
-buildUnnamed813() {
+buildUnnamed1008() {
   var o = new core.List<api.OutputOutputMulti>();
   o.add(buildOutputOutputMulti());
   o.add(buildOutputOutputMulti());
   return o;
 }
 
-checkUnnamed813(core.List<api.OutputOutputMulti> o) {
+checkUnnamed1008(core.List<api.OutputOutputMulti> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOutputOutputMulti(o[0]);
   checkOutputOutputMulti(o[1]);
@@ -672,8 +672,8 @@
     o.id = "foo";
     o.kind = "foo";
     o.outputLabel = "foo";
-    o.outputMulti = buildUnnamed813();
-    o.outputValue = "foo";
+    o.outputMulti = buildUnnamed1008();
+    o.outputValue = 42.0;
     o.selfLink = "foo";
   }
   buildCounterOutput--;
@@ -686,21 +686,21 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.outputLabel, unittest.equals('foo'));
-    checkUnnamed813(o.outputMulti);
-    unittest.expect(o.outputValue, unittest.equals('foo'));
+    checkUnnamed1008(o.outputMulti);
+    unittest.expect(o.outputValue, unittest.equals(42.0));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
   buildCounterOutput--;
 }
 
-buildUnnamed814() {
+buildUnnamed1009() {
   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'});
   return o;
 }
 
-checkUnnamed814(core.List<core.Object> o) {
+checkUnnamed1009(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')); 
@@ -711,7 +711,7 @@
   var o = new api.Update();
   buildCounterUpdate++;
   if (buildCounterUpdate < 3) {
-    o.csvInstance = buildUnnamed814();
+    o.csvInstance = buildUnnamed1009();
     o.output = "foo";
   }
   buildCounterUpdate--;
@@ -721,7 +721,7 @@
 checkUpdate(api.Update o) {
   buildCounterUpdate++;
   if (buildCounterUpdate < 3) {
-    checkUnnamed814(o.csvInstance);
+    checkUnnamed1009(o.csvInstance);
     unittest.expect(o.output, unittest.equals('foo'));
   }
   buildCounterUpdate--;
diff --git a/generated/googleapis/test/qpxexpress/v1_test.dart b/generated/googleapis/test/qpxexpress/v1_test.dart
index daea4bc..e2df23d 100644
--- a/generated/googleapis/test/qpxexpress/v1_test.dart
+++ b/generated/googleapis/test/qpxexpress/v1_test.dart
@@ -64,14 +64,14 @@
   buildCounterAirportData--;
 }
 
-buildUnnamed1() {
+buildUnnamed1010() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1(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'));
@@ -84,7 +84,7 @@
   if (buildCounterBagDescriptor < 3) {
     o.commercialName = "foo";
     o.count = 42;
-    o.description = buildUnnamed1();
+    o.description = buildUnnamed1010();
     o.kind = "foo";
     o.subcode = "foo";
   }
@@ -97,7 +97,7 @@
   if (buildCounterBagDescriptor < 3) {
     unittest.expect(o.commercialName, unittest.equals('foo'));
     unittest.expect(o.count, unittest.equals(42));
-    checkUnnamed1(o.description);
+    checkUnnamed1010(o.description);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.subcode, unittest.equals('foo'));
   }
@@ -152,66 +152,66 @@
   buildCounterCityData--;
 }
 
-buildUnnamed2() {
+buildUnnamed1011() {
   var o = new core.List<api.AircraftData>();
   o.add(buildAircraftData());
   o.add(buildAircraftData());
   return o;
 }
 
-checkUnnamed2(core.List<api.AircraftData> o) {
+checkUnnamed1011(core.List<api.AircraftData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAircraftData(o[0]);
   checkAircraftData(o[1]);
 }
 
-buildUnnamed3() {
+buildUnnamed1012() {
   var o = new core.List<api.AirportData>();
   o.add(buildAirportData());
   o.add(buildAirportData());
   return o;
 }
 
-checkUnnamed3(core.List<api.AirportData> o) {
+checkUnnamed1012(core.List<api.AirportData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAirportData(o[0]);
   checkAirportData(o[1]);
 }
 
-buildUnnamed4() {
+buildUnnamed1013() {
   var o = new core.List<api.CarrierData>();
   o.add(buildCarrierData());
   o.add(buildCarrierData());
   return o;
 }
 
-checkUnnamed4(core.List<api.CarrierData> o) {
+checkUnnamed1013(core.List<api.CarrierData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCarrierData(o[0]);
   checkCarrierData(o[1]);
 }
 
-buildUnnamed5() {
+buildUnnamed1014() {
   var o = new core.List<api.CityData>();
   o.add(buildCityData());
   o.add(buildCityData());
   return o;
 }
 
-checkUnnamed5(core.List<api.CityData> o) {
+checkUnnamed1014(core.List<api.CityData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCityData(o[0]);
   checkCityData(o[1]);
 }
 
-buildUnnamed6() {
+buildUnnamed1015() {
   var o = new core.List<api.TaxData>();
   o.add(buildTaxData());
   o.add(buildTaxData());
   return o;
 }
 
-checkUnnamed6(core.List<api.TaxData> o) {
+checkUnnamed1015(core.List<api.TaxData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTaxData(o[0]);
   checkTaxData(o[1]);
@@ -222,12 +222,12 @@
   var o = new api.Data();
   buildCounterData++;
   if (buildCounterData < 3) {
-    o.aircraft = buildUnnamed2();
-    o.airport = buildUnnamed3();
-    o.carrier = buildUnnamed4();
-    o.city = buildUnnamed5();
+    o.aircraft = buildUnnamed1011();
+    o.airport = buildUnnamed1012();
+    o.carrier = buildUnnamed1013();
+    o.city = buildUnnamed1014();
     o.kind = "foo";
-    o.tax = buildUnnamed6();
+    o.tax = buildUnnamed1015();
   }
   buildCounterData--;
   return o;
@@ -236,12 +236,12 @@
 checkData(api.Data o) {
   buildCounterData++;
   if (buildCounterData < 3) {
-    checkUnnamed2(o.aircraft);
-    checkUnnamed3(o.airport);
-    checkUnnamed4(o.carrier);
-    checkUnnamed5(o.city);
+    checkUnnamed1011(o.aircraft);
+    checkUnnamed1012(o.airport);
+    checkUnnamed1013(o.carrier);
+    checkUnnamed1014(o.city);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed6(o.tax);
+    checkUnnamed1015(o.tax);
   }
   buildCounterData--;
 }
@@ -298,14 +298,14 @@
   buildCounterFlightInfo--;
 }
 
-buildUnnamed7() {
+buildUnnamed1016() {
   var o = new core.List<api.BagDescriptor>();
   o.add(buildBagDescriptor());
   o.add(buildBagDescriptor());
   return o;
 }
 
-checkUnnamed7(core.List<api.BagDescriptor> o) {
+checkUnnamed1016(core.List<api.BagDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBagDescriptor(o[0]);
   checkBagDescriptor(o[1]);
@@ -316,7 +316,7 @@
   var o = new api.FreeBaggageAllowance();
   buildCounterFreeBaggageAllowance++;
   if (buildCounterFreeBaggageAllowance < 3) {
-    o.bagDescriptor = buildUnnamed7();
+    o.bagDescriptor = buildUnnamed1016();
     o.kilos = 42;
     o.kilosPerPiece = 42;
     o.kind = "foo";
@@ -330,7 +330,7 @@
 checkFreeBaggageAllowance(api.FreeBaggageAllowance o) {
   buildCounterFreeBaggageAllowance++;
   if (buildCounterFreeBaggageAllowance < 3) {
-    checkUnnamed7(o.bagDescriptor);
+    checkUnnamed1016(o.bagDescriptor);
     unittest.expect(o.kilos, unittest.equals(42));
     unittest.expect(o.kilosPerPiece, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -420,40 +420,40 @@
   buildCounterPassengerCounts--;
 }
 
-buildUnnamed8() {
+buildUnnamed1017() {
   var o = new core.List<api.FareInfo>();
   o.add(buildFareInfo());
   o.add(buildFareInfo());
   return o;
 }
 
-checkUnnamed8(core.List<api.FareInfo> o) {
+checkUnnamed1017(core.List<api.FareInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFareInfo(o[0]);
   checkFareInfo(o[1]);
 }
 
-buildUnnamed9() {
+buildUnnamed1018() {
   var o = new core.List<api.SegmentPricing>();
   o.add(buildSegmentPricing());
   o.add(buildSegmentPricing());
   return o;
 }
 
-checkUnnamed9(core.List<api.SegmentPricing> o) {
+checkUnnamed1018(core.List<api.SegmentPricing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSegmentPricing(o[0]);
   checkSegmentPricing(o[1]);
 }
 
-buildUnnamed10() {
+buildUnnamed1019() {
   var o = new core.List<api.TaxInfo>();
   o.add(buildTaxInfo());
   o.add(buildTaxInfo());
   return o;
 }
 
-checkUnnamed10(core.List<api.TaxInfo> o) {
+checkUnnamed1019(core.List<api.TaxInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTaxInfo(o[0]);
   checkTaxInfo(o[1]);
@@ -465,7 +465,7 @@
   buildCounterPricingInfo++;
   if (buildCounterPricingInfo < 3) {
     o.baseFareTotal = "foo";
-    o.fare = buildUnnamed8();
+    o.fare = buildUnnamed1017();
     o.fareCalculation = "foo";
     o.kind = "foo";
     o.latestTicketingTime = "foo";
@@ -475,8 +475,8 @@
     o.saleFareTotal = "foo";
     o.saleTaxTotal = "foo";
     o.saleTotal = "foo";
-    o.segmentPricing = buildUnnamed9();
-    o.tax = buildUnnamed10();
+    o.segmentPricing = buildUnnamed1018();
+    o.tax = buildUnnamed1019();
   }
   buildCounterPricingInfo--;
   return o;
@@ -486,7 +486,7 @@
   buildCounterPricingInfo++;
   if (buildCounterPricingInfo < 3) {
     unittest.expect(o.baseFareTotal, unittest.equals('foo'));
-    checkUnnamed8(o.fare);
+    checkUnnamed1017(o.fare);
     unittest.expect(o.fareCalculation, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.latestTicketingTime, unittest.equals('foo'));
@@ -496,20 +496,20 @@
     unittest.expect(o.saleFareTotal, unittest.equals('foo'));
     unittest.expect(o.saleTaxTotal, unittest.equals('foo'));
     unittest.expect(o.saleTotal, unittest.equals('foo'));
-    checkUnnamed9(o.segmentPricing);
-    checkUnnamed10(o.tax);
+    checkUnnamed1018(o.segmentPricing);
+    checkUnnamed1019(o.tax);
   }
   buildCounterPricingInfo--;
 }
 
-buildUnnamed11() {
+buildUnnamed1020() {
   var o = new core.List<api.LegInfo>();
   o.add(buildLegInfo());
   o.add(buildLegInfo());
   return o;
 }
 
-checkUnnamed11(core.List<api.LegInfo> o) {
+checkUnnamed1020(core.List<api.LegInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLegInfo(o[0]);
   checkLegInfo(o[1]);
@@ -528,7 +528,7 @@
     o.flight = buildFlightInfo();
     o.id = "foo";
     o.kind = "foo";
-    o.leg = buildUnnamed11();
+    o.leg = buildUnnamed1020();
     o.marriedSegmentGroup = "foo";
     o.subjectToGovernmentApproval = true;
   }
@@ -547,21 +547,21 @@
     checkFlightInfo(o.flight);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed11(o.leg);
+    checkUnnamed1020(o.leg);
     unittest.expect(o.marriedSegmentGroup, unittest.equals('foo'));
     unittest.expect(o.subjectToGovernmentApproval, unittest.isTrue);
   }
   buildCounterSegmentInfo--;
 }
 
-buildUnnamed12() {
+buildUnnamed1021() {
   var o = new core.List<api.FreeBaggageAllowance>();
   o.add(buildFreeBaggageAllowance());
   o.add(buildFreeBaggageAllowance());
   return o;
 }
 
-checkUnnamed12(core.List<api.FreeBaggageAllowance> o) {
+checkUnnamed1021(core.List<api.FreeBaggageAllowance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFreeBaggageAllowance(o[0]);
   checkFreeBaggageAllowance(o[1]);
@@ -573,7 +573,7 @@
   buildCounterSegmentPricing++;
   if (buildCounterSegmentPricing < 3) {
     o.fareId = "foo";
-    o.freeBaggageOption = buildUnnamed12();
+    o.freeBaggageOption = buildUnnamed1021();
     o.kind = "foo";
     o.segmentId = "foo";
   }
@@ -585,21 +585,21 @@
   buildCounterSegmentPricing++;
   if (buildCounterSegmentPricing < 3) {
     unittest.expect(o.fareId, unittest.equals('foo'));
-    checkUnnamed12(o.freeBaggageOption);
+    checkUnnamed1021(o.freeBaggageOption);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.segmentId, unittest.equals('foo'));
   }
   buildCounterSegmentPricing--;
 }
 
-buildUnnamed13() {
+buildUnnamed1022() {
   var o = new core.List<api.SegmentInfo>();
   o.add(buildSegmentInfo());
   o.add(buildSegmentInfo());
   return o;
 }
 
-checkUnnamed13(core.List<api.SegmentInfo> o) {
+checkUnnamed1022(core.List<api.SegmentInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSegmentInfo(o[0]);
   checkSegmentInfo(o[1]);
@@ -612,7 +612,7 @@
   if (buildCounterSliceInfo < 3) {
     o.duration = 42;
     o.kind = "foo";
-    o.segment = buildUnnamed13();
+    o.segment = buildUnnamed1022();
   }
   buildCounterSliceInfo--;
   return o;
@@ -623,32 +623,32 @@
   if (buildCounterSliceInfo < 3) {
     unittest.expect(o.duration, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed13(o.segment);
+    checkUnnamed1022(o.segment);
   }
   buildCounterSliceInfo--;
 }
 
-buildUnnamed14() {
+buildUnnamed1023() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed14(core.List<core.String> o) {
+checkUnnamed1023(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed15() {
+buildUnnamed1024() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed15(core.List<core.String> o) {
+checkUnnamed1024(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -666,10 +666,10 @@
     o.maxConnectionDuration = 42;
     o.maxStops = 42;
     o.origin = "foo";
-    o.permittedCarrier = buildUnnamed14();
+    o.permittedCarrier = buildUnnamed1023();
     o.permittedDepartureTime = buildTimeOfDayRange();
     o.preferredCabin = "foo";
-    o.prohibitedCarrier = buildUnnamed15();
+    o.prohibitedCarrier = buildUnnamed1024();
   }
   buildCounterSliceInput--;
   return o;
@@ -685,10 +685,10 @@
     unittest.expect(o.maxConnectionDuration, unittest.equals(42));
     unittest.expect(o.maxStops, unittest.equals(42));
     unittest.expect(o.origin, unittest.equals('foo'));
-    checkUnnamed14(o.permittedCarrier);
+    checkUnnamed1023(o.permittedCarrier);
     checkTimeOfDayRange(o.permittedDepartureTime);
     unittest.expect(o.preferredCabin, unittest.equals('foo'));
-    checkUnnamed15(o.prohibitedCarrier);
+    checkUnnamed1024(o.prohibitedCarrier);
   }
   buildCounterSliceInput--;
 }
@@ -768,27 +768,27 @@
   buildCounterTimeOfDayRange--;
 }
 
-buildUnnamed16() {
+buildUnnamed1025() {
   var o = new core.List<api.PricingInfo>();
   o.add(buildPricingInfo());
   o.add(buildPricingInfo());
   return o;
 }
 
-checkUnnamed16(core.List<api.PricingInfo> o) {
+checkUnnamed1025(core.List<api.PricingInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPricingInfo(o[0]);
   checkPricingInfo(o[1]);
 }
 
-buildUnnamed17() {
+buildUnnamed1026() {
   var o = new core.List<api.SliceInfo>();
   o.add(buildSliceInfo());
   o.add(buildSliceInfo());
   return o;
 }
 
-checkUnnamed17(core.List<api.SliceInfo> o) {
+checkUnnamed1026(core.List<api.SliceInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSliceInfo(o[0]);
   checkSliceInfo(o[1]);
@@ -801,9 +801,9 @@
   if (buildCounterTripOption < 3) {
     o.id = "foo";
     o.kind = "foo";
-    o.pricing = buildUnnamed16();
+    o.pricing = buildUnnamed1025();
     o.saleTotal = "foo";
-    o.slice = buildUnnamed17();
+    o.slice = buildUnnamed1026();
   }
   buildCounterTripOption--;
   return o;
@@ -814,21 +814,21 @@
   if (buildCounterTripOption < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed16(o.pricing);
+    checkUnnamed1025(o.pricing);
     unittest.expect(o.saleTotal, unittest.equals('foo'));
-    checkUnnamed17(o.slice);
+    checkUnnamed1026(o.slice);
   }
   buildCounterTripOption--;
 }
 
-buildUnnamed18() {
+buildUnnamed1027() {
   var o = new core.List<api.SliceInput>();
   o.add(buildSliceInput());
   o.add(buildSliceInput());
   return o;
 }
 
-checkUnnamed18(core.List<api.SliceInput> o) {
+checkUnnamed1027(core.List<api.SliceInput> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSliceInput(o[0]);
   checkSliceInput(o[1]);
@@ -843,7 +843,7 @@
     o.passengers = buildPassengerCounts();
     o.refundable = true;
     o.saleCountry = "foo";
-    o.slice = buildUnnamed18();
+    o.slice = buildUnnamed1027();
     o.solutions = 42;
   }
   buildCounterTripOptionsRequest--;
@@ -857,20 +857,20 @@
     checkPassengerCounts(o.passengers);
     unittest.expect(o.refundable, unittest.isTrue);
     unittest.expect(o.saleCountry, unittest.equals('foo'));
-    checkUnnamed18(o.slice);
+    checkUnnamed1027(o.slice);
     unittest.expect(o.solutions, unittest.equals(42));
   }
   buildCounterTripOptionsRequest--;
 }
 
-buildUnnamed19() {
+buildUnnamed1028() {
   var o = new core.List<api.TripOption>();
   o.add(buildTripOption());
   o.add(buildTripOption());
   return o;
 }
 
-checkUnnamed19(core.List<api.TripOption> o) {
+checkUnnamed1028(core.List<api.TripOption> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTripOption(o[0]);
   checkTripOption(o[1]);
@@ -884,7 +884,7 @@
     o.data = buildData();
     o.kind = "foo";
     o.requestId = "foo";
-    o.tripOption = buildUnnamed19();
+    o.tripOption = buildUnnamed1028();
   }
   buildCounterTripOptionsResponse--;
   return o;
@@ -896,7 +896,7 @@
     checkData(o.data);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.requestId, unittest.equals('foo'));
-    checkUnnamed19(o.tripOption);
+    checkUnnamed1028(o.tripOption);
   }
   buildCounterTripOptionsResponse--;
 }
diff --git a/generated/googleapis/test/reseller/v1_test.dart b/generated/googleapis/test/reseller/v1_test.dart
index 1576396..fd2858c 100644
--- a/generated/googleapis/test/reseller/v1_test.dart
+++ b/generated/googleapis/test/reseller/v1_test.dart
@@ -284,14 +284,14 @@
   buildCounterSubscription--;
 }
 
-buildUnnamed970() {
+buildUnnamed1029() {
   var o = new core.List<api.Subscription>();
   o.add(buildSubscription());
   o.add(buildSubscription());
   return o;
 }
 
-checkUnnamed970(core.List<api.Subscription> o) {
+checkUnnamed1029(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubscription(o[0]);
   checkSubscription(o[1]);
@@ -304,7 +304,7 @@
   if (buildCounterSubscriptions < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.subscriptions = buildUnnamed970();
+    o.subscriptions = buildUnnamed1029();
   }
   buildCounterSubscriptions--;
   return o;
@@ -315,7 +315,7 @@
   if (buildCounterSubscriptions < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed970(o.subscriptions);
+    checkUnnamed1029(o.subscriptions);
   }
   buildCounterSubscriptions--;
 }
diff --git a/generated/googleapis/test/siteverification/v1_test.dart b/generated/googleapis/test/siteverification/v1_test.dart
index d20953b..69dbca6 100644
--- a/generated/googleapis/test/siteverification/v1_test.dart
+++ b/generated/googleapis/test/siteverification/v1_test.dart
@@ -79,14 +79,14 @@
   buildCounterSiteVerificationWebResourceGettokenResponse--;
 }
 
-buildUnnamed161() {
+buildUnnamed1030() {
   var o = new core.List<api.SiteVerificationWebResourceResource>();
   o.add(buildSiteVerificationWebResourceResource());
   o.add(buildSiteVerificationWebResourceResource());
   return o;
 }
 
-checkUnnamed161(core.List<api.SiteVerificationWebResourceResource> o) {
+checkUnnamed1030(core.List<api.SiteVerificationWebResourceResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSiteVerificationWebResourceResource(o[0]);
   checkSiteVerificationWebResourceResource(o[1]);
@@ -97,7 +97,7 @@
   var o = new api.SiteVerificationWebResourceListResponse();
   buildCounterSiteVerificationWebResourceListResponse++;
   if (buildCounterSiteVerificationWebResourceListResponse < 3) {
-    o.items = buildUnnamed161();
+    o.items = buildUnnamed1030();
   }
   buildCounterSiteVerificationWebResourceListResponse--;
   return o;
@@ -106,19 +106,19 @@
 checkSiteVerificationWebResourceListResponse(api.SiteVerificationWebResourceListResponse o) {
   buildCounterSiteVerificationWebResourceListResponse++;
   if (buildCounterSiteVerificationWebResourceListResponse < 3) {
-    checkUnnamed161(o.items);
+    checkUnnamed1030(o.items);
   }
   buildCounterSiteVerificationWebResourceListResponse--;
 }
 
-buildUnnamed162() {
+buildUnnamed1031() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed162(core.List<core.String> o) {
+checkUnnamed1031(core.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 +151,7 @@
   buildCounterSiteVerificationWebResourceResource++;
   if (buildCounterSiteVerificationWebResourceResource < 3) {
     o.id = "foo";
-    o.owners = buildUnnamed162();
+    o.owners = buildUnnamed1031();
     o.site = buildSiteVerificationWebResourceResourceSite();
   }
   buildCounterSiteVerificationWebResourceResource--;
@@ -162,7 +162,7 @@
   buildCounterSiteVerificationWebResourceResource++;
   if (buildCounterSiteVerificationWebResourceResource < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed162(o.owners);
+    checkUnnamed1031(o.owners);
     checkSiteVerificationWebResourceResourceSite(o.site);
   }
   buildCounterSiteVerificationWebResourceResource--;
diff --git a/generated/googleapis/test/storage/v1_test.dart b/generated/googleapis/test/storage/v1_test.dart
index 6b47643..36e45b1 100644
--- a/generated/googleapis/test/storage/v1_test.dart
+++ b/generated/googleapis/test/storage/v1_test.dart
@@ -16,53 +16,53 @@
 
 
 
-buildUnnamed493() {
+buildUnnamed1032() {
   var o = new core.List<api.BucketAccessControl>();
   o.add(buildBucketAccessControl());
   o.add(buildBucketAccessControl());
   return o;
 }
 
-checkUnnamed493(core.List<api.BucketAccessControl> o) {
+checkUnnamed1032(core.List<api.BucketAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucketAccessControl(o[0]);
   checkBucketAccessControl(o[1]);
 }
 
-buildUnnamed494() {
+buildUnnamed1033() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed494(core.List<core.String> o) {
+checkUnnamed1033(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed495() {
+buildUnnamed1034() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed495(core.List<core.String> o) {
+checkUnnamed1034(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed496() {
+buildUnnamed1035() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed496(core.List<core.String> o) {
+checkUnnamed1035(core.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,9 +74,9 @@
   buildCounterBucketCors++;
   if (buildCounterBucketCors < 3) {
     o.maxAgeSeconds = 42;
-    o.method = buildUnnamed494();
-    o.origin = buildUnnamed495();
-    o.responseHeader = buildUnnamed496();
+    o.method = buildUnnamed1033();
+    o.origin = buildUnnamed1034();
+    o.responseHeader = buildUnnamed1035();
   }
   buildCounterBucketCors--;
   return o;
@@ -86,34 +86,34 @@
   buildCounterBucketCors++;
   if (buildCounterBucketCors < 3) {
     unittest.expect(o.maxAgeSeconds, unittest.equals(42));
-    checkUnnamed494(o.method);
-    checkUnnamed495(o.origin);
-    checkUnnamed496(o.responseHeader);
+    checkUnnamed1033(o.method);
+    checkUnnamed1034(o.origin);
+    checkUnnamed1035(o.responseHeader);
   }
   buildCounterBucketCors--;
 }
 
-buildUnnamed497() {
+buildUnnamed1036() {
   var o = new core.List<api.BucketCors>();
   o.add(buildBucketCors());
   o.add(buildBucketCors());
   return o;
 }
 
-checkUnnamed497(core.List<api.BucketCors> o) {
+checkUnnamed1036(core.List<api.BucketCors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucketCors(o[0]);
   checkBucketCors(o[1]);
 }
 
-buildUnnamed498() {
+buildUnnamed1037() {
   var o = new core.List<api.ObjectAccessControl>();
   o.add(buildObjectAccessControl());
   o.add(buildObjectAccessControl());
   return o;
 }
 
-checkUnnamed498(core.List<api.ObjectAccessControl> o) {
+checkUnnamed1037(core.List<api.ObjectAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkObjectAccessControl(o[0]);
   checkObjectAccessControl(o[1]);
@@ -184,14 +184,14 @@
   buildCounterBucketLifecycleRule--;
 }
 
-buildUnnamed499() {
+buildUnnamed1038() {
   var o = new core.List<api.BucketLifecycleRule>();
   o.add(buildBucketLifecycleRule());
   o.add(buildBucketLifecycleRule());
   return o;
 }
 
-checkUnnamed499(core.List<api.BucketLifecycleRule> o) {
+checkUnnamed1038(core.List<api.BucketLifecycleRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucketLifecycleRule(o[0]);
   checkBucketLifecycleRule(o[1]);
@@ -202,7 +202,7 @@
   var o = new api.BucketLifecycle();
   buildCounterBucketLifecycle++;
   if (buildCounterBucketLifecycle < 3) {
-    o.rule = buildUnnamed499();
+    o.rule = buildUnnamed1038();
   }
   buildCounterBucketLifecycle--;
   return o;
@@ -211,7 +211,7 @@
 checkBucketLifecycle(api.BucketLifecycle o) {
   buildCounterBucketLifecycle++;
   if (buildCounterBucketLifecycle < 3) {
-    checkUnnamed499(o.rule);
+    checkUnnamed1038(o.rule);
   }
   buildCounterBucketLifecycle--;
 }
@@ -303,9 +303,9 @@
   var o = new api.Bucket();
   buildCounterBucket++;
   if (buildCounterBucket < 3) {
-    o.acl = buildUnnamed493();
-    o.cors = buildUnnamed497();
-    o.defaultObjectAcl = buildUnnamed498();
+    o.acl = buildUnnamed1032();
+    o.cors = buildUnnamed1036();
+    o.defaultObjectAcl = buildUnnamed1037();
     o.etag = "foo";
     o.id = "foo";
     o.kind = "foo";
@@ -329,9 +329,9 @@
 checkBucket(api.Bucket o) {
   buildCounterBucket++;
   if (buildCounterBucket < 3) {
-    checkUnnamed493(o.acl);
-    checkUnnamed497(o.cors);
-    checkUnnamed498(o.defaultObjectAcl);
+    checkUnnamed1032(o.acl);
+    checkUnnamed1036(o.cors);
+    checkUnnamed1037(o.defaultObjectAcl);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -411,14 +411,14 @@
   buildCounterBucketAccessControl--;
 }
 
-buildUnnamed500() {
+buildUnnamed1039() {
   var o = new core.List<api.BucketAccessControl>();
   o.add(buildBucketAccessControl());
   o.add(buildBucketAccessControl());
   return o;
 }
 
-checkUnnamed500(core.List<api.BucketAccessControl> o) {
+checkUnnamed1039(core.List<api.BucketAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucketAccessControl(o[0]);
   checkBucketAccessControl(o[1]);
@@ -429,7 +429,7 @@
   var o = new api.BucketAccessControls();
   buildCounterBucketAccessControls++;
   if (buildCounterBucketAccessControls < 3) {
-    o.items = buildUnnamed500();
+    o.items = buildUnnamed1039();
     o.kind = "foo";
   }
   buildCounterBucketAccessControls--;
@@ -439,20 +439,20 @@
 checkBucketAccessControls(api.BucketAccessControls o) {
   buildCounterBucketAccessControls++;
   if (buildCounterBucketAccessControls < 3) {
-    checkUnnamed500(o.items);
+    checkUnnamed1039(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBucketAccessControls--;
 }
 
-buildUnnamed501() {
+buildUnnamed1040() {
   var o = new core.List<api.Bucket>();
   o.add(buildBucket());
   o.add(buildBucket());
   return o;
 }
 
-checkUnnamed501(core.List<api.Bucket> o) {
+checkUnnamed1040(core.List<api.Bucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucket(o[0]);
   checkBucket(o[1]);
@@ -463,7 +463,7 @@
   var o = new api.Buckets();
   buildCounterBuckets++;
   if (buildCounterBuckets < 3) {
-    o.items = buildUnnamed501();
+    o.items = buildUnnamed1040();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -474,21 +474,21 @@
 checkBuckets(api.Buckets o) {
   buildCounterBuckets++;
   if (buildCounterBuckets < 3) {
-    checkUnnamed501(o.items);
+    checkUnnamed1040(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterBuckets--;
 }
 
-buildUnnamed502() {
+buildUnnamed1041() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed502(core.Map<core.String, core.String> o) {
+checkUnnamed1041(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'));
@@ -503,7 +503,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed502();
+    o.params = buildUnnamed1041();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -521,7 +521,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed502(o.params);
+    checkUnnamed1041(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -573,14 +573,14 @@
   buildCounterComposeRequestSourceObjects--;
 }
 
-buildUnnamed503() {
+buildUnnamed1042() {
   var o = new core.List<api.ComposeRequestSourceObjects>();
   o.add(buildComposeRequestSourceObjects());
   o.add(buildComposeRequestSourceObjects());
   return o;
 }
 
-checkUnnamed503(core.List<api.ComposeRequestSourceObjects> o) {
+checkUnnamed1042(core.List<api.ComposeRequestSourceObjects> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComposeRequestSourceObjects(o[0]);
   checkComposeRequestSourceObjects(o[1]);
@@ -593,7 +593,7 @@
   if (buildCounterComposeRequest < 3) {
     o.destination = buildObject();
     o.kind = "foo";
-    o.sourceObjects = buildUnnamed503();
+    o.sourceObjects = buildUnnamed1042();
   }
   buildCounterComposeRequest--;
   return o;
@@ -604,32 +604,32 @@
   if (buildCounterComposeRequest < 3) {
     checkObject(o.destination);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed503(o.sourceObjects);
+    checkUnnamed1042(o.sourceObjects);
   }
   buildCounterComposeRequest--;
 }
 
-buildUnnamed504() {
+buildUnnamed1043() {
   var o = new core.List<api.ObjectAccessControl>();
   o.add(buildObjectAccessControl());
   o.add(buildObjectAccessControl());
   return o;
 }
 
-checkUnnamed504(core.List<api.ObjectAccessControl> o) {
+checkUnnamed1043(core.List<api.ObjectAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkObjectAccessControl(o[0]);
   checkObjectAccessControl(o[1]);
 }
 
-buildUnnamed505() {
+buildUnnamed1044() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed505(core.Map<core.String, core.String> o) {
+checkUnnamed1044(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'));
@@ -661,7 +661,7 @@
   var o = new api.Object();
   buildCounterObject++;
   if (buildCounterObject < 3) {
-    o.acl = buildUnnamed504();
+    o.acl = buildUnnamed1043();
     o.bucket = "foo";
     o.cacheControl = "foo";
     o.componentCount = 42;
@@ -676,7 +676,7 @@
     o.kind = "foo";
     o.md5Hash = "foo";
     o.mediaLink = "foo";
-    o.metadata = buildUnnamed505();
+    o.metadata = buildUnnamed1044();
     o.metageneration = "foo";
     o.name = "foo";
     o.owner = buildObjectOwner();
@@ -693,7 +693,7 @@
 checkObject(api.Object o) {
   buildCounterObject++;
   if (buildCounterObject < 3) {
-    checkUnnamed504(o.acl);
+    checkUnnamed1043(o.acl);
     unittest.expect(o.bucket, unittest.equals('foo'));
     unittest.expect(o.cacheControl, unittest.equals('foo'));
     unittest.expect(o.componentCount, unittest.equals(42));
@@ -708,7 +708,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.md5Hash, unittest.equals('foo'));
     unittest.expect(o.mediaLink, unittest.equals('foo'));
-    checkUnnamed505(o.metadata);
+    checkUnnamed1044(o.metadata);
     unittest.expect(o.metageneration, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkObjectOwner(o.owner);
@@ -785,14 +785,14 @@
   buildCounterObjectAccessControl--;
 }
 
-buildUnnamed506() {
+buildUnnamed1045() {
   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'});
   return o;
 }
 
-checkUnnamed506(core.List<core.Object> o) {
+checkUnnamed1045(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')); 
@@ -803,7 +803,7 @@
   var o = new api.ObjectAccessControls();
   buildCounterObjectAccessControls++;
   if (buildCounterObjectAccessControls < 3) {
-    o.items = buildUnnamed506();
+    o.items = buildUnnamed1045();
     o.kind = "foo";
   }
   buildCounterObjectAccessControls--;
@@ -813,33 +813,33 @@
 checkObjectAccessControls(api.ObjectAccessControls o) {
   buildCounterObjectAccessControls++;
   if (buildCounterObjectAccessControls < 3) {
-    checkUnnamed506(o.items);
+    checkUnnamed1045(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterObjectAccessControls--;
 }
 
-buildUnnamed507() {
+buildUnnamed1046() {
   var o = new core.List<api.Object>();
   o.add(buildObject());
   o.add(buildObject());
   return o;
 }
 
-checkUnnamed507(core.List<api.Object> o) {
+checkUnnamed1046(core.List<api.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkObject(o[0]);
   checkObject(o[1]);
 }
 
-buildUnnamed508() {
+buildUnnamed1047() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed508(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'));
@@ -850,10 +850,10 @@
   var o = new api.Objects();
   buildCounterObjects++;
   if (buildCounterObjects < 3) {
-    o.items = buildUnnamed507();
+    o.items = buildUnnamed1046();
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.prefixes = buildUnnamed508();
+    o.prefixes = buildUnnamed1047();
   }
   buildCounterObjects--;
   return o;
@@ -862,10 +862,10 @@
 checkObjects(api.Objects o) {
   buildCounterObjects++;
   if (buildCounterObjects < 3) {
-    checkUnnamed507(o.items);
+    checkUnnamed1046(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed508(o.prefixes);
+    checkUnnamed1047(o.prefixes);
   }
   buildCounterObjects--;
 }
diff --git a/generated/googleapis/test/tagmanager/v1_test.dart b/generated/googleapis/test/tagmanager/v1_test.dart
new file mode 100644
index 0000000..033e315
--- /dev/null
+++ b/generated/googleapis/test/tagmanager/v1_test.dart
@@ -0,0 +1,4376 @@
+library googleapis.tagmanager.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:unittest/unittest.dart' as unittest;
+import 'package:googleapis/common/common.dart' as common;
+import 'package:googleapis/src/common_internal.dart' as common_internal;
+import '../common/common_internal_test.dart' as common_test;
+
+import 'package:googleapis/tagmanager/v1.dart' as api;
+
+
+
+core.int buildCounterAccount = 0;
+buildAccount() {
+  var o = new api.Account();
+  buildCounterAccount++;
+  if (buildCounterAccount < 3) {
+    o.accountId = "foo";
+    o.fingerprint = "foo";
+    o.name = "foo";
+    o.shareData = true;
+  }
+  buildCounterAccount--;
+  return o;
+}
+
+checkAccount(api.Account o) {
+  buildCounterAccount++;
+  if (buildCounterAccount < 3) {
+    unittest.expect(o.accountId, unittest.equals('foo'));
+    unittest.expect(o.fingerprint, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.shareData, unittest.isTrue);
+  }
+  buildCounterAccount--;
+}
+
+buildUnnamed1048() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
+}
+
+core.int buildCounterAccountAccess = 0;
+buildAccountAccess() {
+  var o = new api.AccountAccess();
+  buildCounterAccountAccess++;
+  if (buildCounterAccountAccess < 3) {
+    o.permission = buildUnnamed1048();
+  }
+  buildCounterAccountAccess--;
+  return o;
+}
+
+checkAccountAccess(api.AccountAccess o) {
+  buildCounterAccountAccess++;
+  if (buildCounterAccountAccess < 3) {
+    checkUnnamed1048(o.permission);
+  }
+  buildCounterAccountAccess--;
+}
+
+buildUnnamed1049() {
+  var o = new core.List<api.Parameter>();
+  o.add(buildParameter());
+  o.add(buildParameter());
+  return o;
+}
+
+checkUnnamed1049(core.List<api.Parameter> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkParameter(o[0]);
+  checkParameter(o[1]);
+}
+
+core.int buildCounterCondition = 0;
+buildCondition() {
+  var o = new api.Condition();
+  buildCounterCondition++;
+  if (buildCounterCondition < 3) {
+    o.parameter = buildUnnamed1049();
+    o.type = "foo";
+  }
+  buildCounterCondition--;
+  return o;
+}
+
+checkCondition(api.Condition o) {
+  buildCounterCondition++;
+  if (buildCounterCondition < 3) {
+    checkUnnamed1049(o.parameter);
+    unittest.expect(o.type, unittest.equals('foo'));
+  }
+  buildCounterCondition--;
+}
+
+buildUnnamed1050() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1050(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1051() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1051(core.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 buildCounterContainer = 0;
+buildContainer() {
+  var o = new api.Container();
+  buildCounterContainer++;
+  if (buildCounterContainer < 3) {
+    o.accountId = "foo";
+    o.containerId = "foo";
+    o.domainName = buildUnnamed1050();
+    o.fingerprint = "foo";
+    o.name = "foo";
+    o.notes = "foo";
+    o.publicId = "foo";
+    o.timeZoneCountryId = "foo";
+    o.timeZoneId = "foo";
+    o.usageContext = buildUnnamed1051();
+  }
+  buildCounterContainer--;
+  return o;
+}
+
+checkContainer(api.Container o) {
+  buildCounterContainer++;
+  if (buildCounterContainer < 3) {
+    unittest.expect(o.accountId, unittest.equals('foo'));
+    unittest.expect(o.containerId, unittest.equals('foo'));
+    checkUnnamed1050(o.domainName);
+    unittest.expect(o.fingerprint, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.notes, unittest.equals('foo'));
+    unittest.expect(o.publicId, unittest.equals('foo'));
+    unittest.expect(o.timeZoneCountryId, unittest.equals('foo'));
+    unittest.expect(o.timeZoneId, unittest.equals('foo'));
+    checkUnnamed1051(o.usageContext);
+  }
+  buildCounterContainer--;
+}
+
+buildUnnamed1052() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1052(core.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 buildCounterContainerAccess = 0;
+buildContainerAccess() {
+  var o = new api.ContainerAccess();
+  buildCounterContainerAccess++;
+  if (buildCounterContainerAccess < 3) {
+    o.containerId = "foo";
+    o.permission = buildUnnamed1052();
+  }
+  buildCounterContainerAccess--;
+  return o;
+}
+
+checkContainerAccess(api.ContainerAccess o) {
+  buildCounterContainerAccess++;
+  if (buildCounterContainerAccess < 3) {
+    unittest.expect(o.containerId, unittest.equals('foo'));
+    checkUnnamed1052(o.permission);
+  }
+  buildCounterContainerAccess--;
+}
+
+buildUnnamed1053() {
+  var o = new core.List<api.Macro>();
+  o.add(buildMacro());
+  o.add(buildMacro());
+  return o;
+}
+
+checkUnnamed1053(core.List<api.Macro> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkMacro(o[0]);
+  checkMacro(o[1]);
+}
+
+buildUnnamed1054() {
+  var o = new core.List<api.Rule>();
+  o.add(buildRule());
+  o.add(buildRule());
+  return o;
+}
+
+checkUnnamed1054(core.List<api.Rule> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkRule(o[0]);
+  checkRule(o[1]);
+}
+
+buildUnnamed1055() {
+  var o = new core.List<api.Tag>();
+  o.add(buildTag());
+  o.add(buildTag());
+  return o;
+}
+
+checkUnnamed1055(core.List<api.Tag> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkTag(o[0]);
+  checkTag(o[1]);
+}
+
+buildUnnamed1056() {
+  var o = new core.List<api.Trigger>();
+  o.add(buildTrigger());
+  o.add(buildTrigger());
+  return o;
+}
+
+checkUnnamed1056(core.List<api.Trigger> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkTrigger(o[0]);
+  checkTrigger(o[1]);
+}
+
+buildUnnamed1057() {
+  var o = new core.List<api.Variable>();
+  o.add(buildVariable());
+  o.add(buildVariable());
+  return o;
+}
+
+checkUnnamed1057(core.List<api.Variable> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkVariable(o[0]);
+  checkVariable(o[1]);
+}
+
+core.int buildCounterContainerVersion = 0;
+buildContainerVersion() {
+  var o = new api.ContainerVersion();
+  buildCounterContainerVersion++;
+  if (buildCounterContainerVersion < 3) {
+    o.accountId = "foo";
+    o.container = buildContainer();
+    o.containerId = "foo";
+    o.containerVersionId = "foo";
+    o.deleted = true;
+    o.fingerprint = "foo";
+    o.macro = buildUnnamed1053();
+    o.name = "foo";
+    o.notes = "foo";
+    o.rule = buildUnnamed1054();
+    o.tag = buildUnnamed1055();
+    o.trigger = buildUnnamed1056();
+    o.variable = buildUnnamed1057();
+  }
+  buildCounterContainerVersion--;
+  return o;
+}
+
+checkContainerVersion(api.ContainerVersion o) {
+  buildCounterContainerVersion++;
+  if (buildCounterContainerVersion < 3) {
+    unittest.expect(o.accountId, unittest.equals('foo'));
+    checkContainer(o.container);
+    unittest.expect(o.containerId, unittest.equals('foo'));
+    unittest.expect(o.containerVersionId, unittest.equals('foo'));
+    unittest.expect(o.deleted, unittest.isTrue);
+    unittest.expect(o.fingerprint, unittest.equals('foo'));
+    checkUnnamed1053(o.macro);
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.notes, unittest.equals('foo'));
+    checkUnnamed1054(o.rule);
+    checkUnnamed1055(o.tag);
+    checkUnnamed1056(o.trigger);
+    checkUnnamed1057(o.variable);
+  }
+  buildCounterContainerVersion--;
+}
+
+core.int buildCounterContainerVersionHeader = 0;
+buildContainerVersionHeader() {
+  var o = new api.ContainerVersionHeader();
+  buildCounterContainerVersionHeader++;
+  if (buildCounterContainerVersionHeader < 3) {
+    o.accountId = "foo";
+    o.containerId = "foo";
+    o.containerVersionId = "foo";
+    o.deleted = true;
+    o.name = "foo";
+    o.numMacros = "foo";
+    o.numRules = "foo";
+    o.numTags = "foo";
+    o.numTriggers = "foo";
+    o.numVariables = "foo";
+  }
+  buildCounterContainerVersionHeader--;
+  return o;
+}
+
+checkContainerVersionHeader(api.ContainerVersionHeader o) {
+  buildCounterContainerVersionHeader++;
+  if (buildCounterContainerVersionHeader < 3) {
+    unittest.expect(o.accountId, unittest.equals('foo'));
+    unittest.expect(o.containerId, unittest.equals('foo'));
+    unittest.expect(o.containerVersionId, unittest.equals('foo'));
+    unittest.expect(o.deleted, unittest.isTrue);
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.numMacros, unittest.equals('foo'));
+    unittest.expect(o.numRules, unittest.equals('foo'));
+    unittest.expect(o.numTags, unittest.equals('foo'));
+    unittest.expect(o.numTriggers, unittest.equals('foo'));
+    unittest.expect(o.numVariables, unittest.equals('foo'));
+  }
+  buildCounterContainerVersionHeader--;
+}
+
+core.int buildCounterCreateContainerVersionRequestVersionOptions = 0;
+buildCreateContainerVersionRequestVersionOptions() {
+  var o = new api.CreateContainerVersionRequestVersionOptions();
+  buildCounterCreateContainerVersionRequestVersionOptions++;
+  if (buildCounterCreateContainerVersionRequestVersionOptions < 3) {
+    o.name = "foo";
+    o.notes = "foo";
+    o.quickPreview = true;
+  }
+  buildCounterCreateContainerVersionRequestVersionOptions--;
+  return o;
+}
+
+checkCreateContainerVersionRequestVersionOptions(api.CreateContainerVersionRequestVersionOptions o) {
+  buildCounterCreateContainerVersionRequestVersionOptions++;
+  if (buildCounterCreateContainerVersionRequestVersionOptions < 3) {
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.notes, unittest.equals('foo'));
+    unittest.expect(o.quickPreview, unittest.isTrue);
+  }
+  buildCounterCreateContainerVersionRequestVersionOptions--;
+}
+
+core.int buildCounterCreateContainerVersionResponse = 0;
+buildCreateContainerVersionResponse() {
+  var o = new api.CreateContainerVersionResponse();
+  buildCounterCreateContainerVersionResponse++;
+  if (buildCounterCreateContainerVersionResponse < 3) {
+    o.compilerError = true;
+    o.containerVersion = buildContainerVersion();
+  }
+  buildCounterCreateContainerVersionResponse--;
+  return o;
+}
+
+checkCreateContainerVersionResponse(api.CreateContainerVersionResponse o) {
+  buildCounterCreateContainerVersionResponse++;
+  if (buildCounterCreateContainerVersionResponse < 3) {
+    unittest.expect(o.compilerError, unittest.isTrue);
+    checkContainerVersion(o.containerVersion);
+  }
+  buildCounterCreateContainerVersionResponse--;
+}
+
+buildUnnamed1058() {
+  var o = new core.List<api.UserAccess>();
+  o.add(buildUserAccess());
+  o.add(buildUserAccess());
+  return o;
+}
+
+checkUnnamed1058(core.List<api.UserAccess> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkUserAccess(o[0]);
+  checkUserAccess(o[1]);
+}
+
+core.int buildCounterListAccountUsersResponse = 0;
+buildListAccountUsersResponse() {
+  var o = new api.ListAccountUsersResponse();
+  buildCounterListAccountUsersResponse++;
+  if (buildCounterListAccountUsersResponse < 3) {
+    o.userAccess = buildUnnamed1058();
+  }
+  buildCounterListAccountUsersResponse--;
+  return o;
+}
+
+checkListAccountUsersResponse(api.ListAccountUsersResponse o) {
+  buildCounterListAccountUsersResponse++;
+  if (buildCounterListAccountUsersResponse < 3) {
+    checkUnnamed1058(o.userAccess);
+  }
+  buildCounterListAccountUsersResponse--;
+}
+
+buildUnnamed1059() {
+  var o = new core.List<api.Account>();
+  o.add(buildAccount());
+  o.add(buildAccount());
+  return o;
+}
+
+checkUnnamed1059(core.List<api.Account> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkAccount(o[0]);
+  checkAccount(o[1]);
+}
+
+core.int buildCounterListAccountsResponse = 0;
+buildListAccountsResponse() {
+  var o = new api.ListAccountsResponse();
+  buildCounterListAccountsResponse++;
+  if (buildCounterListAccountsResponse < 3) {
+    o.accounts = buildUnnamed1059();
+  }
+  buildCounterListAccountsResponse--;
+  return o;
+}
+
+checkListAccountsResponse(api.ListAccountsResponse o) {
+  buildCounterListAccountsResponse++;
+  if (buildCounterListAccountsResponse < 3) {
+    checkUnnamed1059(o.accounts);
+  }
+  buildCounterListAccountsResponse--;
+}
+
+buildUnnamed1060() {
+  var o = new core.List<api.ContainerVersion>();
+  o.add(buildContainerVersion());
+  o.add(buildContainerVersion());
+  return o;
+}
+
+checkUnnamed1060(core.List<api.ContainerVersion> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkContainerVersion(o[0]);
+  checkContainerVersion(o[1]);
+}
+
+buildUnnamed1061() {
+  var o = new core.List<api.ContainerVersionHeader>();
+  o.add(buildContainerVersionHeader());
+  o.add(buildContainerVersionHeader());
+  return o;
+}
+
+checkUnnamed1061(core.List<api.ContainerVersionHeader> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkContainerVersionHeader(o[0]);
+  checkContainerVersionHeader(o[1]);
+}
+
+core.int buildCounterListContainerVersionsResponse = 0;
+buildListContainerVersionsResponse() {
+  var o = new api.ListContainerVersionsResponse();
+  buildCounterListContainerVersionsResponse++;
+  if (buildCounterListContainerVersionsResponse < 3) {
+    o.containerVersion = buildUnnamed1060();
+    o.containerVersionHeader = buildUnnamed1061();
+  }
+  buildCounterListContainerVersionsResponse--;
+  return o;
+}
+
+checkListContainerVersionsResponse(api.ListContainerVersionsResponse o) {
+  buildCounterListContainerVersionsResponse++;
+  if (buildCounterListContainerVersionsResponse < 3) {
+    checkUnnamed1060(o.containerVersion);
+    checkUnnamed1061(o.containerVersionHeader);
+  }
+  buildCounterListContainerVersionsResponse--;
+}
+
+buildUnnamed1062() {
+  var o = new core.List<api.Container>();
+  o.add(buildContainer());
+  o.add(buildContainer());
+  return o;
+}
+
+checkUnnamed1062(core.List<api.Container> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkContainer(o[0]);
+  checkContainer(o[1]);
+}
+
+core.int buildCounterListContainersResponse = 0;
+buildListContainersResponse() {
+  var o = new api.ListContainersResponse();
+  buildCounterListContainersResponse++;
+  if (buildCounterListContainersResponse < 3) {
+    o.containers = buildUnnamed1062();
+  }
+  buildCounterListContainersResponse--;
+  return o;
+}
+
+checkListContainersResponse(api.ListContainersResponse o) {
+  buildCounterListContainersResponse++;
+  if (buildCounterListContainersResponse < 3) {
+    checkUnnamed1062(o.containers);
+  }
+  buildCounterListContainersResponse--;
+}
+
+buildUnnamed1063() {
+  var o = new core.List<api.Macro>();
+  o.add(buildMacro());
+  o.add(buildMacro());
+  return o;
+}
+
+checkUnnamed1063(core.List<api.Macro> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkMacro(o[0]);
+  checkMacro(o[1]);
+}
+
+core.int buildCounterListMacrosResponse = 0;
+buildListMacrosResponse() {
+  var o = new api.ListMacrosResponse();
+  buildCounterListMacrosResponse++;
+  if (buildCounterListMacrosResponse < 3) {
+    o.macros = buildUnnamed1063();
+  }
+  buildCounterListMacrosResponse--;
+  return o;
+}
+
+checkListMacrosResponse(api.ListMacrosResponse o) {
+  buildCounterListMacrosResponse++;
+  if (buildCounterListMacrosResponse < 3) {
+    checkUnnamed1063(o.macros);
+  }
+  buildCounterListMacrosResponse--;
+}
+
+buildUnnamed1064() {
+  var o = new core.List<api.Rule>();
+  o.add(buildRule());
+  o.add(buildRule());
+  return o;
+}
+
+checkUnnamed1064(core.List<api.Rule> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkRule(o[0]);
+  checkRule(o[1]);
+}
+
+core.int buildCounterListRulesResponse = 0;
+buildListRulesResponse() {
+  var o = new api.ListRulesResponse();
+  buildCounterListRulesResponse++;
+  if (buildCounterListRulesResponse < 3) {
+    o.rules = buildUnnamed1064();
+  }
+  buildCounterListRulesResponse--;
+  return o;
+}
+
+checkListRulesResponse(api.ListRulesResponse o) {
+  buildCounterListRulesResponse++;
+  if (buildCounterListRulesResponse < 3) {
+    checkUnnamed1064(o.rules);
+  }
+  buildCounterListRulesResponse--;
+}
+
+buildUnnamed1065() {
+  var o = new core.List<api.Tag>();
+  o.add(buildTag());
+  o.add(buildTag());
+  return o;
+}
+
+checkUnnamed1065(core.List<api.Tag> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkTag(o[0]);
+  checkTag(o[1]);
+}
+
+core.int buildCounterListTagsResponse = 0;
+buildListTagsResponse() {
+  var o = new api.ListTagsResponse();
+  buildCounterListTagsResponse++;
+  if (buildCounterListTagsResponse < 3) {
+    o.tags = buildUnnamed1065();
+  }
+  buildCounterListTagsResponse--;
+  return o;
+}
+
+checkListTagsResponse(api.ListTagsResponse o) {
+  buildCounterListTagsResponse++;
+  if (buildCounterListTagsResponse < 3) {
+    checkUnnamed1065(o.tags);
+  }
+  buildCounterListTagsResponse--;
+}
+
+buildUnnamed1066() {
+  var o = new core.List<api.Trigger>();
+  o.add(buildTrigger());
+  o.add(buildTrigger());
+  return o;
+}
+
+checkUnnamed1066(core.List<api.Trigger> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkTrigger(o[0]);
+  checkTrigger(o[1]);
+}
+
+core.int buildCounterListTriggersResponse = 0;
+buildListTriggersResponse() {
+  var o = new api.ListTriggersResponse();
+  buildCounterListTriggersResponse++;
+  if (buildCounterListTriggersResponse < 3) {
+    o.triggers = buildUnnamed1066();
+  }
+  buildCounterListTriggersResponse--;
+  return o;
+}
+
+checkListTriggersResponse(api.ListTriggersResponse o) {
+  buildCounterListTriggersResponse++;
+  if (buildCounterListTriggersResponse < 3) {
+    checkUnnamed1066(o.triggers);
+  }
+  buildCounterListTriggersResponse--;
+}
+
+buildUnnamed1067() {
+  var o = new core.List<api.Variable>();
+  o.add(buildVariable());
+  o.add(buildVariable());
+  return o;
+}
+
+checkUnnamed1067(core.List<api.Variable> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkVariable(o[0]);
+  checkVariable(o[1]);
+}
+
+core.int buildCounterListVariablesResponse = 0;
+buildListVariablesResponse() {
+  var o = new api.ListVariablesResponse();
+  buildCounterListVariablesResponse++;
+  if (buildCounterListVariablesResponse < 3) {
+    o.variables = buildUnnamed1067();
+  }
+  buildCounterListVariablesResponse--;
+  return o;
+}
+
+checkListVariablesResponse(api.ListVariablesResponse o) {
+  buildCounterListVariablesResponse++;
+  if (buildCounterListVariablesResponse < 3) {
+    checkUnnamed1067(o.variables);
+  }
+  buildCounterListVariablesResponse--;
+}
+
+buildUnnamed1068() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1068(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1069() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1069(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1070() {
+  var o = new core.List<api.Parameter>();
+  o.add(buildParameter());
+  o.add(buildParameter());
+  return o;
+}
+
+checkUnnamed1070(core.List<api.Parameter> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkParameter(o[0]);
+  checkParameter(o[1]);
+}
+
+core.int buildCounterMacro = 0;
+buildMacro() {
+  var o = new api.Macro();
+  buildCounterMacro++;
+  if (buildCounterMacro < 3) {
+    o.accountId = "foo";
+    o.containerId = "foo";
+    o.disablingRuleId = buildUnnamed1068();
+    o.enablingRuleId = buildUnnamed1069();
+    o.fingerprint = "foo";
+    o.macroId = "foo";
+    o.name = "foo";
+    o.notes = "foo";
+    o.parameter = buildUnnamed1070();
+    o.scheduleEndMs = "foo";
+    o.scheduleStartMs = "foo";
+    o.type = "foo";
+  }
+  buildCounterMacro--;
+  return o;
+}
+
+checkMacro(api.Macro o) {
+  buildCounterMacro++;
+  if (buildCounterMacro < 3) {
+    unittest.expect(o.accountId, unittest.equals('foo'));
+    unittest.expect(o.containerId, unittest.equals('foo'));
+    checkUnnamed1068(o.disablingRuleId);
+    checkUnnamed1069(o.enablingRuleId);
+    unittest.expect(o.fingerprint, unittest.equals('foo'));
+    unittest.expect(o.macroId, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.notes, unittest.equals('foo'));
+    checkUnnamed1070(o.parameter);
+    unittest.expect(o.scheduleEndMs, unittest.equals('foo'));
+    unittest.expect(o.scheduleStartMs, unittest.equals('foo'));
+    unittest.expect(o.type, unittest.equals('foo'));
+  }
+  buildCounterMacro--;
+}
+
+buildUnnamed1071() {
+  var o = new core.List<api.Parameter>();
+  o.add(buildParameter());
+  o.add(buildParameter());
+  return o;
+}
+
+checkUnnamed1071(core.List<api.Parameter> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkParameter(o[0]);
+  checkParameter(o[1]);
+}
+
+buildUnnamed1072() {
+  var o = new core.List<api.Parameter>();
+  o.add(buildParameter());
+  o.add(buildParameter());
+  return o;
+}
+
+checkUnnamed1072(core.List<api.Parameter> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkParameter(o[0]);
+  checkParameter(o[1]);
+}
+
+core.int buildCounterParameter = 0;
+buildParameter() {
+  var o = new api.Parameter();
+  buildCounterParameter++;
+  if (buildCounterParameter < 3) {
+    o.key = "foo";
+    o.list = buildUnnamed1071();
+    o.map = buildUnnamed1072();
+    o.type = "foo";
+    o.value = "foo";
+  }
+  buildCounterParameter--;
+  return o;
+}
+
+checkParameter(api.Parameter o) {
+  buildCounterParameter++;
+  if (buildCounterParameter < 3) {
+    unittest.expect(o.key, unittest.equals('foo'));
+    checkUnnamed1071(o.list);
+    checkUnnamed1072(o.map);
+    unittest.expect(o.type, unittest.equals('foo'));
+    unittest.expect(o.value, unittest.equals('foo'));
+  }
+  buildCounterParameter--;
+}
+
+core.int buildCounterPublishContainerVersionResponse = 0;
+buildPublishContainerVersionResponse() {
+  var o = new api.PublishContainerVersionResponse();
+  buildCounterPublishContainerVersionResponse++;
+  if (buildCounterPublishContainerVersionResponse < 3) {
+    o.compilerError = true;
+    o.containerVersion = buildContainerVersion();
+  }
+  buildCounterPublishContainerVersionResponse--;
+  return o;
+}
+
+checkPublishContainerVersionResponse(api.PublishContainerVersionResponse o) {
+  buildCounterPublishContainerVersionResponse++;
+  if (buildCounterPublishContainerVersionResponse < 3) {
+    unittest.expect(o.compilerError, unittest.isTrue);
+    checkContainerVersion(o.containerVersion);
+  }
+  buildCounterPublishContainerVersionResponse--;
+}
+
+buildUnnamed1073() {
+  var o = new core.List<api.Condition>();
+  o.add(buildCondition());
+  o.add(buildCondition());
+  return o;
+}
+
+checkUnnamed1073(core.List<api.Condition> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkCondition(o[0]);
+  checkCondition(o[1]);
+}
+
+core.int buildCounterRule = 0;
+buildRule() {
+  var o = new api.Rule();
+  buildCounterRule++;
+  if (buildCounterRule < 3) {
+    o.accountId = "foo";
+    o.condition = buildUnnamed1073();
+    o.containerId = "foo";
+    o.fingerprint = "foo";
+    o.name = "foo";
+    o.notes = "foo";
+    o.ruleId = "foo";
+  }
+  buildCounterRule--;
+  return o;
+}
+
+checkRule(api.Rule o) {
+  buildCounterRule++;
+  if (buildCounterRule < 3) {
+    unittest.expect(o.accountId, unittest.equals('foo'));
+    checkUnnamed1073(o.condition);
+    unittest.expect(o.containerId, unittest.equals('foo'));
+    unittest.expect(o.fingerprint, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.notes, unittest.equals('foo'));
+    unittest.expect(o.ruleId, unittest.equals('foo'));
+  }
+  buildCounterRule--;
+}
+
+buildUnnamed1074() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1074(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1075() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1075(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1076() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1076(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1077() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1077(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1078() {
+  var o = new core.List<api.Parameter>();
+  o.add(buildParameter());
+  o.add(buildParameter());
+  return o;
+}
+
+checkUnnamed1078(core.List<api.Parameter> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkParameter(o[0]);
+  checkParameter(o[1]);
+}
+
+core.int buildCounterTag = 0;
+buildTag() {
+  var o = new api.Tag();
+  buildCounterTag++;
+  if (buildCounterTag < 3) {
+    o.accountId = "foo";
+    o.blockingRuleId = buildUnnamed1074();
+    o.blockingTriggerId = buildUnnamed1075();
+    o.containerId = "foo";
+    o.dependencies = buildParameter();
+    o.fingerprint = "foo";
+    o.firingRuleId = buildUnnamed1076();
+    o.firingTriggerId = buildUnnamed1077();
+    o.liveOnly = true;
+    o.name = "foo";
+    o.notes = "foo";
+    o.parameter = buildUnnamed1078();
+    o.priority = buildParameter();
+    o.scheduleEndMs = "foo";
+    o.scheduleStartMs = "foo";
+    o.tagId = "foo";
+    o.type = "foo";
+  }
+  buildCounterTag--;
+  return o;
+}
+
+checkTag(api.Tag o) {
+  buildCounterTag++;
+  if (buildCounterTag < 3) {
+    unittest.expect(o.accountId, unittest.equals('foo'));
+    checkUnnamed1074(o.blockingRuleId);
+    checkUnnamed1075(o.blockingTriggerId);
+    unittest.expect(o.containerId, unittest.equals('foo'));
+    checkParameter(o.dependencies);
+    unittest.expect(o.fingerprint, unittest.equals('foo'));
+    checkUnnamed1076(o.firingRuleId);
+    checkUnnamed1077(o.firingTriggerId);
+    unittest.expect(o.liveOnly, unittest.isTrue);
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.notes, unittest.equals('foo'));
+    checkUnnamed1078(o.parameter);
+    checkParameter(o.priority);
+    unittest.expect(o.scheduleEndMs, unittest.equals('foo'));
+    unittest.expect(o.scheduleStartMs, unittest.equals('foo'));
+    unittest.expect(o.tagId, unittest.equals('foo'));
+    unittest.expect(o.type, unittest.equals('foo'));
+  }
+  buildCounterTag--;
+}
+
+buildUnnamed1079() {
+  var o = new core.List<api.Condition>();
+  o.add(buildCondition());
+  o.add(buildCondition());
+  return o;
+}
+
+checkUnnamed1079(core.List<api.Condition> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkCondition(o[0]);
+  checkCondition(o[1]);
+}
+
+buildUnnamed1080() {
+  var o = new core.List<api.Condition>();
+  o.add(buildCondition());
+  o.add(buildCondition());
+  return o;
+}
+
+checkUnnamed1080(core.List<api.Condition> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkCondition(o[0]);
+  checkCondition(o[1]);
+}
+
+buildUnnamed1081() {
+  var o = new core.List<api.Condition>();
+  o.add(buildCondition());
+  o.add(buildCondition());
+  return o;
+}
+
+checkUnnamed1081(core.List<api.Condition> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkCondition(o[0]);
+  checkCondition(o[1]);
+}
+
+core.int buildCounterTrigger = 0;
+buildTrigger() {
+  var o = new api.Trigger();
+  buildCounterTrigger++;
+  if (buildCounterTrigger < 3) {
+    o.accountId = "foo";
+    o.autoEventFilter = buildUnnamed1079();
+    o.checkValidation = buildParameter();
+    o.containerId = "foo";
+    o.customEventFilter = buildUnnamed1080();
+    o.enableAllVideos = buildParameter();
+    o.eventName = buildParameter();
+    o.filter = buildUnnamed1081();
+    o.fingerprint = "foo";
+    o.interval = buildParameter();
+    o.limit = buildParameter();
+    o.name = "foo";
+    o.triggerId = "foo";
+    o.type = "foo";
+    o.uniqueTriggerId = buildParameter();
+    o.videoPercentageList = buildParameter();
+    o.waitForTags = buildParameter();
+    o.waitForTagsTimeout = buildParameter();
+  }
+  buildCounterTrigger--;
+  return o;
+}
+
+checkTrigger(api.Trigger o) {
+  buildCounterTrigger++;
+  if (buildCounterTrigger < 3) {
+    unittest.expect(o.accountId, unittest.equals('foo'));
+    checkUnnamed1079(o.autoEventFilter);
+    checkParameter(o.checkValidation);
+    unittest.expect(o.containerId, unittest.equals('foo'));
+    checkUnnamed1080(o.customEventFilter);
+    checkParameter(o.enableAllVideos);
+    checkParameter(o.eventName);
+    checkUnnamed1081(o.filter);
+    unittest.expect(o.fingerprint, unittest.equals('foo'));
+    checkParameter(o.interval);
+    checkParameter(o.limit);
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.triggerId, unittest.equals('foo'));
+    unittest.expect(o.type, unittest.equals('foo'));
+    checkParameter(o.uniqueTriggerId);
+    checkParameter(o.videoPercentageList);
+    checkParameter(o.waitForTags);
+    checkParameter(o.waitForTagsTimeout);
+  }
+  buildCounterTrigger--;
+}
+
+buildUnnamed1082() {
+  var o = new core.List<api.ContainerAccess>();
+  o.add(buildContainerAccess());
+  o.add(buildContainerAccess());
+  return o;
+}
+
+checkUnnamed1082(core.List<api.ContainerAccess> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkContainerAccess(o[0]);
+  checkContainerAccess(o[1]);
+}
+
+core.int buildCounterUserAccess = 0;
+buildUserAccess() {
+  var o = new api.UserAccess();
+  buildCounterUserAccess++;
+  if (buildCounterUserAccess < 3) {
+    o.accountAccess = buildAccountAccess();
+    o.accountId = "foo";
+    o.containerAccess = buildUnnamed1082();
+    o.emailAddress = "foo";
+    o.permissionId = "foo";
+  }
+  buildCounterUserAccess--;
+  return o;
+}
+
+checkUserAccess(api.UserAccess o) {
+  buildCounterUserAccess++;
+  if (buildCounterUserAccess < 3) {
+    checkAccountAccess(o.accountAccess);
+    unittest.expect(o.accountId, unittest.equals('foo'));
+    checkUnnamed1082(o.containerAccess);
+    unittest.expect(o.emailAddress, unittest.equals('foo'));
+    unittest.expect(o.permissionId, unittest.equals('foo'));
+  }
+  buildCounterUserAccess--;
+}
+
+buildUnnamed1083() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1083(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1084() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1084(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1085() {
+  var o = new core.List<api.Parameter>();
+  o.add(buildParameter());
+  o.add(buildParameter());
+  return o;
+}
+
+checkUnnamed1085(core.List<api.Parameter> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkParameter(o[0]);
+  checkParameter(o[1]);
+}
+
+core.int buildCounterVariable = 0;
+buildVariable() {
+  var o = new api.Variable();
+  buildCounterVariable++;
+  if (buildCounterVariable < 3) {
+    o.accountId = "foo";
+    o.containerId = "foo";
+    o.disablingTriggerId = buildUnnamed1083();
+    o.enablingTriggerId = buildUnnamed1084();
+    o.fingerprint = "foo";
+    o.name = "foo";
+    o.notes = "foo";
+    o.parameter = buildUnnamed1085();
+    o.scheduleEndMs = "foo";
+    o.scheduleStartMs = "foo";
+    o.type = "foo";
+    o.variableId = "foo";
+  }
+  buildCounterVariable--;
+  return o;
+}
+
+checkVariable(api.Variable o) {
+  buildCounterVariable++;
+  if (buildCounterVariable < 3) {
+    unittest.expect(o.accountId, unittest.equals('foo'));
+    unittest.expect(o.containerId, unittest.equals('foo'));
+    checkUnnamed1083(o.disablingTriggerId);
+    checkUnnamed1084(o.enablingTriggerId);
+    unittest.expect(o.fingerprint, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.notes, unittest.equals('foo'));
+    checkUnnamed1085(o.parameter);
+    unittest.expect(o.scheduleEndMs, unittest.equals('foo'));
+    unittest.expect(o.scheduleStartMs, unittest.equals('foo'));
+    unittest.expect(o.type, unittest.equals('foo'));
+    unittest.expect(o.variableId, unittest.equals('foo'));
+  }
+  buildCounterVariable--;
+}
+
+
+main() {
+  unittest.group("obj-schema-Account", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildAccount();
+      var od = new api.Account.fromJson(o.toJson());
+      checkAccount(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-AccountAccess", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildAccountAccess();
+      var od = new api.AccountAccess.fromJson(o.toJson());
+      checkAccountAccess(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-Container", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildContainer();
+      var od = new api.Container.fromJson(o.toJson());
+      checkContainer(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ContainerAccess", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildContainerAccess();
+      var od = new api.ContainerAccess.fromJson(o.toJson());
+      checkContainerAccess(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ContainerVersion", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildContainerVersion();
+      var od = new api.ContainerVersion.fromJson(o.toJson());
+      checkContainerVersion(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ContainerVersionHeader", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildContainerVersionHeader();
+      var od = new api.ContainerVersionHeader.fromJson(o.toJson());
+      checkContainerVersionHeader(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-CreateContainerVersionRequestVersionOptions", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildCreateContainerVersionRequestVersionOptions();
+      var od = new api.CreateContainerVersionRequestVersionOptions.fromJson(o.toJson());
+      checkCreateContainerVersionRequestVersionOptions(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-CreateContainerVersionResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildCreateContainerVersionResponse();
+      var od = new api.CreateContainerVersionResponse.fromJson(o.toJson());
+      checkCreateContainerVersionResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ListAccountUsersResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListAccountUsersResponse();
+      var od = new api.ListAccountUsersResponse.fromJson(o.toJson());
+      checkListAccountUsersResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ListAccountsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListAccountsResponse();
+      var od = new api.ListAccountsResponse.fromJson(o.toJson());
+      checkListAccountsResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ListContainerVersionsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListContainerVersionsResponse();
+      var od = new api.ListContainerVersionsResponse.fromJson(o.toJson());
+      checkListContainerVersionsResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ListContainersResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListContainersResponse();
+      var od = new api.ListContainersResponse.fromJson(o.toJson());
+      checkListContainersResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ListMacrosResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListMacrosResponse();
+      var od = new api.ListMacrosResponse.fromJson(o.toJson());
+      checkListMacrosResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ListRulesResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListRulesResponse();
+      var od = new api.ListRulesResponse.fromJson(o.toJson());
+      checkListRulesResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ListTagsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListTagsResponse();
+      var od = new api.ListTagsResponse.fromJson(o.toJson());
+      checkListTagsResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ListTriggersResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListTriggersResponse();
+      var od = new api.ListTriggersResponse.fromJson(o.toJson());
+      checkListTriggersResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ListVariablesResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListVariablesResponse();
+      var od = new api.ListVariablesResponse.fromJson(o.toJson());
+      checkListVariablesResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-Macro", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildMacro();
+      var od = new api.Macro.fromJson(o.toJson());
+      checkMacro(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-Parameter", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildParameter();
+      var od = new api.Parameter.fromJson(o.toJson());
+      checkParameter(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-PublishContainerVersionResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildPublishContainerVersionResponse();
+      var od = new api.PublishContainerVersionResponse.fromJson(o.toJson());
+      checkPublishContainerVersionResponse(od);
+    });
+  });
+
+
+  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-Tag", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildTag();
+      var od = new api.Tag.fromJson(o.toJson());
+      checkTag(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-Trigger", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildTrigger();
+      var od = new api.Trigger.fromJson(o.toJson());
+      checkTrigger(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-UserAccess", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildUserAccess();
+      var od = new api.UserAccess.fromJson(o.toJson());
+      checkUserAccess(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-Variable", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildVariable();
+      var od = new api.Variable.fromJson(o.toJson());
+      checkVariable(od);
+    });
+  });
+
+
+  unittest.group("resource-AccountsResourceApi", () {
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsResourceApi res = new api.TagmanagerApi(mock).accounts;
+      var arg_accountId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+
+        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(buildAccount());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_accountId).then(unittest.expectAsync(((api.Account response) {
+        checkAccount(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsResourceApi res = new api.TagmanagerApi(mock).accounts;
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("accounts"));
+        pathOffset += 8;
+
+        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(buildListAccountsResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list().then(unittest.expectAsync(((api.ListAccountsResponse response) {
+        checkListAccountsResponse(response);
+      })));
+    });
+
+    unittest.test("method--update", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsResourceApi res = new api.TagmanagerApi(mock).accounts;
+      var arg_request = buildAccount();
+      var arg_accountId = "foo";
+      var arg_fingerprint = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.Account.fromJson(json);
+        checkAccount(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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+
+        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["fingerprint"].first, unittest.equals(arg_fingerprint));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildAccount());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.update(arg_request, arg_accountId, fingerprint: arg_fingerprint).then(unittest.expectAsync(((api.Account response) {
+        checkAccount(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-AccountsContainersResourceApi", () {
+    unittest.test("method--create", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersResourceApi res = new api.TagmanagerApi(mock).accounts.containers;
+      var arg_request = buildContainer();
+      var arg_accountId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.Container.fromJson(json);
+        checkContainer(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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/containers"));
+        pathOffset += 11;
+
+        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(buildContainer());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.create(arg_request, arg_accountId).then(unittest.expectAsync(((api.Container response) {
+        checkContainer(response);
+      })));
+    });
+
+    unittest.test("method--delete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersResourceApi res = new api.TagmanagerApi(mock).accounts.containers;
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.delete(arg_accountId, arg_containerId).then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersResourceApi res = new api.TagmanagerApi(mock).accounts.containers;
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+
+        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(buildContainer());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_accountId, arg_containerId).then(unittest.expectAsync(((api.Container response) {
+        checkContainer(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersResourceApi res = new api.TagmanagerApi(mock).accounts.containers;
+      var arg_accountId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/containers"));
+        pathOffset += 11;
+
+        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(buildListContainersResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_accountId).then(unittest.expectAsync(((api.ListContainersResponse response) {
+        checkListContainersResponse(response);
+      })));
+    });
+
+    unittest.test("method--update", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersResourceApi res = new api.TagmanagerApi(mock).accounts.containers;
+      var arg_request = buildContainer();
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      var arg_fingerprint = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.Container.fromJson(json);
+        checkContainer(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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+
+        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["fingerprint"].first, unittest.equals(arg_fingerprint));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildContainer());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.update(arg_request, arg_accountId, arg_containerId, fingerprint: arg_fingerprint).then(unittest.expectAsync(((api.Container response) {
+        checkContainer(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-AccountsContainersMacrosResourceApi", () {
+    unittest.test("method--create", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersMacrosResourceApi res = new api.TagmanagerApi(mock).accounts.containers.macros;
+      var arg_request = buildMacro();
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.Macro.fromJson(json);
+        checkMacro(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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/macros", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/macros"));
+        pathOffset += 7;
+
+        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(buildMacro());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.create(arg_request, arg_accountId, arg_containerId).then(unittest.expectAsync(((api.Macro response) {
+        checkMacro(response);
+      })));
+    });
+
+    unittest.test("method--delete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersMacrosResourceApi res = new api.TagmanagerApi(mock).accounts.containers.macros;
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      var arg_macroId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/macros/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/macros/"));
+        pathOffset += 8;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_macroId"));
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.delete(arg_accountId, arg_containerId, arg_macroId).then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersMacrosResourceApi res = new api.TagmanagerApi(mock).accounts.containers.macros;
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      var arg_macroId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/macros/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/macros/"));
+        pathOffset += 8;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_macroId"));
+
+        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(buildMacro());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_accountId, arg_containerId, arg_macroId).then(unittest.expectAsync(((api.Macro response) {
+        checkMacro(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersMacrosResourceApi res = new api.TagmanagerApi(mock).accounts.containers.macros;
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/macros", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/macros"));
+        pathOffset += 7;
+
+        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(buildListMacrosResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_accountId, arg_containerId).then(unittest.expectAsync(((api.ListMacrosResponse response) {
+        checkListMacrosResponse(response);
+      })));
+    });
+
+    unittest.test("method--update", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersMacrosResourceApi res = new api.TagmanagerApi(mock).accounts.containers.macros;
+      var arg_request = buildMacro();
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      var arg_macroId = "foo";
+      var arg_fingerprint = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.Macro.fromJson(json);
+        checkMacro(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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/macros/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/macros/"));
+        pathOffset += 8;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_macroId"));
+
+        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["fingerprint"].first, unittest.equals(arg_fingerprint));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildMacro());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.update(arg_request, arg_accountId, arg_containerId, arg_macroId, fingerprint: arg_fingerprint).then(unittest.expectAsync(((api.Macro response) {
+        checkMacro(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-AccountsContainersRulesResourceApi", () {
+    unittest.test("method--create", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersRulesResourceApi res = new api.TagmanagerApi(mock).accounts.containers.rules;
+      var arg_request = buildRule();
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.Rule.fromJson(json);
+        checkRule(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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/rules", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/rules"));
+        pathOffset += 6;
+
+        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(buildRule());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.create(arg_request, arg_accountId, arg_containerId).then(unittest.expectAsync(((api.Rule response) {
+        checkRule(response);
+      })));
+    });
+
+    unittest.test("method--delete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersRulesResourceApi res = new api.TagmanagerApi(mock).accounts.containers.rules;
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      var arg_ruleId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/rules/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/rules/"));
+        pathOffset += 7;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_ruleId"));
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.delete(arg_accountId, arg_containerId, arg_ruleId).then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersRulesResourceApi res = new api.TagmanagerApi(mock).accounts.containers.rules;
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      var arg_ruleId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/rules/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/rules/"));
+        pathOffset += 7;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_ruleId"));
+
+        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(buildRule());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_accountId, arg_containerId, arg_ruleId).then(unittest.expectAsync(((api.Rule response) {
+        checkRule(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersRulesResourceApi res = new api.TagmanagerApi(mock).accounts.containers.rules;
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/rules", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/rules"));
+        pathOffset += 6;
+
+        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(buildListRulesResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_accountId, arg_containerId).then(unittest.expectAsync(((api.ListRulesResponse response) {
+        checkListRulesResponse(response);
+      })));
+    });
+
+    unittest.test("method--update", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersRulesResourceApi res = new api.TagmanagerApi(mock).accounts.containers.rules;
+      var arg_request = buildRule();
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      var arg_ruleId = "foo";
+      var arg_fingerprint = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.Rule.fromJson(json);
+        checkRule(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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/rules/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/rules/"));
+        pathOffset += 7;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_ruleId"));
+
+        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["fingerprint"].first, unittest.equals(arg_fingerprint));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildRule());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.update(arg_request, arg_accountId, arg_containerId, arg_ruleId, fingerprint: arg_fingerprint).then(unittest.expectAsync(((api.Rule response) {
+        checkRule(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-AccountsContainersTagsResourceApi", () {
+    unittest.test("method--create", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersTagsResourceApi res = new api.TagmanagerApi(mock).accounts.containers.tags;
+      var arg_request = buildTag();
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.Tag.fromJson(json);
+        checkTag(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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/tags", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/tags"));
+        pathOffset += 5;
+
+        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(buildTag());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.create(arg_request, arg_accountId, arg_containerId).then(unittest.expectAsync(((api.Tag response) {
+        checkTag(response);
+      })));
+    });
+
+    unittest.test("method--delete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersTagsResourceApi res = new api.TagmanagerApi(mock).accounts.containers.tags;
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      var arg_tagId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/tags/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/tags/"));
+        pathOffset += 6;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_tagId"));
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.delete(arg_accountId, arg_containerId, arg_tagId).then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersTagsResourceApi res = new api.TagmanagerApi(mock).accounts.containers.tags;
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      var arg_tagId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/tags/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/tags/"));
+        pathOffset += 6;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_tagId"));
+
+        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(buildTag());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_accountId, arg_containerId, arg_tagId).then(unittest.expectAsync(((api.Tag response) {
+        checkTag(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersTagsResourceApi res = new api.TagmanagerApi(mock).accounts.containers.tags;
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/tags", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/tags"));
+        pathOffset += 5;
+
+        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(buildListTagsResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_accountId, arg_containerId).then(unittest.expectAsync(((api.ListTagsResponse response) {
+        checkListTagsResponse(response);
+      })));
+    });
+
+    unittest.test("method--update", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersTagsResourceApi res = new api.TagmanagerApi(mock).accounts.containers.tags;
+      var arg_request = buildTag();
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      var arg_tagId = "foo";
+      var arg_fingerprint = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.Tag.fromJson(json);
+        checkTag(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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/tags/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/tags/"));
+        pathOffset += 6;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_tagId"));
+
+        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["fingerprint"].first, unittest.equals(arg_fingerprint));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildTag());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.update(arg_request, arg_accountId, arg_containerId, arg_tagId, fingerprint: arg_fingerprint).then(unittest.expectAsync(((api.Tag response) {
+        checkTag(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-AccountsContainersTriggersResourceApi", () {
+    unittest.test("method--create", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersTriggersResourceApi res = new api.TagmanagerApi(mock).accounts.containers.triggers;
+      var arg_request = buildTrigger();
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.Trigger.fromJson(json);
+        checkTrigger(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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/triggers", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/triggers"));
+        pathOffset += 9;
+
+        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(buildTrigger());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.create(arg_request, arg_accountId, arg_containerId).then(unittest.expectAsync(((api.Trigger response) {
+        checkTrigger(response);
+      })));
+    });
+
+    unittest.test("method--delete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersTriggersResourceApi res = new api.TagmanagerApi(mock).accounts.containers.triggers;
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      var arg_triggerId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/triggers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/triggers/"));
+        pathOffset += 10;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_triggerId"));
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.delete(arg_accountId, arg_containerId, arg_triggerId).then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersTriggersResourceApi res = new api.TagmanagerApi(mock).accounts.containers.triggers;
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      var arg_triggerId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/triggers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/triggers/"));
+        pathOffset += 10;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_triggerId"));
+
+        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(buildTrigger());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_accountId, arg_containerId, arg_triggerId).then(unittest.expectAsync(((api.Trigger response) {
+        checkTrigger(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersTriggersResourceApi res = new api.TagmanagerApi(mock).accounts.containers.triggers;
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/triggers", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/triggers"));
+        pathOffset += 9;
+
+        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(buildListTriggersResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_accountId, arg_containerId).then(unittest.expectAsync(((api.ListTriggersResponse response) {
+        checkListTriggersResponse(response);
+      })));
+    });
+
+    unittest.test("method--update", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersTriggersResourceApi res = new api.TagmanagerApi(mock).accounts.containers.triggers;
+      var arg_request = buildTrigger();
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      var arg_triggerId = "foo";
+      var arg_fingerprint = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.Trigger.fromJson(json);
+        checkTrigger(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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/triggers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/triggers/"));
+        pathOffset += 10;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_triggerId"));
+
+        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["fingerprint"].first, unittest.equals(arg_fingerprint));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildTrigger());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.update(arg_request, arg_accountId, arg_containerId, arg_triggerId, fingerprint: arg_fingerprint).then(unittest.expectAsync(((api.Trigger response) {
+        checkTrigger(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-AccountsContainersVariablesResourceApi", () {
+    unittest.test("method--create", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersVariablesResourceApi res = new api.TagmanagerApi(mock).accounts.containers.variables;
+      var arg_request = buildVariable();
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.Variable.fromJson(json);
+        checkVariable(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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/variables", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/variables"));
+        pathOffset += 10;
+
+        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(buildVariable());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.create(arg_request, arg_accountId, arg_containerId).then(unittest.expectAsync(((api.Variable response) {
+        checkVariable(response);
+      })));
+    });
+
+    unittest.test("method--delete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersVariablesResourceApi res = new api.TagmanagerApi(mock).accounts.containers.variables;
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      var arg_variableId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/variables/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/variables/"));
+        pathOffset += 11;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_variableId"));
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.delete(arg_accountId, arg_containerId, arg_variableId).then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersVariablesResourceApi res = new api.TagmanagerApi(mock).accounts.containers.variables;
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      var arg_variableId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/variables/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/variables/"));
+        pathOffset += 11;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_variableId"));
+
+        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(buildVariable());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_accountId, arg_containerId, arg_variableId).then(unittest.expectAsync(((api.Variable response) {
+        checkVariable(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersVariablesResourceApi res = new api.TagmanagerApi(mock).accounts.containers.variables;
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/variables", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/variables"));
+        pathOffset += 10;
+
+        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(buildListVariablesResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_accountId, arg_containerId).then(unittest.expectAsync(((api.ListVariablesResponse response) {
+        checkListVariablesResponse(response);
+      })));
+    });
+
+    unittest.test("method--update", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersVariablesResourceApi res = new api.TagmanagerApi(mock).accounts.containers.variables;
+      var arg_request = buildVariable();
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      var arg_variableId = "foo";
+      var arg_fingerprint = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.Variable.fromJson(json);
+        checkVariable(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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/variables/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/variables/"));
+        pathOffset += 11;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_variableId"));
+
+        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["fingerprint"].first, unittest.equals(arg_fingerprint));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildVariable());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.update(arg_request, arg_accountId, arg_containerId, arg_variableId, fingerprint: arg_fingerprint).then(unittest.expectAsync(((api.Variable response) {
+        checkVariable(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-AccountsContainersVersionsResourceApi", () {
+    unittest.test("method--create", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersVersionsResourceApi res = new api.TagmanagerApi(mock).accounts.containers.versions;
+      var arg_request = buildCreateContainerVersionRequestVersionOptions();
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.CreateContainerVersionRequestVersionOptions.fromJson(json);
+        checkCreateContainerVersionRequestVersionOptions(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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/versions", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/versions"));
+        pathOffset += 9;
+
+        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(buildCreateContainerVersionResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.create(arg_request, arg_accountId, arg_containerId).then(unittest.expectAsync(((api.CreateContainerVersionResponse response) {
+        checkCreateContainerVersionResponse(response);
+      })));
+    });
+
+    unittest.test("method--delete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersVersionsResourceApi res = new api.TagmanagerApi(mock).accounts.containers.versions;
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      var arg_containerVersionId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/versions/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/versions/"));
+        pathOffset += 10;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_containerVersionId"));
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.delete(arg_accountId, arg_containerId, arg_containerVersionId).then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersVersionsResourceApi res = new api.TagmanagerApi(mock).accounts.containers.versions;
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      var arg_containerVersionId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/versions/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/versions/"));
+        pathOffset += 10;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_containerVersionId"));
+
+        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(buildContainerVersion());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_accountId, arg_containerId, arg_containerVersionId).then(unittest.expectAsync(((api.ContainerVersion response) {
+        checkContainerVersion(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersVersionsResourceApi res = new api.TagmanagerApi(mock).accounts.containers.versions;
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      var arg_headers = true;
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/versions", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/versions"));
+        pathOffset += 9;
+
+        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["headers"].first, unittest.equals("$arg_headers"));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildListContainerVersionsResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_accountId, arg_containerId, headers: arg_headers).then(unittest.expectAsync(((api.ListContainerVersionsResponse response) {
+        checkListContainerVersionsResponse(response);
+      })));
+    });
+
+    unittest.test("method--publish", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersVersionsResourceApi res = new api.TagmanagerApi(mock).accounts.containers.versions;
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      var arg_containerVersionId = "foo";
+      var arg_fingerprint = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/versions/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/versions/"));
+        pathOffset += 10;
+        index = path.indexOf("/publish", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerVersionId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/publish"));
+        pathOffset += 8;
+
+        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["fingerprint"].first, unittest.equals(arg_fingerprint));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildPublishContainerVersionResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.publish(arg_accountId, arg_containerId, arg_containerVersionId, fingerprint: arg_fingerprint).then(unittest.expectAsync(((api.PublishContainerVersionResponse response) {
+        checkPublishContainerVersionResponse(response);
+      })));
+    });
+
+    unittest.test("method--restore", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersVersionsResourceApi res = new api.TagmanagerApi(mock).accounts.containers.versions;
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      var arg_containerVersionId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/versions/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/versions/"));
+        pathOffset += 10;
+        index = path.indexOf("/restore", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerVersionId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/restore"));
+        pathOffset += 8;
+
+        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(buildContainerVersion());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.restore(arg_accountId, arg_containerId, arg_containerVersionId).then(unittest.expectAsync(((api.ContainerVersion response) {
+        checkContainerVersion(response);
+      })));
+    });
+
+    unittest.test("method--undelete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersVersionsResourceApi res = new api.TagmanagerApi(mock).accounts.containers.versions;
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      var arg_containerVersionId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/versions/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/versions/"));
+        pathOffset += 10;
+        index = path.indexOf("/undelete", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerVersionId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/undelete"));
+        pathOffset += 9;
+
+        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(buildContainerVersion());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.undelete(arg_accountId, arg_containerId, arg_containerVersionId).then(unittest.expectAsync(((api.ContainerVersion response) {
+        checkContainerVersion(response);
+      })));
+    });
+
+    unittest.test("method--update", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsContainersVersionsResourceApi res = new api.TagmanagerApi(mock).accounts.containers.versions;
+      var arg_request = buildContainerVersion();
+      var arg_accountId = "foo";
+      var arg_containerId = "foo";
+      var arg_containerVersionId = "foo";
+      var arg_fingerprint = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.ContainerVersion.fromJson(json);
+        checkContainerVersion(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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/containers/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/containers/"));
+        pathOffset += 12;
+        index = path.indexOf("/versions/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_containerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/versions/"));
+        pathOffset += 10;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_containerVersionId"));
+
+        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["fingerprint"].first, unittest.equals(arg_fingerprint));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildContainerVersion());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.update(arg_request, arg_accountId, arg_containerId, arg_containerVersionId, fingerprint: arg_fingerprint).then(unittest.expectAsync(((api.ContainerVersion response) {
+        checkContainerVersion(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-AccountsPermissionsResourceApi", () {
+    unittest.test("method--create", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsPermissionsResourceApi res = new api.TagmanagerApi(mock).accounts.permissions;
+      var arg_request = buildUserAccess();
+      var arg_accountId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.UserAccess.fromJson(json);
+        checkUserAccess(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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/permissions", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/permissions"));
+        pathOffset += 12;
+
+        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(buildUserAccess());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.create(arg_request, arg_accountId).then(unittest.expectAsync(((api.UserAccess response) {
+        checkUserAccess(response);
+      })));
+    });
+
+    unittest.test("method--delete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsPermissionsResourceApi res = new api.TagmanagerApi(mock).accounts.permissions;
+      var arg_accountId = "foo";
+      var arg_permissionId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/permissions/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/permissions/"));
+        pathOffset += 13;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_permissionId"));
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.delete(arg_accountId, arg_permissionId).then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsPermissionsResourceApi res = new api.TagmanagerApi(mock).accounts.permissions;
+      var arg_accountId = "foo";
+      var arg_permissionId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/permissions/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/permissions/"));
+        pathOffset += 13;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_permissionId"));
+
+        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(buildUserAccess());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_accountId, arg_permissionId).then(unittest.expectAsync(((api.UserAccess response) {
+        checkUserAccess(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsPermissionsResourceApi res = new api.TagmanagerApi(mock).accounts.permissions;
+      var arg_accountId = "foo";
+      mock.register(unittest.expectAsync((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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/permissions", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/permissions"));
+        pathOffset += 12;
+
+        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(buildListAccountUsersResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_accountId).then(unittest.expectAsync(((api.ListAccountUsersResponse response) {
+        checkListAccountUsersResponse(response);
+      })));
+    });
+
+    unittest.test("method--update", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AccountsPermissionsResourceApi res = new api.TagmanagerApi(mock).accounts.permissions;
+      var arg_request = buildUserAccess();
+      var arg_accountId = "foo";
+      var arg_permissionId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.UserAccess.fromJson(json);
+        checkUserAccess(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 + 14), unittest.equals("tagmanager/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
+        pathOffset += 9;
+        index = path.indexOf("/permissions/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/permissions/"));
+        pathOffset += 13;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_permissionId"));
+
+        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(buildUserAccess());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.update(arg_request, arg_accountId, arg_permissionId).then(unittest.expectAsync(((api.UserAccess response) {
+        checkUserAccess(response);
+      })));
+    });
+
+  });
+
+
+}
+
diff --git a/generated/googleapis/test/translate/v2_test.dart b/generated/googleapis/test/translate/v2_test.dart
index de079ab..c1c4f0b 100644
--- a/generated/googleapis/test/translate/v2_test.dart
+++ b/generated/googleapis/test/translate/v2_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed441() {
+buildUnnamed1089() {
   var o = new core.List<api.DetectionsResource>();
   o.add(buildDetectionsResource());
   o.add(buildDetectionsResource());
   return o;
 }
 
-checkUnnamed441(core.List<api.DetectionsResource> o) {
+checkUnnamed1089(core.List<api.DetectionsResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDetectionsResource(o[0]);
   checkDetectionsResource(o[1]);
@@ -34,7 +34,7 @@
   var o = new api.DetectionsListResponse();
   buildCounterDetectionsListResponse++;
   if (buildCounterDetectionsListResponse < 3) {
-    o.detections = buildUnnamed441();
+    o.detections = buildUnnamed1089();
   }
   buildCounterDetectionsListResponse--;
   return o;
@@ -43,7 +43,7 @@
 checkDetectionsListResponse(api.DetectionsListResponse o) {
   buildCounterDetectionsListResponse++;
   if (buildCounterDetectionsListResponse < 3) {
-    checkUnnamed441(o.detections);
+    checkUnnamed1089(o.detections);
   }
   buildCounterDetectionsListResponse--;
 }
@@ -84,14 +84,14 @@
   checkDetectionsResourceElement(o[1]);
 }
 
-buildUnnamed442() {
+buildUnnamed1090() {
   var o = new core.List<api.LanguagesResource>();
   o.add(buildLanguagesResource());
   o.add(buildLanguagesResource());
   return o;
 }
 
-checkUnnamed442(core.List<api.LanguagesResource> o) {
+checkUnnamed1090(core.List<api.LanguagesResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLanguagesResource(o[0]);
   checkLanguagesResource(o[1]);
@@ -102,7 +102,7 @@
   var o = new api.LanguagesListResponse();
   buildCounterLanguagesListResponse++;
   if (buildCounterLanguagesListResponse < 3) {
-    o.languages = buildUnnamed442();
+    o.languages = buildUnnamed1090();
   }
   buildCounterLanguagesListResponse--;
   return o;
@@ -111,7 +111,7 @@
 checkLanguagesListResponse(api.LanguagesListResponse o) {
   buildCounterLanguagesListResponse++;
   if (buildCounterLanguagesListResponse < 3) {
-    checkUnnamed442(o.languages);
+    checkUnnamed1090(o.languages);
   }
   buildCounterLanguagesListResponse--;
 }
@@ -137,14 +137,14 @@
   buildCounterLanguagesResource--;
 }
 
-buildUnnamed443() {
+buildUnnamed1091() {
   var o = new core.List<api.TranslationsResource>();
   o.add(buildTranslationsResource());
   o.add(buildTranslationsResource());
   return o;
 }
 
-checkUnnamed443(core.List<api.TranslationsResource> o) {
+checkUnnamed1091(core.List<api.TranslationsResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTranslationsResource(o[0]);
   checkTranslationsResource(o[1]);
@@ -155,7 +155,7 @@
   var o = new api.TranslationsListResponse();
   buildCounterTranslationsListResponse++;
   if (buildCounterTranslationsListResponse < 3) {
-    o.translations = buildUnnamed443();
+    o.translations = buildUnnamed1091();
   }
   buildCounterTranslationsListResponse--;
   return o;
@@ -164,7 +164,7 @@
 checkTranslationsListResponse(api.TranslationsListResponse o) {
   buildCounterTranslationsListResponse++;
   if (buildCounterTranslationsListResponse < 3) {
-    checkUnnamed443(o.translations);
+    checkUnnamed1091(o.translations);
   }
   buildCounterTranslationsListResponse--;
 }
@@ -190,40 +190,40 @@
   buildCounterTranslationsResource--;
 }
 
-buildUnnamed444() {
+buildUnnamed1092() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed444(core.List<core.String> 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'));
 }
 
-buildUnnamed445() {
+buildUnnamed1093() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed445(core.List<core.String> o) {
+checkUnnamed1093(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed446() {
+buildUnnamed1094() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed446(core.List<core.String> 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'));
@@ -299,7 +299,7 @@
 
       var mock = new common_test.HttpServerMock();
       api.DetectionsResourceApi res = new api.TranslateApi(mock).detections;
-      var arg_q = buildUnnamed444();
+      var arg_q = buildUnnamed1092();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -401,9 +401,9 @@
 
       var mock = new common_test.HttpServerMock();
       api.TranslationsResourceApi res = new api.TranslateApi(mock).translations;
-      var arg_q = buildUnnamed445();
+      var arg_q = buildUnnamed1093();
       var arg_target = "foo";
-      var arg_cid = buildUnnamed446();
+      var arg_cid = buildUnnamed1094();
       var arg_format = "foo";
       var arg_source = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
diff --git a/generated/googleapis/test/urlshortener/v1_test.dart b/generated/googleapis/test/urlshortener/v1_test.dart
index d94406f..3fbdb44 100644
--- a/generated/googleapis/test/urlshortener/v1_test.dart
+++ b/generated/googleapis/test/urlshortener/v1_test.dart
@@ -16,53 +16,53 @@
 
 
 
-buildUnnamed447() {
+buildUnnamed1095() {
   var o = new core.List<api.StringCount>();
   o.add(buildStringCount());
   o.add(buildStringCount());
   return o;
 }
 
-checkUnnamed447(core.List<api.StringCount> o) {
+checkUnnamed1095(core.List<api.StringCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStringCount(o[0]);
   checkStringCount(o[1]);
 }
 
-buildUnnamed448() {
+buildUnnamed1096() {
   var o = new core.List<api.StringCount>();
   o.add(buildStringCount());
   o.add(buildStringCount());
   return o;
 }
 
-checkUnnamed448(core.List<api.StringCount> o) {
+checkUnnamed1096(core.List<api.StringCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStringCount(o[0]);
   checkStringCount(o[1]);
 }
 
-buildUnnamed449() {
+buildUnnamed1097() {
   var o = new core.List<api.StringCount>();
   o.add(buildStringCount());
   o.add(buildStringCount());
   return o;
 }
 
-checkUnnamed449(core.List<api.StringCount> o) {
+checkUnnamed1097(core.List<api.StringCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStringCount(o[0]);
   checkStringCount(o[1]);
 }
 
-buildUnnamed450() {
+buildUnnamed1098() {
   var o = new core.List<api.StringCount>();
   o.add(buildStringCount());
   o.add(buildStringCount());
   return o;
 }
 
-checkUnnamed450(core.List<api.StringCount> o) {
+checkUnnamed1098(core.List<api.StringCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStringCount(o[0]);
   checkStringCount(o[1]);
@@ -73,11 +73,11 @@
   var o = new api.AnalyticsSnapshot();
   buildCounterAnalyticsSnapshot++;
   if (buildCounterAnalyticsSnapshot < 3) {
-    o.browsers = buildUnnamed447();
-    o.countries = buildUnnamed448();
+    o.browsers = buildUnnamed1095();
+    o.countries = buildUnnamed1096();
     o.longUrlClicks = "foo";
-    o.platforms = buildUnnamed449();
-    o.referrers = buildUnnamed450();
+    o.platforms = buildUnnamed1097();
+    o.referrers = buildUnnamed1098();
     o.shortUrlClicks = "foo";
   }
   buildCounterAnalyticsSnapshot--;
@@ -87,11 +87,11 @@
 checkAnalyticsSnapshot(api.AnalyticsSnapshot o) {
   buildCounterAnalyticsSnapshot++;
   if (buildCounterAnalyticsSnapshot < 3) {
-    checkUnnamed447(o.browsers);
-    checkUnnamed448(o.countries);
+    checkUnnamed1095(o.browsers);
+    checkUnnamed1096(o.countries);
     unittest.expect(o.longUrlClicks, unittest.equals('foo'));
-    checkUnnamed449(o.platforms);
-    checkUnnamed450(o.referrers);
+    checkUnnamed1097(o.platforms);
+    checkUnnamed1098(o.referrers);
     unittest.expect(o.shortUrlClicks, unittest.equals('foo'));
   }
   buildCounterAnalyticsSnapshot--;
@@ -174,14 +174,14 @@
   buildCounterUrl--;
 }
 
-buildUnnamed451() {
+buildUnnamed1099() {
   var o = new core.List<api.Url>();
   o.add(buildUrl());
   o.add(buildUrl());
   return o;
 }
 
-checkUnnamed451(core.List<api.Url> o) {
+checkUnnamed1099(core.List<api.Url> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrl(o[0]);
   checkUrl(o[1]);
@@ -192,7 +192,7 @@
   var o = new api.UrlHistory();
   buildCounterUrlHistory++;
   if (buildCounterUrlHistory < 3) {
-    o.items = buildUnnamed451();
+    o.items = buildUnnamed1099();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextPageToken = "foo";
@@ -205,7 +205,7 @@
 checkUrlHistory(api.UrlHistory o) {
   buildCounterUrlHistory++;
   if (buildCounterUrlHistory < 3) {
-    checkUnnamed451(o.items);
+    checkUnnamed1099(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
diff --git a/generated/googleapis/test/webfonts/v1_test.dart b/generated/googleapis/test/webfonts/v1_test.dart
index 8f889ac..1b6fde0 100644
--- a/generated/googleapis/test/webfonts/v1_test.dart
+++ b/generated/googleapis/test/webfonts/v1_test.dart
@@ -16,40 +16,40 @@
 
 
 
-buildUnnamed772() {
+buildUnnamed1100() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed772(core.Map<core.String, core.String> o) {
+checkUnnamed1100(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'));
 }
 
-buildUnnamed773() {
+buildUnnamed1101() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed773(core.List<core.String> o) {
+checkUnnamed1101(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed774() {
+buildUnnamed1102() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed774(core.List<core.String> o) {
+checkUnnamed1102(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -62,11 +62,11 @@
   if (buildCounterWebfont < 3) {
     o.category = "foo";
     o.family = "foo";
-    o.files = buildUnnamed772();
+    o.files = buildUnnamed1100();
     o.kind = "foo";
     o.lastModified = core.DateTime.parse("2002-02-27T14:01:02Z");
-    o.subsets = buildUnnamed773();
-    o.variants = buildUnnamed774();
+    o.subsets = buildUnnamed1101();
+    o.variants = buildUnnamed1102();
     o.version = "foo";
   }
   buildCounterWebfont--;
@@ -78,24 +78,24 @@
   if (buildCounterWebfont < 3) {
     unittest.expect(o.category, unittest.equals('foo'));
     unittest.expect(o.family, unittest.equals('foo'));
-    checkUnnamed772(o.files);
+    checkUnnamed1100(o.files);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastModified, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
-    checkUnnamed773(o.subsets);
-    checkUnnamed774(o.variants);
+    checkUnnamed1101(o.subsets);
+    checkUnnamed1102(o.variants);
     unittest.expect(o.version, unittest.equals('foo'));
   }
   buildCounterWebfont--;
 }
 
-buildUnnamed775() {
+buildUnnamed1103() {
   var o = new core.List<api.Webfont>();
   o.add(buildWebfont());
   o.add(buildWebfont());
   return o;
 }
 
-checkUnnamed775(core.List<api.Webfont> o) {
+checkUnnamed1103(core.List<api.Webfont> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebfont(o[0]);
   checkWebfont(o[1]);
@@ -106,7 +106,7 @@
   var o = new api.WebfontList();
   buildCounterWebfontList++;
   if (buildCounterWebfontList < 3) {
-    o.items = buildUnnamed775();
+    o.items = buildUnnamed1103();
     o.kind = "foo";
   }
   buildCounterWebfontList--;
@@ -116,7 +116,7 @@
 checkWebfontList(api.WebfontList o) {
   buildCounterWebfontList++;
   if (buildCounterWebfontList < 3) {
-    checkUnnamed775(o.items);
+    checkUnnamed1103(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterWebfontList--;
diff --git a/generated/googleapis/test/webmasters/v3_test.dart b/generated/googleapis/test/webmasters/v3_test.dart
index 6c1d1a3..be7c8c3 100644
--- a/generated/googleapis/test/webmasters/v3_test.dart
+++ b/generated/googleapis/test/webmasters/v3_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed380() {
+buildUnnamed1104() {
   var o = new core.List<api.WmxSitemap>();
   o.add(buildWmxSitemap());
   o.add(buildWmxSitemap());
   return o;
 }
 
-checkUnnamed380(core.List<api.WmxSitemap> o) {
+checkUnnamed1104(core.List<api.WmxSitemap> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWmxSitemap(o[0]);
   checkWmxSitemap(o[1]);
@@ -34,7 +34,7 @@
   var o = new api.SitemapsListResponse();
   buildCounterSitemapsListResponse++;
   if (buildCounterSitemapsListResponse < 3) {
-    o.sitemap = buildUnnamed380();
+    o.sitemap = buildUnnamed1104();
   }
   buildCounterSitemapsListResponse--;
   return o;
@@ -43,19 +43,19 @@
 checkSitemapsListResponse(api.SitemapsListResponse o) {
   buildCounterSitemapsListResponse++;
   if (buildCounterSitemapsListResponse < 3) {
-    checkUnnamed380(o.sitemap);
+    checkUnnamed1104(o.sitemap);
   }
   buildCounterSitemapsListResponse--;
 }
 
-buildUnnamed381() {
+buildUnnamed1105() {
   var o = new core.List<api.WmxSite>();
   o.add(buildWmxSite());
   o.add(buildWmxSite());
   return o;
 }
 
-checkUnnamed381(core.List<api.WmxSite> o) {
+checkUnnamed1105(core.List<api.WmxSite> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWmxSite(o[0]);
   checkWmxSite(o[1]);
@@ -66,7 +66,7 @@
   var o = new api.SitesListResponse();
   buildCounterSitesListResponse++;
   if (buildCounterSitesListResponse < 3) {
-    o.siteEntry = buildUnnamed381();
+    o.siteEntry = buildUnnamed1105();
   }
   buildCounterSitesListResponse--;
   return o;
@@ -75,7 +75,7 @@
 checkSitesListResponse(api.SitesListResponse o) {
   buildCounterSitesListResponse++;
   if (buildCounterSitesListResponse < 3) {
-    checkUnnamed381(o.siteEntry);
+    checkUnnamed1105(o.siteEntry);
   }
   buildCounterSitesListResponse--;
 }
@@ -101,14 +101,14 @@
   buildCounterUrlCrawlErrorCount--;
 }
 
-buildUnnamed382() {
+buildUnnamed1106() {
   var o = new core.List<api.UrlCrawlErrorCount>();
   o.add(buildUrlCrawlErrorCount());
   o.add(buildUrlCrawlErrorCount());
   return o;
 }
 
-checkUnnamed382(core.List<api.UrlCrawlErrorCount> o) {
+checkUnnamed1106(core.List<api.UrlCrawlErrorCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlCrawlErrorCount(o[0]);
   checkUrlCrawlErrorCount(o[1]);
@@ -120,7 +120,7 @@
   buildCounterUrlCrawlErrorCountsPerType++;
   if (buildCounterUrlCrawlErrorCountsPerType < 3) {
     o.category = "foo";
-    o.entries = buildUnnamed382();
+    o.entries = buildUnnamed1106();
     o.platform = "foo";
   }
   buildCounterUrlCrawlErrorCountsPerType--;
@@ -131,20 +131,20 @@
   buildCounterUrlCrawlErrorCountsPerType++;
   if (buildCounterUrlCrawlErrorCountsPerType < 3) {
     unittest.expect(o.category, unittest.equals('foo'));
-    checkUnnamed382(o.entries);
+    checkUnnamed1106(o.entries);
     unittest.expect(o.platform, unittest.equals('foo'));
   }
   buildCounterUrlCrawlErrorCountsPerType--;
 }
 
-buildUnnamed383() {
+buildUnnamed1107() {
   var o = new core.List<api.UrlCrawlErrorCountsPerType>();
   o.add(buildUrlCrawlErrorCountsPerType());
   o.add(buildUrlCrawlErrorCountsPerType());
   return o;
 }
 
-checkUnnamed383(core.List<api.UrlCrawlErrorCountsPerType> o) {
+checkUnnamed1107(core.List<api.UrlCrawlErrorCountsPerType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlCrawlErrorCountsPerType(o[0]);
   checkUrlCrawlErrorCountsPerType(o[1]);
@@ -155,7 +155,7 @@
   var o = new api.UrlCrawlErrorsCountsQueryResponse();
   buildCounterUrlCrawlErrorsCountsQueryResponse++;
   if (buildCounterUrlCrawlErrorsCountsQueryResponse < 3) {
-    o.countPerTypes = buildUnnamed383();
+    o.countPerTypes = buildUnnamed1107();
   }
   buildCounterUrlCrawlErrorsCountsQueryResponse--;
   return o;
@@ -164,7 +164,7 @@
 checkUrlCrawlErrorsCountsQueryResponse(api.UrlCrawlErrorsCountsQueryResponse o) {
   buildCounterUrlCrawlErrorsCountsQueryResponse++;
   if (buildCounterUrlCrawlErrorsCountsQueryResponse < 3) {
-    checkUnnamed383(o.countPerTypes);
+    checkUnnamed1107(o.countPerTypes);
   }
   buildCounterUrlCrawlErrorsCountsQueryResponse--;
 }
@@ -196,14 +196,14 @@
   buildCounterUrlCrawlErrorsSample--;
 }
 
-buildUnnamed384() {
+buildUnnamed1108() {
   var o = new core.List<api.UrlCrawlErrorsSample>();
   o.add(buildUrlCrawlErrorsSample());
   o.add(buildUrlCrawlErrorsSample());
   return o;
 }
 
-checkUnnamed384(core.List<api.UrlCrawlErrorsSample> o) {
+checkUnnamed1108(core.List<api.UrlCrawlErrorsSample> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlCrawlErrorsSample(o[0]);
   checkUrlCrawlErrorsSample(o[1]);
@@ -214,7 +214,7 @@
   var o = new api.UrlCrawlErrorsSamplesListResponse();
   buildCounterUrlCrawlErrorsSamplesListResponse++;
   if (buildCounterUrlCrawlErrorsSamplesListResponse < 3) {
-    o.urlCrawlErrorSample = buildUnnamed384();
+    o.urlCrawlErrorSample = buildUnnamed1108();
   }
   buildCounterUrlCrawlErrorsSamplesListResponse--;
   return o;
@@ -223,32 +223,32 @@
 checkUrlCrawlErrorsSamplesListResponse(api.UrlCrawlErrorsSamplesListResponse o) {
   buildCounterUrlCrawlErrorsSamplesListResponse++;
   if (buildCounterUrlCrawlErrorsSamplesListResponse < 3) {
-    checkUnnamed384(o.urlCrawlErrorSample);
+    checkUnnamed1108(o.urlCrawlErrorSample);
   }
   buildCounterUrlCrawlErrorsSamplesListResponse--;
 }
 
-buildUnnamed385() {
+buildUnnamed1109() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed385(core.List<core.String> o) {
+checkUnnamed1109(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed386() {
+buildUnnamed1110() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed386(core.List<core.String> o) {
+checkUnnamed1110(core.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,8 +259,8 @@
   var o = new api.UrlSampleDetails();
   buildCounterUrlSampleDetails++;
   if (buildCounterUrlSampleDetails < 3) {
-    o.containingSitemaps = buildUnnamed385();
-    o.linkedFromUrls = buildUnnamed386();
+    o.containingSitemaps = buildUnnamed1109();
+    o.linkedFromUrls = buildUnnamed1110();
   }
   buildCounterUrlSampleDetails--;
   return o;
@@ -269,8 +269,8 @@
 checkUrlSampleDetails(api.UrlSampleDetails o) {
   buildCounterUrlSampleDetails++;
   if (buildCounterUrlSampleDetails < 3) {
-    checkUnnamed385(o.containingSitemaps);
-    checkUnnamed386(o.linkedFromUrls);
+    checkUnnamed1109(o.containingSitemaps);
+    checkUnnamed1110(o.linkedFromUrls);
   }
   buildCounterUrlSampleDetails--;
 }
@@ -296,14 +296,14 @@
   buildCounterWmxSite--;
 }
 
-buildUnnamed387() {
+buildUnnamed1111() {
   var o = new core.List<api.WmxSitemapContent>();
   o.add(buildWmxSitemapContent());
   o.add(buildWmxSitemapContent());
   return o;
 }
 
-checkUnnamed387(core.List<api.WmxSitemapContent> o) {
+checkUnnamed1111(core.List<api.WmxSitemapContent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWmxSitemapContent(o[0]);
   checkWmxSitemapContent(o[1]);
@@ -314,7 +314,7 @@
   var o = new api.WmxSitemap();
   buildCounterWmxSitemap++;
   if (buildCounterWmxSitemap < 3) {
-    o.contents = buildUnnamed387();
+    o.contents = buildUnnamed1111();
     o.errors = "foo";
     o.isPending = true;
     o.isSitemapsIndex = true;
@@ -331,7 +331,7 @@
 checkWmxSitemap(api.WmxSitemap o) {
   buildCounterWmxSitemap++;
   if (buildCounterWmxSitemap < 3) {
-    checkUnnamed387(o.contents);
+    checkUnnamed1111(o.contents);
     unittest.expect(o.errors, unittest.equals('foo'));
     unittest.expect(o.isPending, unittest.isTrue);
     unittest.expect(o.isSitemapsIndex, unittest.isTrue);
diff --git a/generated/googleapis/test/youtube/v3_test.dart b/generated/googleapis/test/youtube/v3_test.dart
index 41c15d4..c5af145 100644
--- a/generated/googleapis/test/youtube/v3_test.dart
+++ b/generated/googleapis/test/youtube/v3_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed337() {
+buildUnnamed1112() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed337(core.List<core.String> o) {
+checkUnnamed1112(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -35,7 +35,7 @@
   buildCounterAccessPolicy++;
   if (buildCounterAccessPolicy < 3) {
     o.allowed = true;
-    o.exception = buildUnnamed337();
+    o.exception = buildUnnamed1112();
   }
   buildCounterAccessPolicy--;
   return o;
@@ -45,7 +45,7 @@
   buildCounterAccessPolicy++;
   if (buildCounterAccessPolicy < 3) {
     unittest.expect(o.allowed, unittest.isTrue);
-    checkUnnamed337(o.exception);
+    checkUnnamed1112(o.exception);
   }
   buildCounterAccessPolicy--;
 }
@@ -234,27 +234,27 @@
   buildCounterActivityContentDetailsPlaylistItem--;
 }
 
-buildUnnamed338() {
+buildUnnamed1113() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed338(core.List<core.String> o) {
+checkUnnamed1113(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed339() {
+buildUnnamed1114() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed339(core.List<core.String> o) {
+checkUnnamed1114(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -272,8 +272,8 @@
     o.customCtaButtonText = "foo";
     o.descriptionText = "foo";
     o.destinationUrl = "foo";
-    o.forecastingUrl = buildUnnamed338();
-    o.impressionUrl = buildUnnamed339();
+    o.forecastingUrl = buildUnnamed1113();
+    o.impressionUrl = buildUnnamed1114();
     o.videoId = "foo";
   }
   buildCounterActivityContentDetailsPromotedItem--;
@@ -290,8 +290,8 @@
     unittest.expect(o.customCtaButtonText, unittest.equals('foo'));
     unittest.expect(o.descriptionText, unittest.equals('foo'));
     unittest.expect(o.destinationUrl, unittest.equals('foo'));
-    checkUnnamed338(o.forecastingUrl);
-    checkUnnamed339(o.impressionUrl);
+    checkUnnamed1113(o.forecastingUrl);
+    checkUnnamed1114(o.impressionUrl);
     unittest.expect(o.videoId, unittest.equals('foo'));
   }
   buildCounterActivityContentDetailsPromotedItem--;
@@ -385,14 +385,14 @@
   buildCounterActivityContentDetailsUpload--;
 }
 
-buildUnnamed340() {
+buildUnnamed1115() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed340(core.List<api.Activity> o) {
+checkUnnamed1115(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -405,7 +405,7 @@
   if (buildCounterActivityListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed340();
+    o.items = buildUnnamed1115();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -422,7 +422,7 @@
   if (buildCounterActivityListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed340(o.items);
+    checkUnnamed1115(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -580,14 +580,14 @@
   buildCounterChannelBannerResource--;
 }
 
-buildUnnamed341() {
+buildUnnamed1116() {
   var o = new core.List<api.PropertyValue>();
   o.add(buildPropertyValue());
   o.add(buildPropertyValue());
   return o;
 }
 
-checkUnnamed341(core.List<api.PropertyValue> o) {
+checkUnnamed1116(core.List<api.PropertyValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPropertyValue(o[0]);
   checkPropertyValue(o[1]);
@@ -599,7 +599,7 @@
   buildCounterChannelBrandingSettings++;
   if (buildCounterChannelBrandingSettings < 3) {
     o.channel = buildChannelSettings();
-    o.hints = buildUnnamed341();
+    o.hints = buildUnnamed1116();
     o.image = buildImageSettings();
     o.watch = buildWatchSettings();
   }
@@ -611,7 +611,7 @@
   buildCounterChannelBrandingSettings++;
   if (buildCounterChannelBrandingSettings < 3) {
     checkChannelSettings(o.channel);
-    checkUnnamed341(o.hints);
+    checkUnnamed1116(o.hints);
     checkImageSettings(o.image);
     checkWatchSettings(o.watch);
   }
@@ -708,14 +708,14 @@
   buildCounterChannelConversionPing--;
 }
 
-buildUnnamed342() {
+buildUnnamed1117() {
   var o = new core.List<api.ChannelConversionPing>();
   o.add(buildChannelConversionPing());
   o.add(buildChannelConversionPing());
   return o;
 }
 
-checkUnnamed342(core.List<api.ChannelConversionPing> o) {
+checkUnnamed1117(core.List<api.ChannelConversionPing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannelConversionPing(o[0]);
   checkChannelConversionPing(o[1]);
@@ -726,7 +726,7 @@
   var o = new api.ChannelConversionPings();
   buildCounterChannelConversionPings++;
   if (buildCounterChannelConversionPings < 3) {
-    o.pings = buildUnnamed342();
+    o.pings = buildUnnamed1117();
   }
   buildCounterChannelConversionPings--;
   return o;
@@ -735,19 +735,19 @@
 checkChannelConversionPings(api.ChannelConversionPings o) {
   buildCounterChannelConversionPings++;
   if (buildCounterChannelConversionPings < 3) {
-    checkUnnamed342(o.pings);
+    checkUnnamed1117(o.pings);
   }
   buildCounterChannelConversionPings--;
 }
 
-buildUnnamed343() {
+buildUnnamed1118() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed343(core.List<api.Channel> o) {
+checkUnnamed1118(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
@@ -760,7 +760,7 @@
   if (buildCounterChannelListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed343();
+    o.items = buildUnnamed1118();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -777,7 +777,7 @@
   if (buildCounterChannelListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed343(o.items);
+    checkUnnamed1118(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -815,27 +815,27 @@
   buildCounterChannelSection--;
 }
 
-buildUnnamed344() {
+buildUnnamed1119() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed344(core.List<core.String> o) {
+checkUnnamed1119(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed345() {
+buildUnnamed1120() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed345(core.List<core.String> o) {
+checkUnnamed1120(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -846,8 +846,8 @@
   var o = new api.ChannelSectionContentDetails();
   buildCounterChannelSectionContentDetails++;
   if (buildCounterChannelSectionContentDetails < 3) {
-    o.channels = buildUnnamed344();
-    o.playlists = buildUnnamed345();
+    o.channels = buildUnnamed1119();
+    o.playlists = buildUnnamed1120();
   }
   buildCounterChannelSectionContentDetails--;
   return o;
@@ -856,20 +856,20 @@
 checkChannelSectionContentDetails(api.ChannelSectionContentDetails o) {
   buildCounterChannelSectionContentDetails++;
   if (buildCounterChannelSectionContentDetails < 3) {
-    checkUnnamed344(o.channels);
-    checkUnnamed345(o.playlists);
+    checkUnnamed1119(o.channels);
+    checkUnnamed1120(o.playlists);
   }
   buildCounterChannelSectionContentDetails--;
 }
 
-buildUnnamed346() {
+buildUnnamed1121() {
   var o = new core.List<api.ChannelSection>();
   o.add(buildChannelSection());
   o.add(buildChannelSection());
   return o;
 }
 
-checkUnnamed346(core.List<api.ChannelSection> o) {
+checkUnnamed1121(core.List<api.ChannelSection> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannelSection(o[0]);
   checkChannelSection(o[1]);
@@ -882,7 +882,7 @@
   if (buildCounterChannelSectionListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed346();
+    o.items = buildUnnamed1121();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -895,7 +895,7 @@
   if (buildCounterChannelSectionListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed346(o.items);
+    checkUnnamed1121(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -929,14 +929,14 @@
   buildCounterChannelSectionSnippet--;
 }
 
-buildUnnamed347() {
+buildUnnamed1122() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed347(core.List<core.String> o) {
+checkUnnamed1122(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -950,7 +950,7 @@
     o.defaultTab = "foo";
     o.description = "foo";
     o.featuredChannelsTitle = "foo";
-    o.featuredChannelsUrls = buildUnnamed347();
+    o.featuredChannelsUrls = buildUnnamed1122();
     o.keywords = "foo";
     o.moderateComments = true;
     o.profileColor = "foo";
@@ -970,7 +970,7 @@
     unittest.expect(o.defaultTab, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.featuredChannelsTitle, unittest.equals('foo'));
-    checkUnnamed347(o.featuredChannelsUrls);
+    checkUnnamed1122(o.featuredChannelsUrls);
     unittest.expect(o.keywords, unittest.equals('foo'));
     unittest.expect(o.moderateComments, unittest.isTrue);
     unittest.expect(o.profileColor, unittest.equals('foo'));
@@ -1058,14 +1058,14 @@
   buildCounterChannelStatus--;
 }
 
-buildUnnamed348() {
+buildUnnamed1123() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed348(core.List<core.String> o) {
+checkUnnamed1123(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1076,7 +1076,7 @@
   var o = new api.ChannelTopicDetails();
   buildCounterChannelTopicDetails++;
   if (buildCounterChannelTopicDetails < 3) {
-    o.topicIds = buildUnnamed348();
+    o.topicIds = buildUnnamed1123();
   }
   buildCounterChannelTopicDetails--;
   return o;
@@ -1085,7 +1085,7 @@
 checkChannelTopicDetails(api.ChannelTopicDetails o) {
   buildCounterChannelTopicDetails++;
   if (buildCounterChannelTopicDetails < 3) {
-    checkUnnamed348(o.topicIds);
+    checkUnnamed1123(o.topicIds);
   }
   buildCounterChannelTopicDetails--;
 }
@@ -1281,14 +1281,14 @@
   buildCounterGuideCategory--;
 }
 
-buildUnnamed349() {
+buildUnnamed1124() {
   var o = new core.List<api.GuideCategory>();
   o.add(buildGuideCategory());
   o.add(buildGuideCategory());
   return o;
 }
 
-checkUnnamed349(core.List<api.GuideCategory> o) {
+checkUnnamed1124(core.List<api.GuideCategory> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGuideCategory(o[0]);
   checkGuideCategory(o[1]);
@@ -1301,7 +1301,7 @@
   if (buildCounterGuideCategoryListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed349();
+    o.items = buildUnnamed1124();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -1318,7 +1318,7 @@
   if (buildCounterGuideCategoryListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed349(o.items);
+    checkUnnamed1124(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -1375,14 +1375,14 @@
   buildCounterI18nLanguage--;
 }
 
-buildUnnamed350() {
+buildUnnamed1125() {
   var o = new core.List<api.I18nLanguage>();
   o.add(buildI18nLanguage());
   o.add(buildI18nLanguage());
   return o;
 }
 
-checkUnnamed350(core.List<api.I18nLanguage> o) {
+checkUnnamed1125(core.List<api.I18nLanguage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkI18nLanguage(o[0]);
   checkI18nLanguage(o[1]);
@@ -1395,7 +1395,7 @@
   if (buildCounterI18nLanguageListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed350();
+    o.items = buildUnnamed1125();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -1408,7 +1408,7 @@
   if (buildCounterI18nLanguageListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed350(o.items);
+    checkUnnamed1125(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -1461,14 +1461,14 @@
   buildCounterI18nRegion--;
 }
 
-buildUnnamed351() {
+buildUnnamed1126() {
   var o = new core.List<api.I18nRegion>();
   o.add(buildI18nRegion());
   o.add(buildI18nRegion());
   return o;
 }
 
-checkUnnamed351(core.List<api.I18nRegion> o) {
+checkUnnamed1126(core.List<api.I18nRegion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkI18nRegion(o[0]);
   checkI18nRegion(o[1]);
@@ -1481,7 +1481,7 @@
   if (buildCounterI18nRegionListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed351();
+    o.items = buildUnnamed1126();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -1494,7 +1494,7 @@
   if (buildCounterI18nRegionListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed351(o.items);
+    checkUnnamed1126(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -1654,14 +1654,14 @@
   buildCounterInvideoPosition--;
 }
 
-buildUnnamed352() {
+buildUnnamed1127() {
   var o = new core.List<api.PromotedItem>();
   o.add(buildPromotedItem());
   o.add(buildPromotedItem());
   return o;
 }
 
-checkUnnamed352(core.List<api.PromotedItem> o) {
+checkUnnamed1127(core.List<api.PromotedItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPromotedItem(o[0]);
   checkPromotedItem(o[1]);
@@ -1673,7 +1673,7 @@
   buildCounterInvideoPromotion++;
   if (buildCounterInvideoPromotion < 3) {
     o.defaultTiming = buildInvideoTiming();
-    o.items = buildUnnamed352();
+    o.items = buildUnnamed1127();
     o.position = buildInvideoPosition();
     o.useSmartTiming = true;
   }
@@ -1685,7 +1685,7 @@
   buildCounterInvideoPromotion++;
   if (buildCounterInvideoPromotion < 3) {
     checkInvideoTiming(o.defaultTiming);
-    checkUnnamed352(o.items);
+    checkUnnamed1127(o.items);
     checkInvideoPosition(o.position);
     unittest.expect(o.useSmartTiming, unittest.isTrue);
   }
@@ -1777,14 +1777,14 @@
   buildCounterLiveBroadcastContentDetails--;
 }
 
-buildUnnamed353() {
+buildUnnamed1128() {
   var o = new core.List<api.LiveBroadcast>();
   o.add(buildLiveBroadcast());
   o.add(buildLiveBroadcast());
   return o;
 }
 
-checkUnnamed353(core.List<api.LiveBroadcast> o) {
+checkUnnamed1128(core.List<api.LiveBroadcast> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLiveBroadcast(o[0]);
   checkLiveBroadcast(o[1]);
@@ -1797,7 +1797,7 @@
   if (buildCounterLiveBroadcastListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed353();
+    o.items = buildUnnamed1128();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -1814,7 +1814,7 @@
   if (buildCounterLiveBroadcastListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed353(o.items);
+    checkUnnamed1128(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -1937,14 +1937,14 @@
   buildCounterLiveStreamContentDetails--;
 }
 
-buildUnnamed354() {
+buildUnnamed1129() {
   var o = new core.List<api.LiveStream>();
   o.add(buildLiveStream());
   o.add(buildLiveStream());
   return o;
 }
 
-checkUnnamed354(core.List<api.LiveStream> o) {
+checkUnnamed1129(core.List<api.LiveStream> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLiveStream(o[0]);
   checkLiveStream(o[1]);
@@ -1957,7 +1957,7 @@
   if (buildCounterLiveStreamListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed354();
+    o.items = buildUnnamed1129();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -1974,7 +1974,7 @@
   if (buildCounterLiveStreamListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed354(o.items);
+    checkUnnamed1129(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2029,14 +2029,14 @@
   buildCounterLiveStreamStatus--;
 }
 
-buildUnnamed355() {
+buildUnnamed1130() {
   var o = new core.List<api.LocalizedString>();
   o.add(buildLocalizedString());
   o.add(buildLocalizedString());
   return o;
 }
 
-checkUnnamed355(core.List<api.LocalizedString> o) {
+checkUnnamed1130(core.List<api.LocalizedString> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocalizedString(o[0]);
   checkLocalizedString(o[1]);
@@ -2048,7 +2048,7 @@
   buildCounterLocalizedProperty++;
   if (buildCounterLocalizedProperty < 3) {
     o.default_ = "foo";
-    o.localized = buildUnnamed355();
+    o.localized = buildUnnamed1130();
   }
   buildCounterLocalizedProperty--;
   return o;
@@ -2058,7 +2058,7 @@
   buildCounterLocalizedProperty++;
   if (buildCounterLocalizedProperty < 3) {
     unittest.expect(o.default_, unittest.equals('foo'));
-    checkUnnamed355(o.localized);
+    checkUnnamed1130(o.localized);
   }
   buildCounterLocalizedProperty--;
 }
@@ -2232,14 +2232,14 @@
   buildCounterPlaylistItemContentDetails--;
 }
 
-buildUnnamed356() {
+buildUnnamed1131() {
   var o = new core.List<api.PlaylistItem>();
   o.add(buildPlaylistItem());
   o.add(buildPlaylistItem());
   return o;
 }
 
-checkUnnamed356(core.List<api.PlaylistItem> o) {
+checkUnnamed1131(core.List<api.PlaylistItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlaylistItem(o[0]);
   checkPlaylistItem(o[1]);
@@ -2252,7 +2252,7 @@
   if (buildCounterPlaylistItemListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed356();
+    o.items = buildUnnamed1131();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -2269,7 +2269,7 @@
   if (buildCounterPlaylistItemListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed356(o.items);
+    checkUnnamed1131(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2334,14 +2334,14 @@
   buildCounterPlaylistItemStatus--;
 }
 
-buildUnnamed357() {
+buildUnnamed1132() {
   var o = new core.List<api.Playlist>();
   o.add(buildPlaylist());
   o.add(buildPlaylist());
   return o;
 }
 
-checkUnnamed357(core.List<api.Playlist> o) {
+checkUnnamed1132(core.List<api.Playlist> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlaylist(o[0]);
   checkPlaylist(o[1]);
@@ -2354,7 +2354,7 @@
   if (buildCounterPlaylistListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed357();
+    o.items = buildUnnamed1132();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -2371,7 +2371,7 @@
   if (buildCounterPlaylistListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed357(o.items);
+    checkUnnamed1132(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2401,14 +2401,14 @@
   buildCounterPlaylistPlayer--;
 }
 
-buildUnnamed358() {
+buildUnnamed1133() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed358(core.List<core.String> o) {
+checkUnnamed1133(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2423,7 +2423,7 @@
     o.channelTitle = "foo";
     o.description = "foo";
     o.publishedAt = core.DateTime.parse("2002-02-27T14:01:02");
-    o.tags = buildUnnamed358();
+    o.tags = buildUnnamed1133();
     o.thumbnails = buildThumbnailDetails();
     o.title = "foo";
   }
@@ -2438,7 +2438,7 @@
     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")));
-    checkUnnamed358(o.tags);
+    checkUnnamed1133(o.tags);
     checkThumbnailDetails(o.thumbnails);
     unittest.expect(o.title, unittest.equals('foo'));
   }
@@ -2560,14 +2560,14 @@
   buildCounterResourceId--;
 }
 
-buildUnnamed359() {
+buildUnnamed1134() {
   var o = new core.List<api.SearchResult>();
   o.add(buildSearchResult());
   o.add(buildSearchResult());
   return o;
 }
 
-checkUnnamed359(core.List<api.SearchResult> o) {
+checkUnnamed1134(core.List<api.SearchResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSearchResult(o[0]);
   checkSearchResult(o[1]);
@@ -2580,7 +2580,7 @@
   if (buildCounterSearchListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed359();
+    o.items = buildUnnamed1134();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -2597,7 +2597,7 @@
   if (buildCounterSearchListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed359(o.items);
+    checkUnnamed1134(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2716,14 +2716,14 @@
   buildCounterSubscriptionContentDetails--;
 }
 
-buildUnnamed360() {
+buildUnnamed1135() {
   var o = new core.List<api.Subscription>();
   o.add(buildSubscription());
   o.add(buildSubscription());
   return o;
 }
 
-checkUnnamed360(core.List<api.Subscription> o) {
+checkUnnamed1135(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubscription(o[0]);
   checkSubscription(o[1]);
@@ -2736,7 +2736,7 @@
   if (buildCounterSubscriptionListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed360();
+    o.items = buildUnnamed1135();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -2753,7 +2753,7 @@
   if (buildCounterSubscriptionListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed360(o.items);
+    checkUnnamed1135(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2870,14 +2870,14 @@
   buildCounterThumbnailDetails--;
 }
 
-buildUnnamed361() {
+buildUnnamed1136() {
   var o = new core.List<api.ThumbnailDetails>();
   o.add(buildThumbnailDetails());
   o.add(buildThumbnailDetails());
   return o;
 }
 
-checkUnnamed361(core.List<api.ThumbnailDetails> o) {
+checkUnnamed1136(core.List<api.ThumbnailDetails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThumbnailDetails(o[0]);
   checkThumbnailDetails(o[1]);
@@ -2890,7 +2890,7 @@
   if (buildCounterThumbnailSetResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed361();
+    o.items = buildUnnamed1136();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -2903,7 +2903,7 @@
   if (buildCounterThumbnailSetResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed361(o.items);
+    checkUnnamed1136(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -3028,14 +3028,14 @@
   buildCounterVideoCategory--;
 }
 
-buildUnnamed362() {
+buildUnnamed1137() {
   var o = new core.List<api.VideoCategory>();
   o.add(buildVideoCategory());
   o.add(buildVideoCategory());
   return o;
 }
 
-checkUnnamed362(core.List<api.VideoCategory> o) {
+checkUnnamed1137(core.List<api.VideoCategory> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoCategory(o[0]);
   checkVideoCategory(o[1]);
@@ -3048,7 +3048,7 @@
   if (buildCounterVideoCategoryListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed362();
+    o.items = buildUnnamed1137();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -3065,7 +3065,7 @@
   if (buildCounterVideoCategoryListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed362(o.items);
+    checkUnnamed1137(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -3132,27 +3132,27 @@
   buildCounterVideoContentDetails--;
 }
 
-buildUnnamed363() {
+buildUnnamed1138() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed363(core.List<core.String> o) {
+checkUnnamed1138(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed364() {
+buildUnnamed1139() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed364(core.List<core.String> o) {
+checkUnnamed1139(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3163,8 +3163,8 @@
   var o = new api.VideoContentDetailsRegionRestriction();
   buildCounterVideoContentDetailsRegionRestriction++;
   if (buildCounterVideoContentDetailsRegionRestriction < 3) {
-    o.allowed = buildUnnamed363();
-    o.blocked = buildUnnamed364();
+    o.allowed = buildUnnamed1138();
+    o.blocked = buildUnnamed1139();
   }
   buildCounterVideoContentDetailsRegionRestriction--;
   return o;
@@ -3173,8 +3173,8 @@
 checkVideoContentDetailsRegionRestriction(api.VideoContentDetailsRegionRestriction o) {
   buildCounterVideoContentDetailsRegionRestriction++;
   if (buildCounterVideoContentDetailsRegionRestriction < 3) {
-    checkUnnamed363(o.allowed);
-    checkUnnamed364(o.blocked);
+    checkUnnamed1138(o.allowed);
+    checkUnnamed1139(o.blocked);
   }
   buildCounterVideoContentDetailsRegionRestriction--;
 }
@@ -3200,14 +3200,14 @@
   buildCounterVideoConversionPing--;
 }
 
-buildUnnamed365() {
+buildUnnamed1140() {
   var o = new core.List<api.VideoConversionPing>();
   o.add(buildVideoConversionPing());
   o.add(buildVideoConversionPing());
   return o;
 }
 
-checkUnnamed365(core.List<api.VideoConversionPing> o) {
+checkUnnamed1140(core.List<api.VideoConversionPing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoConversionPing(o[0]);
   checkVideoConversionPing(o[1]);
@@ -3218,7 +3218,7 @@
   var o = new api.VideoConversionPings();
   buildCounterVideoConversionPings++;
   if (buildCounterVideoConversionPings < 3) {
-    o.pings = buildUnnamed365();
+    o.pings = buildUnnamed1140();
   }
   buildCounterVideoConversionPings--;
   return o;
@@ -3227,32 +3227,32 @@
 checkVideoConversionPings(api.VideoConversionPings o) {
   buildCounterVideoConversionPings++;
   if (buildCounterVideoConversionPings < 3) {
-    checkUnnamed365(o.pings);
+    checkUnnamed1140(o.pings);
   }
   buildCounterVideoConversionPings--;
 }
 
-buildUnnamed366() {
+buildUnnamed1141() {
   var o = new core.List<api.VideoFileDetailsAudioStream>();
   o.add(buildVideoFileDetailsAudioStream());
   o.add(buildVideoFileDetailsAudioStream());
   return o;
 }
 
-checkUnnamed366(core.List<api.VideoFileDetailsAudioStream> o) {
+checkUnnamed1141(core.List<api.VideoFileDetailsAudioStream> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoFileDetailsAudioStream(o[0]);
   checkVideoFileDetailsAudioStream(o[1]);
 }
 
-buildUnnamed367() {
+buildUnnamed1142() {
   var o = new core.List<api.VideoFileDetailsVideoStream>();
   o.add(buildVideoFileDetailsVideoStream());
   o.add(buildVideoFileDetailsVideoStream());
   return o;
 }
 
-checkUnnamed367(core.List<api.VideoFileDetailsVideoStream> o) {
+checkUnnamed1142(core.List<api.VideoFileDetailsVideoStream> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoFileDetailsVideoStream(o[0]);
   checkVideoFileDetailsVideoStream(o[1]);
@@ -3263,7 +3263,7 @@
   var o = new api.VideoFileDetails();
   buildCounterVideoFileDetails++;
   if (buildCounterVideoFileDetails < 3) {
-    o.audioStreams = buildUnnamed366();
+    o.audioStreams = buildUnnamed1141();
     o.bitrateBps = "foo";
     o.container = "foo";
     o.creationTime = "foo";
@@ -3272,7 +3272,7 @@
     o.fileSize = "foo";
     o.fileType = "foo";
     o.recordingLocation = buildGeoPoint();
-    o.videoStreams = buildUnnamed367();
+    o.videoStreams = buildUnnamed1142();
   }
   buildCounterVideoFileDetails--;
   return o;
@@ -3281,7 +3281,7 @@
 checkVideoFileDetails(api.VideoFileDetails o) {
   buildCounterVideoFileDetails++;
   if (buildCounterVideoFileDetails < 3) {
-    checkUnnamed366(o.audioStreams);
+    checkUnnamed1141(o.audioStreams);
     unittest.expect(o.bitrateBps, unittest.equals('foo'));
     unittest.expect(o.container, unittest.equals('foo'));
     unittest.expect(o.creationTime, unittest.equals('foo'));
@@ -3290,7 +3290,7 @@
     unittest.expect(o.fileSize, unittest.equals('foo'));
     unittest.expect(o.fileType, unittest.equals('foo'));
     checkGeoPoint(o.recordingLocation);
-    checkUnnamed367(o.videoStreams);
+    checkUnnamed1142(o.videoStreams);
   }
   buildCounterVideoFileDetails--;
 }
@@ -3353,14 +3353,14 @@
   buildCounterVideoFileDetailsVideoStream--;
 }
 
-buildUnnamed368() {
+buildUnnamed1143() {
   var o = new core.List<api.VideoRating>();
   o.add(buildVideoRating());
   o.add(buildVideoRating());
   return o;
 }
 
-checkUnnamed368(core.List<api.VideoRating> o) {
+checkUnnamed1143(core.List<api.VideoRating> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoRating(o[0]);
   checkVideoRating(o[1]);
@@ -3372,7 +3372,7 @@
   buildCounterVideoGetRatingResponse++;
   if (buildCounterVideoGetRatingResponse < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed368();
+    o.items = buildUnnamed1143();
     o.kind = "foo";
   }
   buildCounterVideoGetRatingResponse--;
@@ -3383,20 +3383,20 @@
   buildCounterVideoGetRatingResponse++;
   if (buildCounterVideoGetRatingResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed368(o.items);
+    checkUnnamed1143(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterVideoGetRatingResponse--;
 }
 
-buildUnnamed369() {
+buildUnnamed1144() {
   var o = new core.List<api.Video>();
   o.add(buildVideo());
   o.add(buildVideo());
   return o;
 }
 
-checkUnnamed369(core.List<api.Video> o) {
+checkUnnamed1144(core.List<api.Video> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideo(o[0]);
   checkVideo(o[1]);
@@ -3409,7 +3409,7 @@
   if (buildCounterVideoListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed369();
+    o.items = buildUnnamed1144();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -3426,7 +3426,7 @@
   if (buildCounterVideoListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed369(o.items);
+    checkUnnamed1144(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -3558,14 +3558,14 @@
   buildCounterVideoProcessingDetailsProcessingProgress--;
 }
 
-buildUnnamed370() {
+buildUnnamed1145() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed370(core.List<core.String> o) {
+checkUnnamed1145(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3576,7 +3576,7 @@
   var o = new api.VideoProjectDetails();
   buildCounterVideoProjectDetails++;
   if (buildCounterVideoProjectDetails < 3) {
-    o.tags = buildUnnamed370();
+    o.tags = buildUnnamed1145();
   }
   buildCounterVideoProjectDetails--;
   return o;
@@ -3585,7 +3585,7 @@
 checkVideoProjectDetails(api.VideoProjectDetails o) {
   buildCounterVideoProjectDetails++;
   if (buildCounterVideoProjectDetails < 3) {
-    checkUnnamed370(o.tags);
+    checkUnnamed1145(o.tags);
   }
   buildCounterVideoProjectDetails--;
 }
@@ -3634,14 +3634,14 @@
   buildCounterVideoRecordingDetails--;
 }
 
-buildUnnamed371() {
+buildUnnamed1146() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed371(core.List<core.String> o) {
+checkUnnamed1146(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3658,7 +3658,7 @@
     o.description = "foo";
     o.liveBroadcastContent = "foo";
     o.publishedAt = core.DateTime.parse("2002-02-27T14:01:02");
-    o.tags = buildUnnamed371();
+    o.tags = buildUnnamed1146();
     o.thumbnails = buildThumbnailDetails();
     o.title = "foo";
   }
@@ -3675,7 +3675,7 @@
     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")));
-    checkUnnamed371(o.tags);
+    checkUnnamed1146(o.tags);
     checkThumbnailDetails(o.thumbnails);
     unittest.expect(o.title, unittest.equals('foo'));
   }
@@ -3742,66 +3742,66 @@
   buildCounterVideoStatus--;
 }
 
-buildUnnamed372() {
+buildUnnamed1147() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed372(core.List<core.String> o) {
+checkUnnamed1147(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed373() {
+buildUnnamed1148() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed373(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'));
 }
 
-buildUnnamed374() {
+buildUnnamed1149() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed374(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'));
 }
 
-buildUnnamed375() {
+buildUnnamed1150() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed375(core.List<core.String> o) {
+checkUnnamed1150(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed376() {
+buildUnnamed1151() {
   var o = new core.List<api.VideoSuggestionsTagSuggestion>();
   o.add(buildVideoSuggestionsTagSuggestion());
   o.add(buildVideoSuggestionsTagSuggestion());
   return o;
 }
 
-checkUnnamed376(core.List<api.VideoSuggestionsTagSuggestion> o) {
+checkUnnamed1151(core.List<api.VideoSuggestionsTagSuggestion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoSuggestionsTagSuggestion(o[0]);
   checkVideoSuggestionsTagSuggestion(o[1]);
@@ -3812,11 +3812,11 @@
   var o = new api.VideoSuggestions();
   buildCounterVideoSuggestions++;
   if (buildCounterVideoSuggestions < 3) {
-    o.editorSuggestions = buildUnnamed372();
-    o.processingErrors = buildUnnamed373();
-    o.processingHints = buildUnnamed374();
-    o.processingWarnings = buildUnnamed375();
-    o.tagSuggestions = buildUnnamed376();
+    o.editorSuggestions = buildUnnamed1147();
+    o.processingErrors = buildUnnamed1148();
+    o.processingHints = buildUnnamed1149();
+    o.processingWarnings = buildUnnamed1150();
+    o.tagSuggestions = buildUnnamed1151();
   }
   buildCounterVideoSuggestions--;
   return o;
@@ -3825,23 +3825,23 @@
 checkVideoSuggestions(api.VideoSuggestions o) {
   buildCounterVideoSuggestions++;
   if (buildCounterVideoSuggestions < 3) {
-    checkUnnamed372(o.editorSuggestions);
-    checkUnnamed373(o.processingErrors);
-    checkUnnamed374(o.processingHints);
-    checkUnnamed375(o.processingWarnings);
-    checkUnnamed376(o.tagSuggestions);
+    checkUnnamed1147(o.editorSuggestions);
+    checkUnnamed1148(o.processingErrors);
+    checkUnnamed1149(o.processingHints);
+    checkUnnamed1150(o.processingWarnings);
+    checkUnnamed1151(o.tagSuggestions);
   }
   buildCounterVideoSuggestions--;
 }
 
-buildUnnamed377() {
+buildUnnamed1152() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed377(core.List<core.String> o) {
+checkUnnamed1152(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3852,7 +3852,7 @@
   var o = new api.VideoSuggestionsTagSuggestion();
   buildCounterVideoSuggestionsTagSuggestion++;
   if (buildCounterVideoSuggestionsTagSuggestion < 3) {
-    o.categoryRestricts = buildUnnamed377();
+    o.categoryRestricts = buildUnnamed1152();
     o.tag = "foo";
   }
   buildCounterVideoSuggestionsTagSuggestion--;
@@ -3862,33 +3862,33 @@
 checkVideoSuggestionsTagSuggestion(api.VideoSuggestionsTagSuggestion o) {
   buildCounterVideoSuggestionsTagSuggestion++;
   if (buildCounterVideoSuggestionsTagSuggestion < 3) {
-    checkUnnamed377(o.categoryRestricts);
+    checkUnnamed1152(o.categoryRestricts);
     unittest.expect(o.tag, unittest.equals('foo'));
   }
   buildCounterVideoSuggestionsTagSuggestion--;
 }
 
-buildUnnamed378() {
+buildUnnamed1153() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed378(core.List<core.String> 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'));
 }
 
-buildUnnamed379() {
+buildUnnamed1154() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed379(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'));
@@ -3899,8 +3899,8 @@
   var o = new api.VideoTopicDetails();
   buildCounterVideoTopicDetails++;
   if (buildCounterVideoTopicDetails < 3) {
-    o.relevantTopicIds = buildUnnamed378();
-    o.topicIds = buildUnnamed379();
+    o.relevantTopicIds = buildUnnamed1153();
+    o.topicIds = buildUnnamed1154();
   }
   buildCounterVideoTopicDetails--;
   return o;
@@ -3909,8 +3909,8 @@
 checkVideoTopicDetails(api.VideoTopicDetails o) {
   buildCounterVideoTopicDetails++;
   if (buildCounterVideoTopicDetails < 3) {
-    checkUnnamed378(o.relevantTopicIds);
-    checkUnnamed379(o.topicIds);
+    checkUnnamed1153(o.relevantTopicIds);
+    checkUnnamed1154(o.topicIds);
   }
   buildCounterVideoTopicDetails--;
 }
diff --git a/generated/googleapis/test/youtubeanalytics/v1_test.dart b/generated/googleapis/test/youtubeanalytics/v1_test.dart
index b958768..9da6d02 100644
--- a/generated/googleapis/test/youtubeanalytics/v1_test.dart
+++ b/generated/googleapis/test/youtubeanalytics/v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed180() {
+buildUnnamed1155() {
   var o = new core.List<api.BatchReportDefinitionTemplate>();
   o.add(buildBatchReportDefinitionTemplate());
   o.add(buildBatchReportDefinitionTemplate());
   return o;
 }
 
-checkUnnamed180(core.List<api.BatchReportDefinitionTemplate> o) {
+checkUnnamed1155(core.List<api.BatchReportDefinitionTemplate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBatchReportDefinitionTemplate(o[0]);
   checkBatchReportDefinitionTemplate(o[1]);
@@ -34,7 +34,7 @@
   var o = new api.BatchReportDefinitionList();
   buildCounterBatchReportDefinitionList++;
   if (buildCounterBatchReportDefinitionList < 3) {
-    o.items = buildUnnamed180();
+    o.items = buildUnnamed1155();
     o.kind = "foo";
   }
   buildCounterBatchReportDefinitionList--;
@@ -44,7 +44,7 @@
 checkBatchReportDefinitionList(api.BatchReportDefinitionList o) {
   buildCounterBatchReportDefinitionList++;
   if (buildCounterBatchReportDefinitionList < 3) {
-    checkUnnamed180(o.items);
+    checkUnnamed1155(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBatchReportDefinitionList--;
@@ -71,14 +71,14 @@
   buildCounterBatchReportDefinitionTemplateDefaultOutput--;
 }
 
-buildUnnamed181() {
+buildUnnamed1156() {
   var o = new core.List<api.BatchReportDefinitionTemplateDefaultOutput>();
   o.add(buildBatchReportDefinitionTemplateDefaultOutput());
   o.add(buildBatchReportDefinitionTemplateDefaultOutput());
   return o;
 }
 
-checkUnnamed181(core.List<api.BatchReportDefinitionTemplateDefaultOutput> o) {
+checkUnnamed1156(core.List<api.BatchReportDefinitionTemplateDefaultOutput> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBatchReportDefinitionTemplateDefaultOutput(o[0]);
   checkBatchReportDefinitionTemplateDefaultOutput(o[1]);
@@ -89,7 +89,7 @@
   var o = new api.BatchReportDefinitionTemplate();
   buildCounterBatchReportDefinitionTemplate++;
   if (buildCounterBatchReportDefinitionTemplate < 3) {
-    o.defaultOutput = buildUnnamed181();
+    o.defaultOutput = buildUnnamed1156();
     o.id = "foo";
     o.name = "foo";
     o.status = "foo";
@@ -102,7 +102,7 @@
 checkBatchReportDefinitionTemplate(api.BatchReportDefinitionTemplate o) {
   buildCounterBatchReportDefinitionTemplate++;
   if (buildCounterBatchReportDefinitionTemplate < 3) {
-    checkUnnamed181(o.defaultOutput);
+    checkUnnamed1156(o.defaultOutput);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
@@ -111,14 +111,14 @@
   buildCounterBatchReportDefinitionTemplate--;
 }
 
-buildUnnamed182() {
+buildUnnamed1157() {
   var o = new core.List<api.BatchReportTemplate>();
   o.add(buildBatchReportTemplate());
   o.add(buildBatchReportTemplate());
   return o;
 }
 
-checkUnnamed182(core.List<api.BatchReportTemplate> o) {
+checkUnnamed1157(core.List<api.BatchReportTemplate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBatchReportTemplate(o[0]);
   checkBatchReportTemplate(o[1]);
@@ -129,7 +129,7 @@
   var o = new api.BatchReportList();
   buildCounterBatchReportList++;
   if (buildCounterBatchReportList < 3) {
-    o.items = buildUnnamed182();
+    o.items = buildUnnamed1157();
     o.kind = "foo";
   }
   buildCounterBatchReportList--;
@@ -139,7 +139,7 @@
 checkBatchReportList(api.BatchReportList o) {
   buildCounterBatchReportList++;
   if (buildCounterBatchReportList < 3) {
-    checkUnnamed182(o.items);
+    checkUnnamed1157(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBatchReportList--;
@@ -168,14 +168,14 @@
   buildCounterBatchReportTemplateOutputs--;
 }
 
-buildUnnamed183() {
+buildUnnamed1158() {
   var o = new core.List<api.BatchReportTemplateOutputs>();
   o.add(buildBatchReportTemplateOutputs());
   o.add(buildBatchReportTemplateOutputs());
   return o;
 }
 
-checkUnnamed183(core.List<api.BatchReportTemplateOutputs> o) {
+checkUnnamed1158(core.List<api.BatchReportTemplateOutputs> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBatchReportTemplateOutputs(o[0]);
   checkBatchReportTemplateOutputs(o[1]);
@@ -208,7 +208,7 @@
   buildCounterBatchReportTemplate++;
   if (buildCounterBatchReportTemplate < 3) {
     o.id = "foo";
-    o.outputs = buildUnnamed183();
+    o.outputs = buildUnnamed1158();
     o.reportId = "foo";
     o.timeSpan = buildBatchReportTemplateTimeSpan();
     o.timeUpdated = core.DateTime.parse("2002-02-27T14:01:02");
@@ -221,7 +221,7 @@
   buildCounterBatchReportTemplate++;
   if (buildCounterBatchReportTemplate < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed183(o.outputs);
+    checkUnnamed1158(o.outputs);
     unittest.expect(o.reportId, unittest.equals('foo'));
     checkBatchReportTemplateTimeSpan(o.timeSpan);
     unittest.expect(o.timeUpdated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -252,43 +252,43 @@
   buildCounterResultTableColumnHeaders--;
 }
 
-buildUnnamed184() {
+buildUnnamed1159() {
   var o = new core.List<api.ResultTableColumnHeaders>();
   o.add(buildResultTableColumnHeaders());
   o.add(buildResultTableColumnHeaders());
   return o;
 }
 
-checkUnnamed184(core.List<api.ResultTableColumnHeaders> o) {
+checkUnnamed1159(core.List<api.ResultTableColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultTableColumnHeaders(o[0]);
   checkResultTableColumnHeaders(o[1]);
 }
 
-buildUnnamed185() {
+buildUnnamed1160() {
   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'});
   return o;
 }
 
-checkUnnamed185(core.List<core.Object> o) {
+checkUnnamed1160(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')); 
 }
 
-buildUnnamed186() {
+buildUnnamed1161() {
   var o = new core.List<core.List<core.Object>>();
-  o.add(buildUnnamed185());
-  o.add(buildUnnamed185());
+  o.add(buildUnnamed1160());
+  o.add(buildUnnamed1160());
   return o;
 }
 
-checkUnnamed186(core.List<core.List<core.Object>> o) {
+checkUnnamed1161(core.List<core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed185(o[0]);
-  checkUnnamed185(o[1]);
+  checkUnnamed1160(o[0]);
+  checkUnnamed1160(o[1]);
 }
 
 core.int buildCounterResultTable = 0;
@@ -296,9 +296,9 @@
   var o = new api.ResultTable();
   buildCounterResultTable++;
   if (buildCounterResultTable < 3) {
-    o.columnHeaders = buildUnnamed184();
+    o.columnHeaders = buildUnnamed1159();
     o.kind = "foo";
-    o.rows = buildUnnamed186();
+    o.rows = buildUnnamed1161();
   }
   buildCounterResultTable--;
   return o;
@@ -307,9 +307,9 @@
 checkResultTable(api.ResultTable o) {
   buildCounterResultTable++;
   if (buildCounterResultTable < 3) {
-    checkUnnamed184(o.columnHeaders);
+    checkUnnamed1159(o.columnHeaders);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed186(o.rows);
+    checkUnnamed1161(o.rows);
   }
   buildCounterResultTable--;
 }
diff --git a/generated/googleapis_beta/CHANGELOG.md b/generated/googleapis_beta/CHANGELOG.md
index 7e49e42..04fc182 100644
--- a/generated/googleapis_beta/CHANGELOG.md
+++ b/generated/googleapis_beta/CHANGELOG.md
@@ -1,3 +1,14 @@
+## 0.5.0
+
+* [apis-new] container:v1beta1: API added
+* [apis-new] genomics:v1beta2: API added
+* [apis-new] replicapool:v1beta2: API added
+* [apis-new] replicapoolupdater:v1beta1: API added
+* [apis] autoscaler:v1beta2: additional schemas/methods
+* [apis] qladmin:v1beta3: schema changes
+* [apis-breaking] genomics:v1beta: removed methods
+* [apis-removed] replicapool:v1beta1: removed (Deprecated)
+
 ## 0.4.0
 
 * [apis] cloudmonitoring:v2beta1: additional schemas/methods
diff --git a/generated/googleapis_beta/README.md b/generated/googleapis_beta/README.md
index 4347de5..8bb3876 100644
--- a/generated/googleapis_beta/README.md
+++ b/generated/googleapis_beta/README.md
@@ -71,6 +71,10 @@
 
 Official API documentation: https://developers.google.com/cloud-monitoring/
 
+#### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Google Container Engine API - container v1beta1
+
+The Google Container Engine API is used for building and managing container based applications, powered by the open source Kubernetes technology.
+
 #### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Google Cloud Datastore API - datastore v1beta2
 
 API for accessing Google Cloud Datastore.
@@ -89,6 +93,12 @@
 
 Official API documentation: https://developers.google.com/genomics/v1beta/reference
 
+#### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Genomics API - genomics v1beta2
+
+Provides access to Genomics data.
+
+Official API documentation: https://developers.google.com/genomics/v1beta2/reference
+
 #### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Deployment Manager API - manager v1beta2
 
 The Deployment Manager API allows users to declaratively configure, deploy and run complex solutions on the Google Cloud Platform.
@@ -101,11 +111,17 @@
 
 Official API documentation: https://developers.google.com/pubsub/v1beta1
 
-#### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Replica Pool API - replicapool v1beta1
+#### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Google Compute Engine Instance Group Manager API - replicapool v1beta2
 
-The Replica Pool API allows users to declaratively provision and manage groups of Google Compute Engine instances based on a common template.
+The Google Compute Engine Instance Group Manager API provides groups of homogenous Compute Engine Instances.
 
-Official API documentation: https://developers.google.com/compute/docs/replica-pool/
+Official API documentation: https://developers.google.com/compute/docs/instance-groups/manager/v1beta2
+
+#### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Google Compute Engine Instance Group Updater API - replicapoolupdater v1beta1
+
+The Google Compute Engine Instance Group Updater API provides services for updating groups of Compute Engine Instances.
+
+Official API documentation: 
 
 #### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Resource Views API - resourceviews v1beta1
 
diff --git a/generated/googleapis_beta/lib/autoscaler/v1beta2.dart b/generated/googleapis_beta/lib/autoscaler/v1beta2.dart
index 3440ba5..f44c26d 100644
--- a/generated/googleapis_beta/lib/autoscaler/v1beta2.dart
+++ b/generated/googleapis_beta/lib/autoscaler/v1beta2.dart
@@ -29,6 +29,7 @@
 
   AutoscalersResourceApi get autoscalers => new AutoscalersResourceApi(_requester);
   ZoneOperationsResourceApi get zoneOperations => new ZoneOperationsResourceApi(_requester);
+  ZonesResourceApi get zones => new ZonesResourceApi(_requester);
 
   AutoscalerApi(http.Client client) : 
       _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "autoscaler/v1beta2/");
@@ -549,6 +550,74 @@
 }
 
 
+/** Not documented yet. */
+class ZonesResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  ZonesResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Not documented yet.
+   *
+   * Request parameters:
+   *
+   * [project] - null
+   * Value must have pattern
+   * "(?:(?:[-a-z0-9]{1,63}\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))".
+   *
+   * [filter] - null
+   *
+   * [maxResults] - null
+   * Value must be between "0" and "500".
+   *
+   * [pageToken] - null
+   *
+   * Completes with a [ZoneList].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ZoneList> list(core.String project, {core.String filter, core.int maxResults, core.String pageToken}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (project == null) {
+      throw new core.ArgumentError("Parameter project is required.");
+    }
+    if (filter != null) {
+      _queryParams["filter"] = [filter];
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$project') + '/zones';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ZoneList.fromJson(data));
+  }
+
+}
+
+
 
 /** Cloud Autoscaler resource. */
 class Autoscaler {
@@ -877,6 +946,66 @@
 
 
 /** Not documented yet. */
+class DeprecationStatus {
+  /** Not documented yet. */
+  core.String deleted;
+
+  /** Not documented yet. */
+  core.String deprecated;
+
+  /** Not documented yet. */
+  core.String obsolete;
+
+  /** Not documented yet. */
+  core.String replacement;
+
+  /** Not documented yet. */
+  core.String state;
+
+
+  DeprecationStatus();
+
+  DeprecationStatus.fromJson(core.Map _json) {
+    if (_json.containsKey("deleted")) {
+      deleted = _json["deleted"];
+    }
+    if (_json.containsKey("deprecated")) {
+      deprecated = _json["deprecated"];
+    }
+    if (_json.containsKey("obsolete")) {
+      obsolete = _json["obsolete"];
+    }
+    if (_json.containsKey("replacement")) {
+      replacement = _json["replacement"];
+    }
+    if (_json.containsKey("state")) {
+      state = _json["state"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (deleted != null) {
+      _json["deleted"] = deleted;
+    }
+    if (deprecated != null) {
+      _json["deprecated"] = deprecated;
+    }
+    if (obsolete != null) {
+      _json["obsolete"] = obsolete;
+    }
+    if (replacement != null) {
+      _json["replacement"] = replacement;
+    }
+    if (state != null) {
+      _json["state"] = state;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
 class OperationErrorErrors {
   /** Not documented yet. */
   core.String code;
@@ -1290,3 +1419,219 @@
 }
 
 
+/** Not documented yet. */
+class ZoneMaintenanceWindows {
+  /** Not documented yet. */
+  core.String beginTime;
+
+  /** Not documented yet. */
+  core.String description;
+
+  /** Not documented yet. */
+  core.String endTime;
+
+  /** Not documented yet. */
+  core.String name;
+
+
+  ZoneMaintenanceWindows();
+
+  ZoneMaintenanceWindows.fromJson(core.Map _json) {
+    if (_json.containsKey("beginTime")) {
+      beginTime = _json["beginTime"];
+    }
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("endTime")) {
+      endTime = _json["endTime"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (beginTime != null) {
+      _json["beginTime"] = beginTime;
+    }
+    if (description != null) {
+      _json["description"] = description;
+    }
+    if (endTime != null) {
+      _json["endTime"] = endTime;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class Zone {
+  /** Not documented yet. */
+  core.String creationTimestamp;
+
+  /** Not documented yet. */
+  DeprecationStatus deprecated;
+
+  /** Not documented yet. */
+  core.String description;
+
+  /** Not documented yet. */
+  core.String id;
+
+  /** Type of the resource. */
+  core.String kind;
+
+  /** Not documented yet. */
+  core.List<ZoneMaintenanceWindows> maintenanceWindows;
+
+  /** Not documented yet. */
+  core.String name;
+
+  /** Not documented yet. */
+  core.String region;
+
+  /** Server defined URL for the resource (output only). */
+  core.String selfLink;
+
+  /** Not documented yet. */
+  core.String status;
+
+
+  Zone();
+
+  Zone.fromJson(core.Map _json) {
+    if (_json.containsKey("creationTimestamp")) {
+      creationTimestamp = _json["creationTimestamp"];
+    }
+    if (_json.containsKey("deprecated")) {
+      deprecated = new DeprecationStatus.fromJson(_json["deprecated"]);
+    }
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("maintenanceWindows")) {
+      maintenanceWindows = _json["maintenanceWindows"].map((value) => new ZoneMaintenanceWindows.fromJson(value)).toList();
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("region")) {
+      region = _json["region"];
+    }
+    if (_json.containsKey("selfLink")) {
+      selfLink = _json["selfLink"];
+    }
+    if (_json.containsKey("status")) {
+      status = _json["status"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (creationTimestamp != null) {
+      _json["creationTimestamp"] = creationTimestamp;
+    }
+    if (deprecated != null) {
+      _json["deprecated"] = (deprecated).toJson();
+    }
+    if (description != null) {
+      _json["description"] = description;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (maintenanceWindows != null) {
+      _json["maintenanceWindows"] = maintenanceWindows.map((value) => (value).toJson()).toList();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (region != null) {
+      _json["region"] = region;
+    }
+    if (selfLink != null) {
+      _json["selfLink"] = selfLink;
+    }
+    if (status != null) {
+      _json["status"] = status;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class ZoneList {
+  /** Not documented yet. */
+  core.String id;
+
+  /** Not documented yet. */
+  core.List<Zone> items;
+
+  /** Type of resource. */
+  core.String kind;
+
+  /** Not documented yet. */
+  core.String nextPageToken;
+
+  /** Server defined URL for this resource (output only). */
+  core.String selfLink;
+
+
+  ZoneList();
+
+  ZoneList.fromJson(core.Map _json) {
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("items")) {
+      items = _json["items"].map((value) => new Zone.fromJson(value)).toList();
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("selfLink")) {
+      selfLink = _json["selfLink"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (items != null) {
+      _json["items"] = items.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (selfLink != null) {
+      _json["selfLink"] = selfLink;
+    }
+    return _json;
+  }
+}
+
+
diff --git a/generated/googleapis_beta/lib/container/v1beta1.dart b/generated/googleapis_beta/lib/container/v1beta1.dart
new file mode 100644
index 0000000..7f4c9e5
--- /dev/null
+++ b/generated/googleapis_beta/lib/container/v1beta1.dart
@@ -0,0 +1,972 @@
+library googleapis_beta.container.v1beta1;
+
+import "dart:core" as core;
+import "dart:collection" as collection;
+import "dart:async" as async;
+import "dart:convert" as convert;
+
+import "package:crypto/crypto.dart" as crypto;
+import 'package:http/http.dart' as http;
+import '../src/common_internal.dart' as common_internal;
+import '../common/common.dart' as common;
+
+export '../common/common.dart' show ApiRequestError;
+export '../common/common.dart' show DetailedApiRequestError;
+
+/**
+ * The Google Container Engine API is used for building and managing container
+ * based applications, powered by the open source Kubernetes technology.
+ */
+class ContainerApi {
+  /** View and manage your data across Google Cloud Platform services */
+  static const CloudPlatformScope = "https://www.googleapis.com/auth/cloud-platform";
+
+
+  final common_internal.ApiRequester _requester;
+
+  ProjectsResourceApi get projects => new ProjectsResourceApi(_requester);
+
+  ContainerApi(http.Client client) : 
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "container/v1beta1/projects/");
+}
+
+
+/** Not documented yet. */
+class ProjectsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  ProjectsClustersResourceApi get clusters => new ProjectsClustersResourceApi(_requester);
+  ProjectsOperationsResourceApi get operations => new ProjectsOperationsResourceApi(_requester);
+  ProjectsZonesResourceApi get zones => new ProjectsZonesResourceApi(_requester);
+
+  ProjectsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+}
+
+
+/** Not documented yet. */
+class ProjectsClustersResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  ProjectsClustersResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Lists all clusters owned by a project across all zones.
+   *
+   * Request parameters:
+   *
+   * [projectId] - The Google Developers Console project ID or  project number.
+   *
+   * Completes with a [ListAggregatedClustersResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ListAggregatedClustersResponse> list(core.String projectId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (projectId == null) {
+      throw new core.ArgumentError("Parameter projectId is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$projectId') + '/clusters';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListAggregatedClustersResponse.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class ProjectsOperationsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  ProjectsOperationsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Lists all operations in a project, across all zones.
+   *
+   * Request parameters:
+   *
+   * [projectId] - The Google Developers Console project ID or  project number.
+   *
+   * Completes with a [ListAggregatedOperationsResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ListAggregatedOperationsResponse> list(core.String projectId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (projectId == null) {
+      throw new core.ArgumentError("Parameter projectId is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$projectId') + '/operations';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListAggregatedOperationsResponse.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class ProjectsZonesResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  ProjectsZonesClustersResourceApi get clusters => new ProjectsZonesClustersResourceApi(_requester);
+  ProjectsZonesOperationsResourceApi get operations => new ProjectsZonesOperationsResourceApi(_requester);
+
+  ProjectsZonesResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+}
+
+
+/** Not documented yet. */
+class ProjectsZonesClustersResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  ProjectsZonesClustersResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Creates a cluster, consisting of the specified number and type of Google
+   * Compute Engine instances, plus a Kubernetes master instance.
+   *
+   * The cluster is created in the project's default network.
+   *
+   * A firewall is added that allows traffic into port 443 on the master, which
+   * enables HTTPS. A firewall and a route is added for each node to allow the
+   * containers on that node to communicate with all other instances in the
+   * cluster.
+   *
+   * Finally, a route named k8s-iproute-10-xx-0-0 is created to track that the
+   * cluster's 10.xx.0.0/16 CIDR has been assigned.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [projectId] - The Google Developers Console project ID or  project number.
+   *
+   * [zoneId] - The name of the Google Compute Engine zone in which the cluster
+   * resides.
+   *
+   * Completes with a [Operation].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Operation> create(CreateClusterRequest request, core.String projectId, core.String zoneId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (projectId == null) {
+      throw new core.ArgumentError("Parameter projectId is required.");
+    }
+    if (zoneId == null) {
+      throw new core.ArgumentError("Parameter zoneId is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$projectId') + '/zones/' + common_internal.Escaper.ecapeVariable('$zoneId') + '/clusters';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Operation.fromJson(data));
+  }
+
+  /**
+   * Deletes the cluster, including the Kubernetes master and all worker nodes.
+   *
+   * Firewalls and routes that were configured at cluster creation are also
+   * deleted.
+   *
+   * Request parameters:
+   *
+   * [projectId] - The Google Developers Console project ID or  project number.
+   *
+   * [zoneId] - The name of the Google Compute Engine zone in which the cluster
+   * resides.
+   *
+   * [clusterId] - The name of the cluster to delete.
+   *
+   * Completes with a [Operation].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Operation> delete(core.String projectId, core.String zoneId, core.String clusterId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (projectId == null) {
+      throw new core.ArgumentError("Parameter projectId is required.");
+    }
+    if (zoneId == null) {
+      throw new core.ArgumentError("Parameter zoneId is required.");
+    }
+    if (clusterId == null) {
+      throw new core.ArgumentError("Parameter clusterId is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$projectId') + '/zones/' + common_internal.Escaper.ecapeVariable('$zoneId') + '/clusters/' + common_internal.Escaper.ecapeVariable('$clusterId');
+
+    var _response = _requester.request(_url,
+                                       "DELETE",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Operation.fromJson(data));
+  }
+
+  /**
+   * Gets a specific cluster.
+   *
+   * Request parameters:
+   *
+   * [projectId] - The Google Developers Console project ID or  project number.
+   *
+   * [zoneId] - The name of the Google Compute Engine zone in which the cluster
+   * resides.
+   *
+   * [clusterId] - The name of the cluster to retrieve.
+   *
+   * Completes with a [Cluster].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Cluster> get(core.String projectId, core.String zoneId, core.String clusterId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (projectId == null) {
+      throw new core.ArgumentError("Parameter projectId is required.");
+    }
+    if (zoneId == null) {
+      throw new core.ArgumentError("Parameter zoneId is required.");
+    }
+    if (clusterId == null) {
+      throw new core.ArgumentError("Parameter clusterId is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$projectId') + '/zones/' + common_internal.Escaper.ecapeVariable('$zoneId') + '/clusters/' + common_internal.Escaper.ecapeVariable('$clusterId');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Cluster.fromJson(data));
+  }
+
+  /**
+   * Lists all clusters owned by a project in the specified zone.
+   *
+   * Request parameters:
+   *
+   * [projectId] - The Google Developers Console project ID or  project number.
+   *
+   * [zoneId] - The name of the Google Compute Engine zone in which the cluster
+   * resides.
+   *
+   * Completes with a [ListClustersResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ListClustersResponse> list(core.String projectId, core.String zoneId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (projectId == null) {
+      throw new core.ArgumentError("Parameter projectId is required.");
+    }
+    if (zoneId == null) {
+      throw new core.ArgumentError("Parameter zoneId is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$projectId') + '/zones/' + common_internal.Escaper.ecapeVariable('$zoneId') + '/clusters';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListClustersResponse.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class ProjectsZonesOperationsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  ProjectsZonesOperationsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Gets the specified operation.
+   *
+   * Request parameters:
+   *
+   * [projectId] - The Google Developers Console project ID or  project number.
+   *
+   * [zoneId] - The name of the Google Compute Engine zone in which the
+   * operation resides. This is always the same zone as the cluster with which
+   * the operation is associated.
+   *
+   * [operationId] - The server-assigned name of the operation.
+   *
+   * Completes with a [Operation].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Operation> get(core.String projectId, core.String zoneId, core.String operationId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (projectId == null) {
+      throw new core.ArgumentError("Parameter projectId is required.");
+    }
+    if (zoneId == null) {
+      throw new core.ArgumentError("Parameter zoneId is required.");
+    }
+    if (operationId == null) {
+      throw new core.ArgumentError("Parameter operationId is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$projectId') + '/zones/' + common_internal.Escaper.ecapeVariable('$zoneId') + '/operations/' + common_internal.Escaper.ecapeVariable('$operationId');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Operation.fromJson(data));
+  }
+
+  /**
+   * Lists all operations in a project in a specific zone.
+   *
+   * Request parameters:
+   *
+   * [projectId] - The Google Developers Console project ID or  project number.
+   *
+   * [zoneId] - The name of the Google Compute Engine zone to return operations
+   * for.
+   *
+   * Completes with a [ListOperationsResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ListOperationsResponse> list(core.String projectId, core.String zoneId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (projectId == null) {
+      throw new core.ArgumentError("Parameter projectId is required.");
+    }
+    if (zoneId == null) {
+      throw new core.ArgumentError("Parameter zoneId is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$projectId') + '/zones/' + common_internal.Escaper.ecapeVariable('$zoneId') + '/operations';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListOperationsResponse.fromJson(data));
+  }
+
+}
+
+
+
+/** Not documented yet. */
+class Cluster {
+  /**
+   * The API version of the Kubernetes master and kubelets running in this
+   * cluster. Allowed value is 0.4.2, or leave blank to pick up the latest
+   * stable release.
+   */
+  core.String clusterApiVersion;
+
+  /**
+   * [Output only] The IP addresses of the container pods in this cluster, in
+   * CIDR notation (e.g. 1.2.3.4/29).
+   */
+  core.String containerIpv4Cidr;
+
+  /**
+   * [Output only] The time the cluster was created, in RFC3339 text format.
+   */
+  core.String creationTimestamp;
+
+  /** An optional description of this cluster. */
+  core.String description;
+
+  /**
+   * [Output only] The IP address of this cluster's Kubernetes master. The
+   * endpoint can be accessed from the internet at
+   * https://username:password@endpoint/.
+   *
+   * See the masterAuth property of this resource for username and password
+   * information.
+   */
+  core.String endpoint;
+
+  /**
+   * The HTTP basic authentication information for accessing the master. Because
+   * the master endpoint is open to the internet, you should create a strong
+   * password.
+   */
+  MasterAuth masterAuth;
+
+  /**
+   * The name of this cluster. The name must be unique within this project and
+   * zone, and can be up to 40 characters with the following restrictions:
+   * - Lowercase letters, numbers, and hyphens only.
+   * - Must start with a letter.
+   * - Must end with a number or a letter.
+   */
+  core.String name;
+
+  /**
+   * The machine type and image to use for all nodes in this cluster. See the
+   * descriptions of the child properties of nodeConfig.
+   */
+  NodeConfig nodeConfig;
+
+  /**
+   * [Output only] The size of the address space on each node for hosting
+   * containers.
+   */
+  core.int nodeRoutingPrefixSize;
+
+  /**
+   * The number of nodes to create in this cluster. You must ensure that your
+   * Compute Engine resource quota is sufficient for this number of instances
+   * plus one (to include the master). You must also have available firewall and
+   * routes quota.
+   */
+  core.int numNodes;
+
+  /**
+   * [Output only] The IP addresses of the Kubernetes services in this cluster,
+   * in  CIDR notation (e.g. 1.2.3.4/29). Service addresses are always in the
+   * 10.0.0.0/16 range.
+   */
+  core.String servicesIpv4Cidr;
+
+  /**
+   * [Output only] The current status of this cluster.
+   * Possible string values are:
+   * - "error"
+   * - "provisioning"
+   * - "running"
+   * - "stopping"
+   */
+  core.String status;
+
+  /**
+   * [Output only] Additional information about the current status of this
+   * cluster, if available.
+   */
+  core.String statusMessage;
+
+  /**
+   * [Output only] The name of the Google Compute Engine zone in which the
+   * cluster resides.
+   */
+  core.String zone;
+
+
+  Cluster();
+
+  Cluster.fromJson(core.Map _json) {
+    if (_json.containsKey("clusterApiVersion")) {
+      clusterApiVersion = _json["clusterApiVersion"];
+    }
+    if (_json.containsKey("containerIpv4Cidr")) {
+      containerIpv4Cidr = _json["containerIpv4Cidr"];
+    }
+    if (_json.containsKey("creationTimestamp")) {
+      creationTimestamp = _json["creationTimestamp"];
+    }
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("endpoint")) {
+      endpoint = _json["endpoint"];
+    }
+    if (_json.containsKey("masterAuth")) {
+      masterAuth = new MasterAuth.fromJson(_json["masterAuth"]);
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("nodeConfig")) {
+      nodeConfig = new NodeConfig.fromJson(_json["nodeConfig"]);
+    }
+    if (_json.containsKey("nodeRoutingPrefixSize")) {
+      nodeRoutingPrefixSize = _json["nodeRoutingPrefixSize"];
+    }
+    if (_json.containsKey("numNodes")) {
+      numNodes = _json["numNodes"];
+    }
+    if (_json.containsKey("servicesIpv4Cidr")) {
+      servicesIpv4Cidr = _json["servicesIpv4Cidr"];
+    }
+    if (_json.containsKey("status")) {
+      status = _json["status"];
+    }
+    if (_json.containsKey("statusMessage")) {
+      statusMessage = _json["statusMessage"];
+    }
+    if (_json.containsKey("zone")) {
+      zone = _json["zone"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (clusterApiVersion != null) {
+      _json["clusterApiVersion"] = clusterApiVersion;
+    }
+    if (containerIpv4Cidr != null) {
+      _json["containerIpv4Cidr"] = containerIpv4Cidr;
+    }
+    if (creationTimestamp != null) {
+      _json["creationTimestamp"] = creationTimestamp;
+    }
+    if (description != null) {
+      _json["description"] = description;
+    }
+    if (endpoint != null) {
+      _json["endpoint"] = endpoint;
+    }
+    if (masterAuth != null) {
+      _json["masterAuth"] = (masterAuth).toJson();
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (nodeConfig != null) {
+      _json["nodeConfig"] = (nodeConfig).toJson();
+    }
+    if (nodeRoutingPrefixSize != null) {
+      _json["nodeRoutingPrefixSize"] = nodeRoutingPrefixSize;
+    }
+    if (numNodes != null) {
+      _json["numNodes"] = numNodes;
+    }
+    if (servicesIpv4Cidr != null) {
+      _json["servicesIpv4Cidr"] = servicesIpv4Cidr;
+    }
+    if (status != null) {
+      _json["status"] = status;
+    }
+    if (statusMessage != null) {
+      _json["statusMessage"] = statusMessage;
+    }
+    if (zone != null) {
+      _json["zone"] = zone;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class CreateClusterRequest {
+  /** A cluster resource. */
+  Cluster cluster;
+
+
+  CreateClusterRequest();
+
+  CreateClusterRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("cluster")) {
+      cluster = new Cluster.fromJson(_json["cluster"]);
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (cluster != null) {
+      _json["cluster"] = (cluster).toJson();
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class ListAggregatedClustersResponse {
+  /** A list of clusters in the project, across all zones. */
+  core.List<Cluster> clusters;
+
+
+  ListAggregatedClustersResponse();
+
+  ListAggregatedClustersResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("clusters")) {
+      clusters = _json["clusters"].map((value) => new Cluster.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (clusters != null) {
+      _json["clusters"] = clusters.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class ListAggregatedOperationsResponse {
+  /** A list of operations in the project, across all zones. */
+  core.List<Operation> operations;
+
+
+  ListAggregatedOperationsResponse();
+
+  ListAggregatedOperationsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("operations")) {
+      operations = _json["operations"].map((value) => new Operation.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (operations != null) {
+      _json["operations"] = operations.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class ListClustersResponse {
+  /** A list of clusters in the project in the specified zone. */
+  core.List<Cluster> clusters;
+
+
+  ListClustersResponse();
+
+  ListClustersResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("clusters")) {
+      clusters = _json["clusters"].map((value) => new Cluster.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (clusters != null) {
+      _json["clusters"] = clusters.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class ListOperationsResponse {
+  /** A list of operations in the project in the specified zone. */
+  core.List<Operation> operations;
+
+
+  ListOperationsResponse();
+
+  ListOperationsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("operations")) {
+      operations = _json["operations"].map((value) => new Operation.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (operations != null) {
+      _json["operations"] = operations.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class MasterAuth {
+  /** The password to use when accessing the Kubernetes master endpoint. */
+  core.String password;
+
+  /** The username to use when accessing the Kubernetes master endpoint. */
+  core.String user;
+
+
+  MasterAuth();
+
+  MasterAuth.fromJson(core.Map _json) {
+    if (_json.containsKey("password")) {
+      password = _json["password"];
+    }
+    if (_json.containsKey("user")) {
+      user = _json["user"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (password != null) {
+      _json["password"] = password;
+    }
+    if (user != null) {
+      _json["user"] = user;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class NodeConfig {
+  /**
+   * The name of a Google Compute Engine machine type (e.g. n1-standard-1).
+   *
+   * If unspecified, the default machine type is n1-standard-1.
+   */
+  core.String machineType;
+
+  /**
+   * The fully-specified name of a Google Compute Engine image. For example:
+   * https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/backports-debian-7-wheezy-vYYYYMMDD
+   * (where YYYMMDD is the version date).
+   *
+   * If specifying an image, you are responsible for ensuring its compatibility
+   * with the Debian 7 backports image. We recommend leaving this field blank to
+   * accept the default backports-debian-7-wheezy value.
+   */
+  core.String sourceImage;
+
+
+  NodeConfig();
+
+  NodeConfig.fromJson(core.Map _json) {
+    if (_json.containsKey("machineType")) {
+      machineType = _json["machineType"];
+    }
+    if (_json.containsKey("sourceImage")) {
+      sourceImage = _json["sourceImage"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (machineType != null) {
+      _json["machineType"] = machineType;
+    }
+    if (sourceImage != null) {
+      _json["sourceImage"] = sourceImage;
+    }
+    return _json;
+  }
+}
+
+
+/** Defines the operation resource. All fields are output only. */
+class Operation {
+  /** If an error has occurred, a textual description of the error. */
+  core.String errorMessage;
+
+  /**
+   * The server-assigned ID for this operation. If the operation is fulfilled
+   * upfront, it may not have a resource name.
+   */
+  core.String name;
+
+  /**
+   * The operation type.
+   * Possible string values are:
+   * - "createCluster"
+   * - "deleteCluster"
+   */
+  core.String operationType;
+
+  /**
+   * The current status of the operation.
+   * Possible string values are:
+   * - "done"
+   * - "pending"
+   * - "running"
+   */
+  core.String status;
+
+  /**
+   * [Optional] The URL of the cluster resource that this operation is
+   * associated with.
+   */
+  core.String target;
+
+  /**
+   * The name of the Google Compute Engine zone in which the operation is taking
+   * place.
+   */
+  core.String zone;
+
+
+  Operation();
+
+  Operation.fromJson(core.Map _json) {
+    if (_json.containsKey("errorMessage")) {
+      errorMessage = _json["errorMessage"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("operationType")) {
+      operationType = _json["operationType"];
+    }
+    if (_json.containsKey("status")) {
+      status = _json["status"];
+    }
+    if (_json.containsKey("target")) {
+      target = _json["target"];
+    }
+    if (_json.containsKey("zone")) {
+      zone = _json["zone"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (errorMessage != null) {
+      _json["errorMessage"] = errorMessage;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (operationType != null) {
+      _json["operationType"] = operationType;
+    }
+    if (status != null) {
+      _json["status"] = status;
+    }
+    if (target != null) {
+      _json["target"] = target;
+    }
+    if (zone != null) {
+      _json["zone"] = zone;
+    }
+    return _json;
+  }
+}
+
+
diff --git a/generated/googleapis_beta/lib/genomics/v1beta.dart b/generated/googleapis_beta/lib/genomics/v1beta.dart
index ef44652..a3d9729 100644
--- a/generated/googleapis_beta/lib/genomics/v1beta.dart
+++ b/generated/googleapis_beta/lib/genomics/v1beta.dart
@@ -30,7 +30,6 @@
 
   final common_internal.ApiRequester _requester;
 
-  BeaconsResourceApi get beacons => new BeaconsResourceApi(_requester);
   CallsetsResourceApi get callsets => new CallsetsResourceApi(_requester);
   DatasetsResourceApi get datasets => new DatasetsResourceApi(_requester);
   ExperimentalResourceApi get experimental => new ExperimentalResourceApi(_requester);
@@ -46,73 +45,6 @@
 
 
 /** Not documented yet. */
-class BeaconsResourceApi {
-  final common_internal.ApiRequester _requester;
-
-  BeaconsResourceApi(common_internal.ApiRequester client) : 
-      _requester = client;
-
-  /**
-   * This is an experimental API that provides a Global Alliance for Genomics
-   * and Health Beacon. It may change at any time.
-   *
-   * Request parameters:
-   *
-   * [variantSetId] - The ID of the variant set to query over. It must be
-   * public. Private variant sets will return an unauthorized exception.
-   *
-   * [allele] - Required. The allele to look for ('A', 'C', 'G' or 'T').
-   *
-   * [position] - Required. The 0-based position to query.
-   *
-   * [referenceName] - Required. The reference to query over.
-   *
-   * Completes with a [Beacon].
-   *
-   * Completes with a [common.ApiRequestError] if the API endpoint returned an
-   * error.
-   *
-   * If the used [http.Client] completes with an error when making a REST call,
-   * this method  will complete with the same error.
-   */
-  async.Future<Beacon> get(core.String variantSetId, {core.String allele, core.String position, core.String referenceName}) {
-    var _url = null;
-    var _queryParams = new core.Map();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = common.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (variantSetId == null) {
-      throw new core.ArgumentError("Parameter variantSetId is required.");
-    }
-    if (allele != null) {
-      _queryParams["allele"] = [allele];
-    }
-    if (position != null) {
-      _queryParams["position"] = [position];
-    }
-    if (referenceName != null) {
-      _queryParams["referenceName"] = [referenceName];
-    }
-
-
-    _url = 'beacons/' + common_internal.Escaper.ecapeVariable('$variantSetId');
-
-    var _response = _requester.request(_url,
-                                       "GET",
-                                       body: _body,
-                                       queryParams: _queryParams,
-                                       uploadOptions: _uploadOptions,
-                                       uploadMedia: _uploadMedia,
-                                       downloadOptions: _downloadOptions);
-    return _response.then((data) => new Beacon.fromJson(data));
-  }
-
-}
-
-
-/** Not documented yet. */
 class CallsetsResourceApi {
   final common_internal.ApiRequester _requester;
 
@@ -164,7 +96,7 @@
    *
    * Request parameters:
    *
-   * [callSetId] - The ID of the callset to be deleted.
+   * [callSetId] - The ID of the call set to be deleted.
    *
    * Completes with a [common.ApiRequestError] if the API endpoint returned an
    * error.
@@ -203,7 +135,7 @@
    *
    * Request parameters:
    *
-   * [callSetId] - The ID of the callset.
+   * [callSetId] - The ID of the call set.
    *
    * Completes with a [CallSet].
    *
@@ -245,7 +177,7 @@
    *
    * Request parameters:
    *
-   * [callSetId] - The ID of the callset to be updated.
+   * [callSetId] - The ID of the call set to be updated.
    *
    * Completes with a [CallSet].
    *
@@ -286,6 +218,8 @@
   /**
    * Gets a list of call sets matching the criteria.
    *
+   * Implements GlobalAllianceApi.searchCallSets.
+   *
    * [request] - The metadata request object.
    *
    * Request parameters:
@@ -330,7 +264,7 @@
    *
    * Request parameters:
    *
-   * [callSetId] - The ID of the callset to be updated.
+   * [callSetId] - The ID of the call set to be updated.
    *
    * Completes with a [CallSet].
    *
@@ -1518,7 +1452,7 @@
    * be arbitrarily discarded. As a special case, for single-sample VCF files,
    * QUAL and FILTER fields will be moved to the call level; these are sometimes
    * interpreted in a call-specific context. Imported VCF headers are appended
-   * to the metadata already in a VariantSet.
+   * to the metadata already in a variant set.
    *
    * [request] - The metadata request object.
    *
@@ -1560,6 +1494,8 @@
   /**
    * Gets a list of variants matching the criteria.
    *
+   * Implements GlobalAllianceApi.searchVariants.
+   *
    * [request] - The metadata request object.
    *
    * Request parameters:
@@ -1786,8 +1722,7 @@
 
   /**
    * Updates a variant set's metadata. All other modifications are silently
-   * ignored. Returns the modified variant set. This method supports patch
-   * semantics.
+   * ignored. This method supports patch semantics.
    *
    * [request] - The metadata request object.
    *
@@ -1834,6 +1769,8 @@
   /**
    * Returns a list of all variant sets matching search criteria.
    *
+   * Implements GlobalAllianceApi.searchVariantSets.
+   *
    * [request] - The metadata request object.
    *
    * Request parameters:
@@ -1873,7 +1810,7 @@
 
   /**
    * Updates a variant set's metadata. All other modifications are silently
-   * ignored. Returns the modified variant set.
+   * ignored.
    *
    * [request] - The metadata request object.
    *
@@ -1922,36 +1859,9 @@
 
 
 /**
- * A beacon represents whether any variant call in a variant set has a specific
- * allele at a particular position.
- */
-class Beacon {
-  /** True if the allele exists on any variant call, false otherwise. */
-  core.bool exists;
-
-
-  Beacon();
-
-  Beacon.fromJson(core.Map _json) {
-    if (_json.containsKey("exists")) {
-      exists = _json["exists"];
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (exists != null) {
-      _json["exists"] = exists;
-    }
-    return _json;
-  }
-}
-
-
-/**
- * A Call represents the determination of genotype with respect to a particular
+ * A call represents the determination of genotype with respect to a particular
  * variant. It may include associated information such as quality and phasing.
- * For example, a Call might assign a probability of 0.32 to the occurrence of a
+ * For example, a call might assign a probability of 0.32 to the occurrence of a
  * SNP named rs1234 in a call set with the name NA12345.
  */
 class Call {
@@ -2041,7 +1951,10 @@
 }
 
 
-/** A CallSet is a collection of variant calls. It belongs to a variant set. */
+/**
+ * A call set is a collection of variant calls, typically for one sample. It
+ * belongs to a variant set.
+ */
 class CallSet {
   /** The date this call set was created in milliseconds from the epoch. */
   core.String created;
@@ -2049,10 +1962,10 @@
   /** The Google generated ID of the call set, immutable. */
   core.String id;
 
-  /** A map of additional callset information. */
+  /** A map of additional call set information. */
   core.Map<core.String, core.List<core.String>> info;
 
-  /** The callset name. */
+  /** The call set name. */
   core.String name;
 
   /** The sample ID this call set corresponds to. */
@@ -2208,16 +2121,14 @@
 /** The job creation request. */
 class ExperimentalCreateJobRequest {
   /**
-   * Specifies whether or not to run the alignment pipeline. At least one of
-   * align or callVariants must be provided.
+   * Specifies whether or not to run the alignment pipeline. Either align or
+   * callVariants must be set.
    */
   core.bool align;
 
   /**
-   * Specifies whether or not to run the variant calling pipeline. If specified,
-   * alignment will be performed first and the aligned BAMs will passed as input
-   * to the variant caller. At least one of align or callVariants must be
-   * provided.
+   * Specifies whether or not to run the variant calling pipeline. Either align
+   * or callVariants must be set.
    */
   core.bool callVariants;
 
@@ -2945,6 +2856,8 @@
   /**
    * The original request type.
    * Possible string values are:
+   * - "alignReadsets"
+   * - "callReadsets"
    * - "experimentalCreateJob"
    * - "exportReadsets"
    * - "exportVariants"
@@ -4431,9 +4344,13 @@
 
 
 /**
- * A Variant represents a change in DNA sequence relative to some reference. For
- * example, a Variant could represent a SNP or an insertion. Variants belong to
- * a variant set.
+ * A variant represents a change in DNA sequence relative to a reference
+ * sequence. For example, a variant could represent a SNP or an insertion.
+ * Variants belong to a variant set. Each of the calls on a variant represent a
+ * determination of genotype with respect to that variant. For example, a call
+ * might assign probability of 0.32 to the occurrence of a SNP named rs1234 in a
+ * sample named NA12345. A call belongs to a call set, which contains related
+ * calls typically from one sample.
  */
 class Variant {
   /** The bases that appear instead of the reference bases. */
@@ -4586,8 +4503,8 @@
 
 
 /**
- * A VariantSet represents a collection of Variants and their summary
- * statistics.
+ * A variant set is a collection of call sets and variants. It contains summary
+ * statistics of those contents. A variant set belongs to a dataset.
  */
 class VariantSet {
   /** The dataset to which this variant set belongs. Immutable. */
diff --git a/generated/googleapis_beta/lib/genomics/v1beta2.dart b/generated/googleapis_beta/lib/genomics/v1beta2.dart
new file mode 100644
index 0000000..a4ab8bb
--- /dev/null
+++ b/generated/googleapis_beta/lib/genomics/v1beta2.dart
@@ -0,0 +1,5872 @@
+library googleapis_beta.genomics.v1beta2;
+
+import "dart:core" as core;
+import "dart:collection" as collection;
+import "dart:async" as async;
+import "dart:convert" as convert;
+
+import "package:crypto/crypto.dart" as crypto;
+import 'package:http/http.dart' as http;
+import '../src/common_internal.dart' as common_internal;
+import '../common/common.dart' as common;
+
+export '../common/common.dart' show ApiRequestError;
+export '../common/common.dart' show DetailedApiRequestError;
+
+/** Provides access to Genomics data. */
+class GenomicsApi {
+  /** View and manage your data in Google BigQuery */
+  static const BigqueryScope = "https://www.googleapis.com/auth/bigquery";
+
+  /** Manage your data in Google Cloud Storage */
+  static const DevstorageReadWriteScope = "https://www.googleapis.com/auth/devstorage.read_write";
+
+  /** View and manage Genomics data */
+  static const GenomicsScope = "https://www.googleapis.com/auth/genomics";
+
+  /** View Genomics data */
+  static const GenomicsReadonlyScope = "https://www.googleapis.com/auth/genomics.readonly";
+
+
+  final common_internal.ApiRequester _requester;
+
+  CallsetsResourceApi get callsets => new CallsetsResourceApi(_requester);
+  DatasetsResourceApi get datasets => new DatasetsResourceApi(_requester);
+  ExperimentalResourceApi get experimental => new ExperimentalResourceApi(_requester);
+  JobsResourceApi get jobs => new JobsResourceApi(_requester);
+  ReadgroupsetsResourceApi get readgroupsets => new ReadgroupsetsResourceApi(_requester);
+  ReadsResourceApi get reads => new ReadsResourceApi(_requester);
+  ReferencesResourceApi get references => new ReferencesResourceApi(_requester);
+  ReferencesetsResourceApi get referencesets => new ReferencesetsResourceApi(_requester);
+  VariantsResourceApi get variants => new VariantsResourceApi(_requester);
+  VariantsetsResourceApi get variantsets => new VariantsetsResourceApi(_requester);
+
+  GenomicsApi(http.Client client) : 
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "genomics/v1beta2/");
+}
+
+
+/** Not documented yet. */
+class CallsetsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  CallsetsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Creates a new call set.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * Completes with a [CallSet].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<CallSet> create(CallSet request) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+
+
+    _url = 'callsets';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new CallSet.fromJson(data));
+  }
+
+  /**
+   * Deletes a call set.
+   *
+   * Request parameters:
+   *
+   * [callSetId] - The ID of the call set to be deleted.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future delete(core.String callSetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (callSetId == null) {
+      throw new core.ArgumentError("Parameter callSetId is required.");
+    }
+
+    _downloadOptions = null;
+
+    _url = 'callsets/' + common_internal.Escaper.ecapeVariable('$callSetId');
+
+    var _response = _requester.request(_url,
+                                       "DELETE",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Gets a call set by ID.
+   *
+   * Request parameters:
+   *
+   * [callSetId] - The ID of the call set.
+   *
+   * Completes with a [CallSet].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<CallSet> get(core.String callSetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (callSetId == null) {
+      throw new core.ArgumentError("Parameter callSetId is required.");
+    }
+
+
+    _url = 'callsets/' + common_internal.Escaper.ecapeVariable('$callSetId');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new CallSet.fromJson(data));
+  }
+
+  /**
+   * Updates a call set. This method supports patch semantics.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [callSetId] - The ID of the call set to be updated.
+   *
+   * Completes with a [CallSet].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<CallSet> patch(CallSet request, core.String callSetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (callSetId == null) {
+      throw new core.ArgumentError("Parameter callSetId is required.");
+    }
+
+
+    _url = 'callsets/' + common_internal.Escaper.ecapeVariable('$callSetId');
+
+    var _response = _requester.request(_url,
+                                       "PATCH",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new CallSet.fromJson(data));
+  }
+
+  /**
+   * Gets a list of call sets matching the criteria.
+   *
+   * Implements GlobalAllianceApi.searchCallSets.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * Completes with a [SearchCallSetsResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<SearchCallSetsResponse> search(SearchCallSetsRequest request) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+
+
+    _url = 'callsets/search';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new SearchCallSetsResponse.fromJson(data));
+  }
+
+  /**
+   * Updates a call set.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [callSetId] - The ID of the call set to be updated.
+   *
+   * Completes with a [CallSet].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<CallSet> update(CallSet request, core.String callSetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (callSetId == null) {
+      throw new core.ArgumentError("Parameter callSetId is required.");
+    }
+
+
+    _url = 'callsets/' + common_internal.Escaper.ecapeVariable('$callSetId');
+
+    var _response = _requester.request(_url,
+                                       "PUT",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new CallSet.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class DatasetsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  DatasetsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Creates a new dataset.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * Completes with a [Dataset].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Dataset> create(Dataset request) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+
+
+    _url = 'datasets';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Dataset.fromJson(data));
+  }
+
+  /**
+   * Deletes a dataset.
+   *
+   * Request parameters:
+   *
+   * [datasetId] - The ID of the dataset to be deleted.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future delete(core.String datasetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (datasetId == null) {
+      throw new core.ArgumentError("Parameter datasetId is required.");
+    }
+
+    _downloadOptions = null;
+
+    _url = 'datasets/' + common_internal.Escaper.ecapeVariable('$datasetId');
+
+    var _response = _requester.request(_url,
+                                       "DELETE",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Gets a dataset by ID.
+   *
+   * Request parameters:
+   *
+   * [datasetId] - The ID of the dataset.
+   *
+   * Completes with a [Dataset].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Dataset> get(core.String datasetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (datasetId == null) {
+      throw new core.ArgumentError("Parameter datasetId is required.");
+    }
+
+
+    _url = 'datasets/' + common_internal.Escaper.ecapeVariable('$datasetId');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Dataset.fromJson(data));
+  }
+
+  /**
+   * Lists all datasets.
+   *
+   * Request parameters:
+   *
+   * [pageSize] - The maximum number of results returned by this request.
+   *
+   * [pageToken] - The continuation token, which is used to page through large
+   * result sets. To get the next page of results, set this parameter to the
+   * value of nextPageToken from the previous response.
+   *
+   * [projectNumber] - Only return datasets which belong to this Google
+   * Developers Console project. Only accepts project numbers. Returns all
+   * public projects if no project number is specified.
+   *
+   * Completes with a [ListDatasetsResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ListDatasetsResponse> list({core.int pageSize, core.String pageToken, core.String projectNumber}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (projectNumber != null) {
+      _queryParams["projectNumber"] = [projectNumber];
+    }
+
+
+    _url = 'datasets';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListDatasetsResponse.fromJson(data));
+  }
+
+  /**
+   * Updates a dataset. This method supports patch semantics.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [datasetId] - The ID of the dataset to be updated.
+   *
+   * Completes with a [Dataset].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Dataset> patch(Dataset request, core.String datasetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (datasetId == null) {
+      throw new core.ArgumentError("Parameter datasetId is required.");
+    }
+
+
+    _url = 'datasets/' + common_internal.Escaper.ecapeVariable('$datasetId');
+
+    var _response = _requester.request(_url,
+                                       "PATCH",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Dataset.fromJson(data));
+  }
+
+  /**
+   * Undeletes a dataset by restoring a dataset which was deleted via this API.
+   * This operation is only possible for a week after the deletion occurred.
+   *
+   * Request parameters:
+   *
+   * [datasetId] - The ID of the dataset to be undeleted.
+   *
+   * Completes with a [Dataset].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Dataset> undelete(core.String datasetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (datasetId == null) {
+      throw new core.ArgumentError("Parameter datasetId is required.");
+    }
+
+
+    _url = 'datasets/' + common_internal.Escaper.ecapeVariable('$datasetId') + '/undelete';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Dataset.fromJson(data));
+  }
+
+  /**
+   * Updates a dataset.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [datasetId] - The ID of the dataset to be updated.
+   *
+   * Completes with a [Dataset].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Dataset> update(Dataset request, core.String datasetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (datasetId == null) {
+      throw new core.ArgumentError("Parameter datasetId is required.");
+    }
+
+
+    _url = 'datasets/' + common_internal.Escaper.ecapeVariable('$datasetId');
+
+    var _response = _requester.request(_url,
+                                       "PUT",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Dataset.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class ExperimentalResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  ExperimentalJobsResourceApi get jobs => new ExperimentalJobsResourceApi(_requester);
+
+  ExperimentalResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+}
+
+
+/** Not documented yet. */
+class ExperimentalJobsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  ExperimentalJobsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Creates and asynchronously runs an ad-hoc job. This is an experimental call
+   * and may be removed or changed at any time.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * Completes with a [ExperimentalCreateJobResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ExperimentalCreateJobResponse> create(ExperimentalCreateJobRequest request) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+
+
+    _url = 'experimental/jobs/create';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ExperimentalCreateJobResponse.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class JobsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  JobsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Cancels a job by ID. Note that it is possible for partial results to be
+   * generated and stored for cancelled jobs.
+   *
+   * Request parameters:
+   *
+   * [jobId] - Required. The ID of the job.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future cancel(core.String jobId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (jobId == null) {
+      throw new core.ArgumentError("Parameter jobId is required.");
+    }
+
+    _downloadOptions = null;
+
+    _url = 'jobs/' + common_internal.Escaper.ecapeVariable('$jobId') + '/cancel';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Gets a job by ID.
+   *
+   * Request parameters:
+   *
+   * [jobId] - Required. The ID of the job.
+   *
+   * Completes with a [Job].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Job> get(core.String jobId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (jobId == null) {
+      throw new core.ArgumentError("Parameter jobId is required.");
+    }
+
+
+    _url = 'jobs/' + common_internal.Escaper.ecapeVariable('$jobId');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Job.fromJson(data));
+  }
+
+  /**
+   * Gets a list of jobs matching the criteria.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * Completes with a [SearchJobsResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<SearchJobsResponse> search(SearchJobsRequest request) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+
+
+    _url = 'jobs/search';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new SearchJobsResponse.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class ReadgroupsetsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  ReadgroupsetsCoveragebucketsResourceApi get coveragebuckets => new ReadgroupsetsCoveragebucketsResourceApi(_requester);
+
+  ReadgroupsetsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Aligns read data from existing read group sets or files from Google Cloud
+   * Storage. See the  alignment and variant calling documentation for more
+   * details.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * Completes with a [AlignReadGroupSetsResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<AlignReadGroupSetsResponse> align(AlignReadGroupSetsRequest request) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+
+
+    _url = 'readgroupsets/align';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new AlignReadGroupSetsResponse.fromJson(data));
+  }
+
+  /**
+   * Calls variants on read data from existing read group sets or files from
+   * Google Cloud Storage. See the  alignment and variant calling documentation
+   * for more details.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * Completes with a [CallReadGroupSetsResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<CallReadGroupSetsResponse> call(CallReadGroupSetsRequest request) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+
+
+    _url = 'readgroupsets/call';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new CallReadGroupSetsResponse.fromJson(data));
+  }
+
+  /**
+   * Deletes a read group set.
+   *
+   * Request parameters:
+   *
+   * [readGroupSetId] - The ID of the read group set to be deleted. The caller
+   * must have WRITE permissions to the dataset associated with this read group
+   * set.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future delete(core.String readGroupSetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (readGroupSetId == null) {
+      throw new core.ArgumentError("Parameter readGroupSetId is required.");
+    }
+
+    _downloadOptions = null;
+
+    _url = 'readgroupsets/' + common_internal.Escaper.ecapeVariable('$readGroupSetId');
+
+    var _response = _requester.request(_url,
+                                       "DELETE",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Exports read group sets to a BAM file in Google Cloud Storage.
+   *
+   * Note that currently there may be some differences between exported BAM
+   * files and the original BAM file at the time of import. In particular,
+   * comments in the input file header will not be preserved, and some custom
+   * tags will be converted to strings.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * Completes with a [ExportReadGroupSetsResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ExportReadGroupSetsResponse> export(ExportReadGroupSetsRequest request) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+
+
+    _url = 'readgroupsets/export';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ExportReadGroupSetsResponse.fromJson(data));
+  }
+
+  /**
+   * Gets a read group set by ID.
+   *
+   * Request parameters:
+   *
+   * [readGroupSetId] - The ID of the read group set.
+   *
+   * Completes with a [ReadGroupSet].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ReadGroupSet> get(core.String readGroupSetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (readGroupSetId == null) {
+      throw new core.ArgumentError("Parameter readGroupSetId is required.");
+    }
+
+
+    _url = 'readgroupsets/' + common_internal.Escaper.ecapeVariable('$readGroupSetId');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ReadGroupSet.fromJson(data));
+  }
+
+  /**
+   * Creates read group sets by asynchronously importing the provided
+   * information.
+   *
+   * Note that currently comments in the input file header are not imported and
+   * some custom tags will be converted to strings, rather than preserving tag
+   * types. The caller must have WRITE permissions to the dataset.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * Completes with a [ImportReadGroupSetsResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ImportReadGroupSetsResponse> import(ImportReadGroupSetsRequest request) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+
+
+    _url = 'readgroupsets/import';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ImportReadGroupSetsResponse.fromJson(data));
+  }
+
+  /**
+   * Updates a read group set. This method supports patch semantics.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [readGroupSetId] - The ID of the read group set to be updated. The caller
+   * must have WRITE permissions to the dataset associated with this read group
+   * set.
+   *
+   * Completes with a [ReadGroupSet].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ReadGroupSet> patch(ReadGroupSet request, core.String readGroupSetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (readGroupSetId == null) {
+      throw new core.ArgumentError("Parameter readGroupSetId is required.");
+    }
+
+
+    _url = 'readgroupsets/' + common_internal.Escaper.ecapeVariable('$readGroupSetId');
+
+    var _response = _requester.request(_url,
+                                       "PATCH",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ReadGroupSet.fromJson(data));
+  }
+
+  /**
+   * Searches for read group sets matching the criteria.
+   *
+   * Implements GlobalAllianceApi.searchReadGroupSets.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * Completes with a [SearchReadGroupSetsResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<SearchReadGroupSetsResponse> search(SearchReadGroupSetsRequest request) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+
+
+    _url = 'readgroupsets/search';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new SearchReadGroupSetsResponse.fromJson(data));
+  }
+
+  /**
+   * Updates a read group set.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [readGroupSetId] - The ID of the read group set to be updated. The caller
+   * must have WRITE permissions to the dataset associated with this read group
+   * set.
+   *
+   * Completes with a [ReadGroupSet].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ReadGroupSet> update(ReadGroupSet request, core.String readGroupSetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (readGroupSetId == null) {
+      throw new core.ArgumentError("Parameter readGroupSetId is required.");
+    }
+
+
+    _url = 'readgroupsets/' + common_internal.Escaper.ecapeVariable('$readGroupSetId');
+
+    var _response = _requester.request(_url,
+                                       "PUT",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ReadGroupSet.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class ReadgroupsetsCoveragebucketsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  ReadgroupsetsCoveragebucketsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Lists fixed width coverage buckets for a read group set, each of which
+   * correspond to a range of a reference sequence. Each bucket summarizes
+   * coverage information across its corresponding genomic range.
+   *
+   * Coverage is defined as the number of reads which are aligned to a given
+   * base in the reference sequence. Coverage buckets are available at several
+   * precomputed bucket widths, enabling retrieval of various coverage 'zoom
+   * levels'. The caller must have READ permissions for the target read group
+   * set.
+   *
+   * Request parameters:
+   *
+   * [readGroupSetId] - Required. The ID of the read group set over which
+   * coverage is requested.
+   *
+   * [pageSize] - The maximum number of results to return in a single page. If
+   * unspecified, defaults to 1024. The maximum value is 2048.
+   *
+   * [pageToken] - The continuation token, which is used to page through large
+   * result sets. To get the next page of results, set this parameter to the
+   * value of nextPageToken from the previous response.
+   *
+   * [range_end] - The end position of the range on the reference, 0-based
+   * exclusive. If specified, referenceName must also be specified.
+   *
+   * [range_referenceName] - The reference sequence name, for example chr1, 1,
+   * or chrX.
+   *
+   * [range_start] - The start position of the range on the reference, 0-based
+   * inclusive. If specified, referenceName must also be specified.
+   *
+   * [targetBucketWidth] - The desired width of each reported coverage bucket in
+   * base pairs. This will be rounded down to the nearest precomputed bucket
+   * width; the value of which is returned as bucketWidth in the response.
+   * Defaults to infinity (each bucket spans an entire reference sequence) or
+   * the length of the target range, if specified. The smallest precomputed
+   * bucketWidth is currently 2048 base pairs; this is subject to change.
+   *
+   * Completes with a [ListCoverageBucketsResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ListCoverageBucketsResponse> list(core.String readGroupSetId, {core.int pageSize, core.String pageToken, core.String range_end, core.String range_referenceName, core.String range_start, core.String targetBucketWidth}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (readGroupSetId == null) {
+      throw new core.ArgumentError("Parameter readGroupSetId is required.");
+    }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (range_end != null) {
+      _queryParams["range.end"] = [range_end];
+    }
+    if (range_referenceName != null) {
+      _queryParams["range.referenceName"] = [range_referenceName];
+    }
+    if (range_start != null) {
+      _queryParams["range.start"] = [range_start];
+    }
+    if (targetBucketWidth != null) {
+      _queryParams["targetBucketWidth"] = [targetBucketWidth];
+    }
+
+
+    _url = 'readgroupsets/' + common_internal.Escaper.ecapeVariable('$readGroupSetId') + '/coveragebuckets';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListCoverageBucketsResponse.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class ReadsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  ReadsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Gets a list of reads for one or more read group sets. Reads search operates
+   * over a genomic coordinate space of reference sequence & position defined
+   * over the reference sequences to which the requested read group sets are
+   * aligned.
+   *
+   * If a target positional range is specified, search returns all reads whose
+   * alignment to the reference genome overlap the range. A query which
+   * specifies only read group set IDs yields all reads in those read group
+   * sets, including unmapped reads.
+   *
+   * All reads returned (including reads on subsequent pages) are ordered by
+   * genomic coordinate (reference sequence & position). Reads with equivalent
+   * genomic coordinates are returned in a deterministic order.
+   *
+   * Implements GlobalAllianceApi.searchReads.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * Completes with a [SearchReadsResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<SearchReadsResponse> search(SearchReadsRequest request) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+
+
+    _url = 'reads/search';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new SearchReadsResponse.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class ReferencesResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  ReferencesBasesResourceApi get bases => new ReferencesBasesResourceApi(_requester);
+
+  ReferencesResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Gets a reference.
+   *
+   * Implements GlobalAllianceApi.getReference.
+   *
+   * Request parameters:
+   *
+   * [referenceId] - The ID of the reference.
+   *
+   * Completes with a [Reference].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Reference> get(core.String referenceId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (referenceId == null) {
+      throw new core.ArgumentError("Parameter referenceId is required.");
+    }
+
+
+    _url = 'references/' + common_internal.Escaper.ecapeVariable('$referenceId');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Reference.fromJson(data));
+  }
+
+  /**
+   * Searches for references which match the given criteria.
+   *
+   * Implements GlobalAllianceApi.searchReferences.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * Completes with a [SearchReferencesResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<SearchReferencesResponse> search(SearchReferencesRequest request) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+
+
+    _url = 'references/search';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new SearchReferencesResponse.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class ReferencesBasesResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  ReferencesBasesResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Lists the bases in a reference, optionally restricted to a range.
+   *
+   * Implements GlobalAllianceApi.getReferenceBases.
+   *
+   * Request parameters:
+   *
+   * [referenceId] - The ID of the reference.
+   *
+   * [end] - The end position (0-based, exclusive) of this query. Defaults to
+   * the length of this reference.
+   *
+   * [pageSize] - Specifies the maximum number of bases to return in a single
+   * page.
+   *
+   * [pageToken] - The continuation token, which is used to page through large
+   * result sets. To get the next page of results, set this parameter to the
+   * value of nextPageToken from the previous response.
+   *
+   * [start] - The start position (0-based) of this query. Defaults to 0.
+   *
+   * Completes with a [ListBasesResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ListBasesResponse> list(core.String referenceId, {core.String end, core.int pageSize, core.String pageToken, core.String start}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (referenceId == null) {
+      throw new core.ArgumentError("Parameter referenceId is required.");
+    }
+    if (end != null) {
+      _queryParams["end"] = [end];
+    }
+    if (pageSize != null) {
+      _queryParams["pageSize"] = ["${pageSize}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+    if (start != null) {
+      _queryParams["start"] = [start];
+    }
+
+
+    _url = 'references/' + common_internal.Escaper.ecapeVariable('$referenceId') + '/bases';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ListBasesResponse.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class ReferencesetsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  ReferencesetsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Gets a reference set.
+   *
+   * Implements GlobalAllianceApi.getReferenceSet.
+   *
+   * Request parameters:
+   *
+   * [referenceSetId] - The ID of the reference set.
+   *
+   * Completes with a [ReferenceSet].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ReferenceSet> get(core.String referenceSetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (referenceSetId == null) {
+      throw new core.ArgumentError("Parameter referenceSetId is required.");
+    }
+
+
+    _url = 'referencesets/' + common_internal.Escaper.ecapeVariable('$referenceSetId');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ReferenceSet.fromJson(data));
+  }
+
+  /**
+   * Searches for reference sets which match the given criteria.
+   *
+   * Implements GlobalAllianceApi.searchReferenceSets.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * Completes with a [SearchReferenceSetsResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<SearchReferenceSetsResponse> search(SearchReferenceSetsRequest request) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+
+
+    _url = 'referencesets/search';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new SearchReferenceSetsResponse.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class VariantsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  VariantsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Creates a new variant.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * Completes with a [Variant].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Variant> create(Variant request) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+
+
+    _url = 'variants';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Variant.fromJson(data));
+  }
+
+  /**
+   * Deletes a variant.
+   *
+   * Request parameters:
+   *
+   * [variantId] - The ID of the variant to be deleted.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future delete(core.String variantId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (variantId == null) {
+      throw new core.ArgumentError("Parameter variantId is required.");
+    }
+
+    _downloadOptions = null;
+
+    _url = 'variants/' + common_internal.Escaper.ecapeVariable('$variantId');
+
+    var _response = _requester.request(_url,
+                                       "DELETE",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Gets a variant by ID.
+   *
+   * Request parameters:
+   *
+   * [variantId] - The ID of the variant.
+   *
+   * Completes with a [Variant].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Variant> get(core.String variantId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (variantId == null) {
+      throw new core.ArgumentError("Parameter variantId is required.");
+    }
+
+
+    _url = 'variants/' + common_internal.Escaper.ecapeVariable('$variantId');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Variant.fromJson(data));
+  }
+
+  /**
+   * Gets a list of variants matching the criteria.
+   *
+   * Implements GlobalAllianceApi.searchVariants.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * Completes with a [SearchVariantsResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<SearchVariantsResponse> search(SearchVariantsRequest request) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+
+
+    _url = 'variants/search';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new SearchVariantsResponse.fromJson(data));
+  }
+
+  /**
+   * Updates a variant's names and info fields. All other modifications are
+   * silently ignored. Returns the modified variant without its calls.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [variantId] - The ID of the variant to be updated.
+   *
+   * Completes with a [Variant].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Variant> update(Variant request, core.String variantId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (variantId == null) {
+      throw new core.ArgumentError("Parameter variantId is required.");
+    }
+
+
+    _url = 'variants/' + common_internal.Escaper.ecapeVariable('$variantId');
+
+    var _response = _requester.request(_url,
+                                       "PUT",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Variant.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class VariantsetsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  VariantsetsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Deletes the contents of a variant set. The variant set object is not
+   * deleted.
+   *
+   * Request parameters:
+   *
+   * [variantSetId] - The ID of the variant set to be deleted.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future delete(core.String variantSetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (variantSetId == null) {
+      throw new core.ArgumentError("Parameter variantSetId is required.");
+    }
+
+    _downloadOptions = null;
+
+    _url = 'variantsets/' + common_internal.Escaper.ecapeVariable('$variantSetId');
+
+    var _response = _requester.request(_url,
+                                       "DELETE",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Exports variant set data to an external destination.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [variantSetId] - Required. The ID of the variant set that contains variant
+   * data which should be exported. The caller must have READ access to this
+   * variant set.
+   *
+   * Completes with a [ExportVariantSetResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ExportVariantSetResponse> export(ExportVariantSetRequest request, core.String variantSetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (variantSetId == null) {
+      throw new core.ArgumentError("Parameter variantSetId is required.");
+    }
+
+
+    _url = 'variantsets/' + common_internal.Escaper.ecapeVariable('$variantSetId') + '/export';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ExportVariantSetResponse.fromJson(data));
+  }
+
+  /**
+   * Gets a variant set by ID.
+   *
+   * Request parameters:
+   *
+   * [variantSetId] - Required. The ID of the variant set.
+   *
+   * Completes with a [VariantSet].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<VariantSet> get(core.String variantSetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (variantSetId == null) {
+      throw new core.ArgumentError("Parameter variantSetId is required.");
+    }
+
+
+    _url = 'variantsets/' + common_internal.Escaper.ecapeVariable('$variantSetId');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new VariantSet.fromJson(data));
+  }
+
+  /**
+   * Creates variant data by asynchronously importing the provided information.
+   *
+   * The variants for import will be merged with any existing data and each
+   * other according to the behavior of mergeVariants. In particular, this means
+   * for merged VCF variants that have conflicting INFO fields, some data will
+   * be arbitrarily discarded. As a special case, for single-sample VCF files,
+   * QUAL and FILTER fields will be moved to the call level; these are sometimes
+   * interpreted in a call-specific context. Imported VCF headers are appended
+   * to the metadata already in a variant set.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [variantSetId] - Required. The variant set to which variant data should be
+   * imported.
+   *
+   * Completes with a [ImportVariantsResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<ImportVariantsResponse> importVariants(ImportVariantsRequest request, core.String variantSetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (variantSetId == null) {
+      throw new core.ArgumentError("Parameter variantSetId is required.");
+    }
+
+
+    _url = 'variantsets/' + common_internal.Escaper.ecapeVariable('$variantSetId') + '/importVariants';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new ImportVariantsResponse.fromJson(data));
+  }
+
+  /**
+   * Merges the given variants with existing variants. Each variant will be
+   * merged with an existing variant that matches its reference sequence, start,
+   * end, reference bases, and alternative bases. If no such variant exists, a
+   * new one will be created.
+   *
+   * When variants are merged, the call information from the new variant is
+   * added to the existing variant, and other fields (such as key/value pairs)
+   * are discarded.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [variantSetId] - The destination variant set.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future mergeVariants(MergeVariantsRequest request, core.String variantSetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (variantSetId == null) {
+      throw new core.ArgumentError("Parameter variantSetId is required.");
+    }
+
+    _downloadOptions = null;
+
+    _url = 'variantsets/' + common_internal.Escaper.ecapeVariable('$variantSetId') + '/mergeVariants';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Updates a variant set's metadata. All other modifications are silently
+   * ignored. This method supports patch semantics.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [variantSetId] - The ID of the variant to be updated.
+   *
+   * Completes with a [VariantSet].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<VariantSet> patch(VariantSet request, core.String variantSetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (variantSetId == null) {
+      throw new core.ArgumentError("Parameter variantSetId is required.");
+    }
+
+
+    _url = 'variantsets/' + common_internal.Escaper.ecapeVariable('$variantSetId');
+
+    var _response = _requester.request(_url,
+                                       "PATCH",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new VariantSet.fromJson(data));
+  }
+
+  /**
+   * Returns a list of all variant sets matching search criteria.
+   *
+   * Implements GlobalAllianceApi.searchVariantSets.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * Completes with a [SearchVariantSetsResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<SearchVariantSetsResponse> search(SearchVariantSetsRequest request) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+
+
+    _url = 'variantsets/search';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new SearchVariantSetsResponse.fromJson(data));
+  }
+
+  /**
+   * Updates a variant set's metadata. All other modifications are silently
+   * ignored.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [variantSetId] - The ID of the variant to be updated.
+   *
+   * Completes with a [VariantSet].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<VariantSet> update(VariantSet request, core.String variantSetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (variantSetId == null) {
+      throw new core.ArgumentError("Parameter variantSetId is required.");
+    }
+
+
+    _url = 'variantsets/' + common_internal.Escaper.ecapeVariable('$variantSetId');
+
+    var _response = _requester.request(_url,
+                                       "PUT",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new VariantSet.fromJson(data));
+  }
+
+}
+
+
+
+/** The read group set align request. */
+class AlignReadGroupSetsRequest {
+  /**
+   * The BAM source files for alignment. Exactly one of readGroupSetIds,
+   * bamSourceUris, interleavedFastqSource or pairedFastqSource must be
+   * provided. The caller must have READ permissions for these files.
+   */
+  core.List<core.String> bamSourceUris;
+
+  /**
+   * Required. The ID of the dataset the newly aligned read group sets will
+   * belong to. The caller must have WRITE permissions to this dataset.
+   */
+  core.String datasetId;
+
+  /**
+   * The interleaved FASTQ source files for alignment, where both members of
+   * each pair of reads are found on consecutive records within the same FASTQ
+   * file. Exactly one of readGroupSetIds, bamSourceUris, interleavedFastqSource
+   * or pairedFastqSource must be provided.
+   */
+  InterleavedFastqSource interleavedFastqSource;
+
+  /**
+   * The paired end FASTQ source files for alignment, where each member of a
+   * pair of reads are found in separate files. Exactly one of readGroupSetIds,
+   * bamSourceUris, interleavedFastqSource or pairedFastqSource must be
+   * provided.
+   */
+  PairedFastqSource pairedFastqSource;
+
+  /**
+   * The IDs of the read group sets which will be aligned. New read group sets
+   * will be generated to hold the aligned data, the originals will not be
+   * modified. The caller must have READ permissions for these read group sets.
+   * Exactly one of readGroupSetIds, bamSourceUris, interleavedFastqSource or
+   * pairedFastqSource must be provided.
+   */
+  core.List<core.String> readGroupSetIds;
+
+
+  AlignReadGroupSetsRequest();
+
+  AlignReadGroupSetsRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("bamSourceUris")) {
+      bamSourceUris = _json["bamSourceUris"];
+    }
+    if (_json.containsKey("datasetId")) {
+      datasetId = _json["datasetId"];
+    }
+    if (_json.containsKey("interleavedFastqSource")) {
+      interleavedFastqSource = new InterleavedFastqSource.fromJson(_json["interleavedFastqSource"]);
+    }
+    if (_json.containsKey("pairedFastqSource")) {
+      pairedFastqSource = new PairedFastqSource.fromJson(_json["pairedFastqSource"]);
+    }
+    if (_json.containsKey("readGroupSetIds")) {
+      readGroupSetIds = _json["readGroupSetIds"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (bamSourceUris != null) {
+      _json["bamSourceUris"] = bamSourceUris;
+    }
+    if (datasetId != null) {
+      _json["datasetId"] = datasetId;
+    }
+    if (interleavedFastqSource != null) {
+      _json["interleavedFastqSource"] = (interleavedFastqSource).toJson();
+    }
+    if (pairedFastqSource != null) {
+      _json["pairedFastqSource"] = (pairedFastqSource).toJson();
+    }
+    if (readGroupSetIds != null) {
+      _json["readGroupSetIds"] = readGroupSetIds;
+    }
+    return _json;
+  }
+}
+
+
+/** The read group set align response. */
+class AlignReadGroupSetsResponse {
+  /** A job ID that can be used to get status information. */
+  core.String jobId;
+
+
+  AlignReadGroupSetsResponse();
+
+  AlignReadGroupSetsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("jobId")) {
+      jobId = _json["jobId"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (jobId != null) {
+      _json["jobId"] = jobId;
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * A call represents the determination of genotype with respect to a particular
+ * variant. It may include associated information such as quality and phasing.
+ * For example, a call might assign a probability of 0.32 to the occurrence of a
+ * SNP named rs1234 in a call set with the name NA12345.
+ */
+class Call {
+  /** The ID of the call set this variant call belongs to. */
+  core.String callSetId;
+
+  /** The name of the call set this variant call belongs to. */
+  core.String callSetName;
+
+  /**
+   * The genotype of this variant call. Each value represents either the value
+   * of the referenceBases field or a 1-based index into alternateBases. If a
+   * variant had a referenceBases value of T and an alternateBases value of
+   * ["A", "C"], and the genotype was [2, 1], that would mean the call
+   * represented the heterozygous value CA for this variant. If the genotype was
+   * instead [0, 1], the represented value would be TA. Ordering of the genotype
+   * values is important if the phaseset is present. If a genotype is not called
+   * (that is, a . is present in the GT string) -1 is returned.
+   */
+  core.List<core.int> genotype;
+
+  /**
+   * The genotype likelihoods for this variant call. Each array entry represents
+   * how likely a specific genotype is for this call. The value ordering is
+   * defined by the GL tag in the VCF spec.
+   */
+  core.List<core.double> genotypeLikelihood;
+
+  /** A map of additional variant call information. */
+  core.Map<core.String, core.List<core.String>> info;
+
+  /**
+   * If this field is present, this variant call's genotype ordering implies the
+   * phase of the bases and is consistent with any other variant calls in the
+   * same reference sequence which have the same phaseset value. When importing
+   * data from VCF, if the genotype data was phased but no phase set was
+   * specified this field will be set to *.
+   */
+  core.String phaseset;
+
+
+  Call();
+
+  Call.fromJson(core.Map _json) {
+    if (_json.containsKey("callSetId")) {
+      callSetId = _json["callSetId"];
+    }
+    if (_json.containsKey("callSetName")) {
+      callSetName = _json["callSetName"];
+    }
+    if (_json.containsKey("genotype")) {
+      genotype = _json["genotype"];
+    }
+    if (_json.containsKey("genotypeLikelihood")) {
+      genotypeLikelihood = _json["genotypeLikelihood"];
+    }
+    if (_json.containsKey("info")) {
+      info = _json["info"];
+    }
+    if (_json.containsKey("phaseset")) {
+      phaseset = _json["phaseset"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (callSetId != null) {
+      _json["callSetId"] = callSetId;
+    }
+    if (callSetName != null) {
+      _json["callSetName"] = callSetName;
+    }
+    if (genotype != null) {
+      _json["genotype"] = genotype;
+    }
+    if (genotypeLikelihood != null) {
+      _json["genotypeLikelihood"] = genotypeLikelihood;
+    }
+    if (info != null) {
+      _json["info"] = info;
+    }
+    if (phaseset != null) {
+      _json["phaseset"] = phaseset;
+    }
+    return _json;
+  }
+}
+
+
+/** The read group set call request. */
+class CallReadGroupSetsRequest {
+  /**
+   * Required. The ID of the dataset the called variants will belong to. The
+   * caller must have WRITE permissions to this dataset.
+   */
+  core.String datasetId;
+
+  /**
+   * The IDs of the read group sets which will be called. The caller must have
+   * READ permissions for these read group sets. One of readGroupSetIds or
+   * sourceUris must be provided.
+   */
+  core.List<core.String> readGroupSetIds;
+
+  /**
+   * A list of URIs pointing at BAM files in Google Cloud Storage which will be
+   * called. FASTQ files are not allowed. The caller must have READ permissions
+   * for these files. One of readGroupSetIds or sourceUris must be provided.
+   */
+  core.List<core.String> sourceUris;
+
+
+  CallReadGroupSetsRequest();
+
+  CallReadGroupSetsRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("datasetId")) {
+      datasetId = _json["datasetId"];
+    }
+    if (_json.containsKey("readGroupSetIds")) {
+      readGroupSetIds = _json["readGroupSetIds"];
+    }
+    if (_json.containsKey("sourceUris")) {
+      sourceUris = _json["sourceUris"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (datasetId != null) {
+      _json["datasetId"] = datasetId;
+    }
+    if (readGroupSetIds != null) {
+      _json["readGroupSetIds"] = readGroupSetIds;
+    }
+    if (sourceUris != null) {
+      _json["sourceUris"] = sourceUris;
+    }
+    return _json;
+  }
+}
+
+
+/** The read group set call response. */
+class CallReadGroupSetsResponse {
+  /** A job ID that can be used to get status information. */
+  core.String jobId;
+
+
+  CallReadGroupSetsResponse();
+
+  CallReadGroupSetsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("jobId")) {
+      jobId = _json["jobId"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (jobId != null) {
+      _json["jobId"] = jobId;
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * A call set is a collection of variant calls, typically for one sample. It
+ * belongs to a variant set.
+ */
+class CallSet {
+  /** The date this call set was created in milliseconds from the epoch. */
+  core.String created;
+
+  /** The Google generated ID of the call set, immutable. */
+  core.String id;
+
+  /** A map of additional call set information. */
+  core.Map<core.String, core.List<core.String>> info;
+
+  /** The call set name. */
+  core.String name;
+
+  /** The sample ID this call set corresponds to. */
+  core.String sampleId;
+
+  /** The IDs of the variant sets this call set belongs to. */
+  core.List<core.String> variantSetIds;
+
+
+  CallSet();
+
+  CallSet.fromJson(core.Map _json) {
+    if (_json.containsKey("created")) {
+      created = _json["created"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("info")) {
+      info = _json["info"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("sampleId")) {
+      sampleId = _json["sampleId"];
+    }
+    if (_json.containsKey("variantSetIds")) {
+      variantSetIds = _json["variantSetIds"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (created != null) {
+      _json["created"] = created;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (info != null) {
+      _json["info"] = info;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (sampleId != null) {
+      _json["sampleId"] = sampleId;
+    }
+    if (variantSetIds != null) {
+      _json["variantSetIds"] = variantSetIds;
+    }
+    return _json;
+  }
+}
+
+
+/** A single CIGAR operation. */
+class CigarUnit {
+  /**
+   * Not documented yet.
+   * Possible string values are:
+   * - "ALIGNMENT_MATCH"
+   * - "CLIP_HARD"
+   * - "CLIP_SOFT"
+   * - "DELETE"
+   * - "INSERT"
+   * - "PAD"
+   * - "SEQUENCE_MATCH"
+   * - "SEQUENCE_MISMATCH"
+   * - "SKIP"
+   */
+  core.String operation;
+
+  /** The number of bases that the operation runs for. Required. */
+  core.String operationLength;
+
+  /**
+   * referenceSequence is only used at mismatches (SEQUENCE_MISMATCH) and
+   * deletions (DELETE). Filling this field replaces SAM's MD tag. If the
+   * relevant information is not available, this field is unset.
+   */
+  core.String referenceSequence;
+
+
+  CigarUnit();
+
+  CigarUnit.fromJson(core.Map _json) {
+    if (_json.containsKey("operation")) {
+      operation = _json["operation"];
+    }
+    if (_json.containsKey("operationLength")) {
+      operationLength = _json["operationLength"];
+    }
+    if (_json.containsKey("referenceSequence")) {
+      referenceSequence = _json["referenceSequence"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (operation != null) {
+      _json["operation"] = operation;
+    }
+    if (operationLength != null) {
+      _json["operationLength"] = operationLength;
+    }
+    if (referenceSequence != null) {
+      _json["referenceSequence"] = referenceSequence;
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * A bucket over which read coverage has been precomputed. A bucket corresponds
+ * to a specific range of the reference sequence.
+ */
+class CoverageBucket {
+  /**
+   * The average number of reads which are aligned to each individual reference
+   * base in this bucket.
+   */
+  core.double meanCoverage;
+
+  /** The genomic coordinate range spanned by this bucket. */
+  Range range;
+
+
+  CoverageBucket();
+
+  CoverageBucket.fromJson(core.Map _json) {
+    if (_json.containsKey("meanCoverage")) {
+      meanCoverage = _json["meanCoverage"];
+    }
+    if (_json.containsKey("range")) {
+      range = new Range.fromJson(_json["range"]);
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (meanCoverage != null) {
+      _json["meanCoverage"] = meanCoverage;
+    }
+    if (range != null) {
+      _json["range"] = (range).toJson();
+    }
+    return _json;
+  }
+}
+
+
+/** A Dataset is a collection of genomic data. */
+class Dataset {
+  /** The Google generated ID of the dataset, immutable. */
+  core.String id;
+
+  /**
+   * Flag indicating whether or not a dataset is publicly viewable. If a dataset
+   * is not public, it inherits viewing permissions from its project.
+   */
+  core.bool isPublic;
+
+  /** The dataset name. */
+  core.String name;
+
+  /**
+   * The Google Developers Console project number that this dataset belongs to.
+   */
+  core.String projectNumber;
+
+
+  Dataset();
+
+  Dataset.fromJson(core.Map _json) {
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("isPublic")) {
+      isPublic = _json["isPublic"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("projectNumber")) {
+      projectNumber = _json["projectNumber"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (isPublic != null) {
+      _json["isPublic"] = isPublic;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (projectNumber != null) {
+      _json["projectNumber"] = projectNumber;
+    }
+    return _json;
+  }
+}
+
+
+/** The job creation request. */
+class ExperimentalCreateJobRequest {
+  /**
+   * Specifies whether or not to run the alignment pipeline. Either align or
+   * callVariants must be set.
+   */
+  core.bool align;
+
+  /**
+   * Specifies whether or not to run the variant calling pipeline. Either align
+   * or callVariants must be set.
+   */
+  core.bool callVariants;
+
+  /**
+   * Specifies where to copy the results of certain pipelines. This should be in
+   * the form of gs://bucket/path.
+   */
+  core.String gcsOutputPath;
+
+  /**
+   * A list of Google Cloud Storage URIs of paired end .fastq files to operate
+   * upon. If specified, this represents the second file of each paired .fastq
+   * file. The first file of each pair should be specified in sourceUris.
+   */
+  core.List<core.String> pairedSourceUris;
+
+  /**
+   * Required. The Google Cloud Project ID with which to associate the request.
+   */
+  core.String projectNumber;
+
+  /**
+   * A list of Google Cloud Storage URIs of data files to operate upon. These
+   * can be .bam, interleaved .fastq, or paired .fastq. If specifying paired
+   * .fastq files, the first of each pair of files should be listed here, and
+   * the second of each pair should be listed in pairedSourceUris.
+   */
+  core.List<core.String> sourceUris;
+
+
+  ExperimentalCreateJobRequest();
+
+  ExperimentalCreateJobRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("align")) {
+      align = _json["align"];
+    }
+    if (_json.containsKey("callVariants")) {
+      callVariants = _json["callVariants"];
+    }
+    if (_json.containsKey("gcsOutputPath")) {
+      gcsOutputPath = _json["gcsOutputPath"];
+    }
+    if (_json.containsKey("pairedSourceUris")) {
+      pairedSourceUris = _json["pairedSourceUris"];
+    }
+    if (_json.containsKey("projectNumber")) {
+      projectNumber = _json["projectNumber"];
+    }
+    if (_json.containsKey("sourceUris")) {
+      sourceUris = _json["sourceUris"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (align != null) {
+      _json["align"] = align;
+    }
+    if (callVariants != null) {
+      _json["callVariants"] = callVariants;
+    }
+    if (gcsOutputPath != null) {
+      _json["gcsOutputPath"] = gcsOutputPath;
+    }
+    if (pairedSourceUris != null) {
+      _json["pairedSourceUris"] = pairedSourceUris;
+    }
+    if (projectNumber != null) {
+      _json["projectNumber"] = projectNumber;
+    }
+    if (sourceUris != null) {
+      _json["sourceUris"] = sourceUris;
+    }
+    return _json;
+  }
+}
+
+
+/** The job creation response. */
+class ExperimentalCreateJobResponse {
+  /** A job ID that can be used to get status information. */
+  core.String jobId;
+
+
+  ExperimentalCreateJobResponse();
+
+  ExperimentalCreateJobResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("jobId")) {
+      jobId = _json["jobId"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (jobId != null) {
+      _json["jobId"] = jobId;
+    }
+    return _json;
+  }
+}
+
+
+/** The read group set export request. */
+class ExportReadGroupSetsRequest {
+  /**
+   * A Google Cloud Storage URI where the exported BAM file will be created. The
+   * currently authenticated user must have write access to the new file
+   * location. An error will be returned if the URI already contains data.
+   */
+  core.String exportUri;
+
+  /** The Google Developers Console project number that owns this export. */
+  core.String projectNumber;
+
+  /** The IDs of the read group sets to export. */
+  core.List<core.String> readGroupSetIds;
+
+  /**
+   * The reference names to export. If this is not specified, all reference
+   * sequences, including unmapped reads, are exported. Use * to export only
+   * unmapped reads.
+   */
+  core.List<core.String> referenceNames;
+
+
+  ExportReadGroupSetsRequest();
+
+  ExportReadGroupSetsRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("exportUri")) {
+      exportUri = _json["exportUri"];
+    }
+    if (_json.containsKey("projectNumber")) {
+      projectNumber = _json["projectNumber"];
+    }
+    if (_json.containsKey("readGroupSetIds")) {
+      readGroupSetIds = _json["readGroupSetIds"];
+    }
+    if (_json.containsKey("referenceNames")) {
+      referenceNames = _json["referenceNames"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (exportUri != null) {
+      _json["exportUri"] = exportUri;
+    }
+    if (projectNumber != null) {
+      _json["projectNumber"] = projectNumber;
+    }
+    if (readGroupSetIds != null) {
+      _json["readGroupSetIds"] = readGroupSetIds;
+    }
+    if (referenceNames != null) {
+      _json["referenceNames"] = referenceNames;
+    }
+    return _json;
+  }
+}
+
+
+/** The read group set export response. */
+class ExportReadGroupSetsResponse {
+  /** A job ID that can be used to get status information. */
+  core.String jobId;
+
+
+  ExportReadGroupSetsResponse();
+
+  ExportReadGroupSetsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("jobId")) {
+      jobId = _json["jobId"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (jobId != null) {
+      _json["jobId"] = jobId;
+    }
+    return _json;
+  }
+}
+
+
+/** The variant data export request. */
+class ExportVariantSetRequest {
+  /**
+   * The BigQuery dataset to export data to. Note that this is distinct from the
+   * Genomics concept of "dataset".
+   */
+  core.String bigqueryDataset;
+
+  /**
+   * The BigQuery table to export data to. If the table doesn't exist, it will
+   * be created. If it already exists, it will be overwritten.
+   */
+  core.String bigqueryTable;
+
+  /**
+   * If provided, only variant call information from the specified call sets
+   * will be exported. By default all variant calls are exported.
+   */
+  core.List<core.String> callSetIds;
+
+  /**
+   * The format for the exported data.
+   * Possible string values are:
+   * - "BIGQUERY"
+   */
+  core.String format;
+
+  /**
+   * The Google Cloud project number that owns the destination BigQuery dataset.
+   * The caller must have WRITE access to this project. This project will also
+   * own the resulting export job.
+   */
+  core.String projectNumber;
+
+
+  ExportVariantSetRequest();
+
+  ExportVariantSetRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("bigqueryDataset")) {
+      bigqueryDataset = _json["bigqueryDataset"];
+    }
+    if (_json.containsKey("bigqueryTable")) {
+      bigqueryTable = _json["bigqueryTable"];
+    }
+    if (_json.containsKey("callSetIds")) {
+      callSetIds = _json["callSetIds"];
+    }
+    if (_json.containsKey("format")) {
+      format = _json["format"];
+    }
+    if (_json.containsKey("projectNumber")) {
+      projectNumber = _json["projectNumber"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (bigqueryDataset != null) {
+      _json["bigqueryDataset"] = bigqueryDataset;
+    }
+    if (bigqueryTable != null) {
+      _json["bigqueryTable"] = bigqueryTable;
+    }
+    if (callSetIds != null) {
+      _json["callSetIds"] = callSetIds;
+    }
+    if (format != null) {
+      _json["format"] = format;
+    }
+    if (projectNumber != null) {
+      _json["projectNumber"] = projectNumber;
+    }
+    return _json;
+  }
+}
+
+
+/** The variant data export response. */
+class ExportVariantSetResponse {
+  /** A job ID that can be used to get status information. */
+  core.String jobId;
+
+
+  ExportVariantSetResponse();
+
+  ExportVariantSetResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("jobId")) {
+      jobId = _json["jobId"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (jobId != null) {
+      _json["jobId"] = jobId;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class FastqMetadata {
+  /** Optionally specifies the library name for alignment from FASTQ. */
+  core.String libraryName;
+
+  /**
+   * Optionally specifies the platform name for alignment from FASTQ. For
+   * example: CAPILLARY, LS454, ILLUMINA, SOLID, HELICOS, IONTORRENT, PACBIO.
+   */
+  core.String platformName;
+
+  /**
+   * Optionally specifies the platform unit for alignment from FASTQ. For
+   * example: flowcell-barcode.lane for Illumina or slide for SOLID.
+   */
+  core.String platformUnit;
+
+  /** Optionally specifies the read group name for alignment from FASTQ. */
+  core.String readGroupName;
+
+  /** Optionally specifies the sample name for alignment from FASTQ. */
+  core.String sampleName;
+
+
+  FastqMetadata();
+
+  FastqMetadata.fromJson(core.Map _json) {
+    if (_json.containsKey("libraryName")) {
+      libraryName = _json["libraryName"];
+    }
+    if (_json.containsKey("platformName")) {
+      platformName = _json["platformName"];
+    }
+    if (_json.containsKey("platformUnit")) {
+      platformUnit = _json["platformUnit"];
+    }
+    if (_json.containsKey("readGroupName")) {
+      readGroupName = _json["readGroupName"];
+    }
+    if (_json.containsKey("sampleName")) {
+      sampleName = _json["sampleName"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (libraryName != null) {
+      _json["libraryName"] = libraryName;
+    }
+    if (platformName != null) {
+      _json["platformName"] = platformName;
+    }
+    if (platformUnit != null) {
+      _json["platformUnit"] = platformUnit;
+    }
+    if (readGroupName != null) {
+      _json["readGroupName"] = readGroupName;
+    }
+    if (sampleName != null) {
+      _json["sampleName"] = sampleName;
+    }
+    return _json;
+  }
+}
+
+
+/** The read group set import request. */
+class ImportReadGroupSetsRequest {
+  /**
+   * Required. The ID of the dataset these read group sets will belong to. The
+   * caller must have WRITE permissions to this dataset.
+   */
+  core.String datasetId;
+
+  /**
+   * The reference set to which the imported read group sets are aligned to, if
+   * any. The reference names of this reference set must be a superset of those
+   * found in the imported file headers. If no reference set id is provided, a
+   * best effort is made to associate with a matching reference set.
+   */
+  core.String referenceSetId;
+
+  /** A list of URIs pointing at BAM files in Google Cloud Storage. */
+  core.List<core.String> sourceUris;
+
+
+  ImportReadGroupSetsRequest();
+
+  ImportReadGroupSetsRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("datasetId")) {
+      datasetId = _json["datasetId"];
+    }
+    if (_json.containsKey("referenceSetId")) {
+      referenceSetId = _json["referenceSetId"];
+    }
+    if (_json.containsKey("sourceUris")) {
+      sourceUris = _json["sourceUris"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (datasetId != null) {
+      _json["datasetId"] = datasetId;
+    }
+    if (referenceSetId != null) {
+      _json["referenceSetId"] = referenceSetId;
+    }
+    if (sourceUris != null) {
+      _json["sourceUris"] = sourceUris;
+    }
+    return _json;
+  }
+}
+
+
+/** The read group set import response. */
+class ImportReadGroupSetsResponse {
+  /** A job ID that can be used to get status information. */
+  core.String jobId;
+
+
+  ImportReadGroupSetsResponse();
+
+  ImportReadGroupSetsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("jobId")) {
+      jobId = _json["jobId"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (jobId != null) {
+      _json["jobId"] = jobId;
+    }
+    return _json;
+  }
+}
+
+
+/** The variant data import request. */
+class ImportVariantsRequest {
+  /**
+   * The format of the variant data being imported.
+   * Possible string values are:
+   * - "COMPLETE_GENOMICS"
+   * - "VCF"
+   */
+  core.String format;
+
+  /**
+   * A list of URIs pointing at VCF files in Google Cloud Storage. See the VCF
+   * Specification for more details on the input format.
+   */
+  core.List<core.String> sourceUris;
+
+
+  ImportVariantsRequest();
+
+  ImportVariantsRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("format")) {
+      format = _json["format"];
+    }
+    if (_json.containsKey("sourceUris")) {
+      sourceUris = _json["sourceUris"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (format != null) {
+      _json["format"] = format;
+    }
+    if (sourceUris != null) {
+      _json["sourceUris"] = sourceUris;
+    }
+    return _json;
+  }
+}
+
+
+/** The variant data import response. */
+class ImportVariantsResponse {
+  /** A job ID that can be used to get status information. */
+  core.String jobId;
+
+
+  ImportVariantsResponse();
+
+  ImportVariantsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("jobId")) {
+      jobId = _json["jobId"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (jobId != null) {
+      _json["jobId"] = jobId;
+    }
+    return _json;
+  }
+}
+
+
+/** Describes an interleaved FASTQ file source for alignment. */
+class InterleavedFastqSource {
+  /**
+   * Optionally specifies the metadata to be associated with the final aligned
+   * read group set.
+   */
+  FastqMetadata metadata;
+
+  /**
+   * A list of URIs pointing at interleaved FASTQ files in Google Cloud Storage
+   * which will be aligned. The caller must have READ permissions for these
+   * files.
+   */
+  core.List<core.String> sourceUris;
+
+
+  InterleavedFastqSource();
+
+  InterleavedFastqSource.fromJson(core.Map _json) {
+    if (_json.containsKey("metadata")) {
+      metadata = new FastqMetadata.fromJson(_json["metadata"]);
+    }
+    if (_json.containsKey("sourceUris")) {
+      sourceUris = _json["sourceUris"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (metadata != null) {
+      _json["metadata"] = (metadata).toJson();
+    }
+    if (sourceUris != null) {
+      _json["sourceUris"] = sourceUris;
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * A Job represents an ongoing process that can be monitored for status
+ * information.
+ */
+class Job {
+  /** The date this job was created, in milliseconds from the epoch. */
+  core.String created;
+
+  /** A more detailed description of this job's current status. */
+  core.String detailedStatus;
+
+  /** Any errors that occurred during processing. */
+  core.List<core.String> errors;
+
+  /** The job ID. */
+  core.String id;
+
+  /**
+   * If this Job represents an import, this field will contain the IDs of the
+   * objects that were successfully imported.
+   */
+  core.List<core.String> importedIds;
+
+  /**
+   * The Google Developers Console project number to which this job belongs.
+   */
+  core.String projectNumber;
+
+  /** A summarized representation of the original service request. */
+  JobRequest request;
+
+  /**
+   * The status of this job.
+   * Possible string values are:
+   * - "CANCELED"
+   * - "FAILURE"
+   * - "NEW"
+   * - "PENDING"
+   * - "RUNNING"
+   * - "SUCCESS"
+   * - "UNKNOWN_STATUS"
+   */
+  core.String status;
+
+  /** Any warnings that occurred during processing. */
+  core.List<core.String> warnings;
+
+
+  Job();
+
+  Job.fromJson(core.Map _json) {
+    if (_json.containsKey("created")) {
+      created = _json["created"];
+    }
+    if (_json.containsKey("detailedStatus")) {
+      detailedStatus = _json["detailedStatus"];
+    }
+    if (_json.containsKey("errors")) {
+      errors = _json["errors"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("importedIds")) {
+      importedIds = _json["importedIds"];
+    }
+    if (_json.containsKey("projectNumber")) {
+      projectNumber = _json["projectNumber"];
+    }
+    if (_json.containsKey("request")) {
+      request = new JobRequest.fromJson(_json["request"]);
+    }
+    if (_json.containsKey("status")) {
+      status = _json["status"];
+    }
+    if (_json.containsKey("warnings")) {
+      warnings = _json["warnings"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (created != null) {
+      _json["created"] = created;
+    }
+    if (detailedStatus != null) {
+      _json["detailedStatus"] = detailedStatus;
+    }
+    if (errors != null) {
+      _json["errors"] = errors;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (importedIds != null) {
+      _json["importedIds"] = importedIds;
+    }
+    if (projectNumber != null) {
+      _json["projectNumber"] = projectNumber;
+    }
+    if (request != null) {
+      _json["request"] = (request).toJson();
+    }
+    if (status != null) {
+      _json["status"] = status;
+    }
+    if (warnings != null) {
+      _json["warnings"] = warnings;
+    }
+    return _json;
+  }
+}
+
+
+/** A summary representation of the service request that spawned the job. */
+class JobRequest {
+  /**
+   * The data destination of the request, for example, a Google BigQuery Table
+   * or Dataset ID.
+   */
+  core.List<core.String> destination;
+
+  /**
+   * The data source of the request, for example, a Google Cloud Storage object
+   * path or Readset ID.
+   */
+  core.List<core.String> source;
+
+  /**
+   * The original request type.
+   * Possible string values are:
+   * - "ALIGN_READSETS"
+   * - "CALL_READSETS"
+   * - "EXPERIMENTAL_CREATE_JOB"
+   * - "EXPORT_READSETS"
+   * - "EXPORT_VARIANTS"
+   * - "IMPORT_READSETS"
+   * - "IMPORT_VARIANTS"
+   * - "UNKNOWN_TYPE"
+   */
+  core.String type;
+
+
+  JobRequest();
+
+  JobRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("destination")) {
+      destination = _json["destination"];
+    }
+    if (_json.containsKey("source")) {
+      source = _json["source"];
+    }
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (destination != null) {
+      _json["destination"] = destination;
+    }
+    if (source != null) {
+      _json["source"] = source;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * A linear alignment can be represented by one CIGAR string. Describes the
+ * mapped position and local alignment of the read to the reference.
+ */
+class LinearAlignment {
+  /**
+   * Represents the local alignment of this sequence (alignment matches, indels,
+   * etc) against the reference.
+   */
+  core.List<CigarUnit> cigar;
+
+  /**
+   * The mapping quality of this alignment. Represents how likely the read maps
+   * to this position as opposed to other locations.
+   */
+  core.int mappingQuality;
+
+  /** The position of this alignment. */
+  Position position;
+
+
+  LinearAlignment();
+
+  LinearAlignment.fromJson(core.Map _json) {
+    if (_json.containsKey("cigar")) {
+      cigar = _json["cigar"].map((value) => new CigarUnit.fromJson(value)).toList();
+    }
+    if (_json.containsKey("mappingQuality")) {
+      mappingQuality = _json["mappingQuality"];
+    }
+    if (_json.containsKey("position")) {
+      position = new Position.fromJson(_json["position"]);
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (cigar != null) {
+      _json["cigar"] = cigar.map((value) => (value).toJson()).toList();
+    }
+    if (mappingQuality != null) {
+      _json["mappingQuality"] = mappingQuality;
+    }
+    if (position != null) {
+      _json["position"] = (position).toJson();
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class ListBasesResponse {
+  /**
+   * The continuation token, which is used to page through large result sets.
+   * Provide this value in a subsequent request to return the next page of
+   * results. This field will be empty if there aren't any additional results.
+   */
+  core.String nextPageToken;
+
+  /**
+   * The offset position (0-based) of the given sequence from the start of this
+   * Reference. This value will differ for each page in a paginated request.
+   */
+  core.String offset;
+
+  /** A substring of the bases that make up this reference. */
+  core.String sequence;
+
+
+  ListBasesResponse();
+
+  ListBasesResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("offset")) {
+      offset = _json["offset"];
+    }
+    if (_json.containsKey("sequence")) {
+      sequence = _json["sequence"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (offset != null) {
+      _json["offset"] = offset;
+    }
+    if (sequence != null) {
+      _json["sequence"] = sequence;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class ListCoverageBucketsResponse {
+  /**
+   * The length of each coverage bucket in base pairs. Note that buckets at the
+   * end of a reference sequence may be shorter. This value is omitted if the
+   * bucket width is infinity (the default behaviour, with no range or
+   * targetBucketWidth).
+   */
+  core.String bucketWidth;
+
+  /**
+   * The coverage buckets. The list of buckets is sparse; a bucket with 0
+   * overlapping reads is not returned. A bucket never crosses more than one
+   * reference sequence. Each bucket has width bucketWidth, unless its end is
+   * the end of the reference sequence.
+   */
+  core.List<CoverageBucket> coverageBuckets;
+
+  /**
+   * The continuation token, which is used to page through large result sets.
+   * Provide this value in a subsequent request to return the next page of
+   * results. This field will be empty if there aren't any additional results.
+   */
+  core.String nextPageToken;
+
+
+  ListCoverageBucketsResponse();
+
+  ListCoverageBucketsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("bucketWidth")) {
+      bucketWidth = _json["bucketWidth"];
+    }
+    if (_json.containsKey("coverageBuckets")) {
+      coverageBuckets = _json["coverageBuckets"].map((value) => new CoverageBucket.fromJson(value)).toList();
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (bucketWidth != null) {
+      _json["bucketWidth"] = bucketWidth;
+    }
+    if (coverageBuckets != null) {
+      _json["coverageBuckets"] = coverageBuckets.map((value) => (value).toJson()).toList();
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+
+/** The dataset list response. */
+class ListDatasetsResponse {
+  /** The list of matching Datasets. */
+  core.List<Dataset> datasets;
+
+  /**
+   * The continuation token, which is used to page through large result sets.
+   * Provide this value in a subsequent request to return the next page of
+   * results. This field will be empty if there aren't any additional results.
+   */
+  core.String nextPageToken;
+
+
+  ListDatasetsResponse();
+
+  ListDatasetsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("datasets")) {
+      datasets = _json["datasets"].map((value) => new Dataset.fromJson(value)).toList();
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (datasets != null) {
+      _json["datasets"] = datasets.map((value) => (value).toJson()).toList();
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class MergeVariantsRequest {
+  /** The variants to be merged with existing variants. */
+  core.List<Variant> variants;
+
+
+  MergeVariantsRequest();
+
+  MergeVariantsRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("variants")) {
+      variants = _json["variants"].map((value) => new Variant.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (variants != null) {
+      _json["variants"] = variants.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * Metadata describes a single piece of variant call metadata. These data
+ * include a top level key and either a single value string (value) or a list of
+ * key-value pairs (info.) Value and info are mutually exclusive.
+ */
+class Metadata {
+  /** A textual description of this metadata. */
+  core.String description;
+
+  /**
+   * User-provided ID field, not enforced by this API. Two or more pieces of
+   * structured metadata with identical id and key fields are considered
+   * equivalent.
+   */
+  core.String id;
+
+  /** Remaining structured metadata key-value pairs. */
+  core.Map<core.String, core.List<core.String>> info;
+
+  /** The top-level key. */
+  core.String key;
+
+  /**
+   * The number of values that can be included in a field described by this
+   * metadata.
+   */
+  core.String number;
+
+  /**
+   * The type of data. Possible types include: Integer, Float, Flag, Character,
+   * and String.
+   * Possible string values are:
+   * - "CHARACTER"
+   * - "FLAG"
+   * - "FLOAT"
+   * - "INTEGER"
+   * - "STRING"
+   * - "UNKNOWN_TYPE"
+   */
+  core.String type;
+
+  /** The value field for simple metadata */
+  core.String value;
+
+
+  Metadata();
+
+  Metadata.fromJson(core.Map _json) {
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("info")) {
+      info = _json["info"];
+    }
+    if (_json.containsKey("key")) {
+      key = _json["key"];
+    }
+    if (_json.containsKey("number")) {
+      number = _json["number"];
+    }
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+    if (_json.containsKey("value")) {
+      value = _json["value"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (description != null) {
+      _json["description"] = description;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (info != null) {
+      _json["info"] = info;
+    }
+    if (key != null) {
+      _json["key"] = key;
+    }
+    if (number != null) {
+      _json["number"] = number;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    if (value != null) {
+      _json["value"] = value;
+    }
+    return _json;
+  }
+}
+
+
+/** Describes a paired-end FASTQ file source for alignment. */
+class PairedFastqSource {
+  /**
+   * A list of URIs pointing at paired end FASTQ files in Google Cloud Storage
+   * which will be aligned. The first of each paired file should be specified
+   * here, in an order that matches the second of each paired file specified in
+   * secondSourceUris. For example: firstSourceUris: [file1_1.fq, file2_1.fq],
+   * secondSourceUris: [file1_2.fq, file2_2.fq]. The caller must have READ
+   * permissions for these files.
+   */
+  core.List<core.String> firstSourceUris;
+
+  /**
+   * Optionally specifies the metadata to be associated with the final aligned
+   * read group set.
+   */
+  FastqMetadata metadata;
+
+  /**
+   * A list of URIs pointing at paired end FASTQ files in Google Cloud Storage
+   * which will be aligned. The second of each paired file should be specified
+   * here, in an order that matches the first of each paired file specified in
+   * firstSourceUris. For example: firstSourceUris: [file1_1.fq, file2_1.fq],
+   * secondSourceUris: [file1_2.fq, file2_2.fq]. The caller must have READ
+   * permissions for these files.
+   */
+  core.List<core.String> secondSourceUris;
+
+
+  PairedFastqSource();
+
+  PairedFastqSource.fromJson(core.Map _json) {
+    if (_json.containsKey("firstSourceUris")) {
+      firstSourceUris = _json["firstSourceUris"];
+    }
+    if (_json.containsKey("metadata")) {
+      metadata = new FastqMetadata.fromJson(_json["metadata"]);
+    }
+    if (_json.containsKey("secondSourceUris")) {
+      secondSourceUris = _json["secondSourceUris"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (firstSourceUris != null) {
+      _json["firstSourceUris"] = firstSourceUris;
+    }
+    if (metadata != null) {
+      _json["metadata"] = (metadata).toJson();
+    }
+    if (secondSourceUris != null) {
+      _json["secondSourceUris"] = secondSourceUris;
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * An abstraction for referring to a genomic position, in relation to some
+ * already known reference. For now, represents a genomic position as a
+ * reference name, a base number on that reference (0-based), and a
+ * determination of forward or reverse strand.
+ */
+class Position {
+  /**
+   * The 0-based offset from the start of the forward strand for that reference.
+   */
+  core.String position;
+
+  /** The name of the reference in whatever reference set is being used. */
+  core.String referenceName;
+
+  /**
+   * Whether this position is on the reverse strand, as opposed to the forward
+   * strand.
+   */
+  core.bool reverseStrand;
+
+
+  Position();
+
+  Position.fromJson(core.Map _json) {
+    if (_json.containsKey("position")) {
+      position = _json["position"];
+    }
+    if (_json.containsKey("referenceName")) {
+      referenceName = _json["referenceName"];
+    }
+    if (_json.containsKey("reverseStrand")) {
+      reverseStrand = _json["reverseStrand"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (position != null) {
+      _json["position"] = position;
+    }
+    if (referenceName != null) {
+      _json["referenceName"] = referenceName;
+    }
+    if (reverseStrand != null) {
+      _json["reverseStrand"] = reverseStrand;
+    }
+    return _json;
+  }
+}
+
+
+/** A 0-based half-open genomic coordinate range over a reference sequence. */
+class Range {
+  /**
+   * The end position of the range on the reference, 0-based exclusive. If
+   * specified, referenceName must also be specified.
+   */
+  core.String end;
+
+  /** The reference sequence name, for example chr1, 1, or chrX. */
+  core.String referenceName;
+
+  /**
+   * The start position of the range on the reference, 0-based inclusive. If
+   * specified, referenceName must also be specified.
+   */
+  core.String start;
+
+
+  Range();
+
+  Range.fromJson(core.Map _json) {
+    if (_json.containsKey("end")) {
+      end = _json["end"];
+    }
+    if (_json.containsKey("referenceName")) {
+      referenceName = _json["referenceName"];
+    }
+    if (_json.containsKey("start")) {
+      start = _json["start"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (end != null) {
+      _json["end"] = end;
+    }
+    if (referenceName != null) {
+      _json["referenceName"] = referenceName;
+    }
+    if (start != null) {
+      _json["start"] = start;
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * A read alignment describes a linear alignment of a string of DNA to a
+ * reference sequence, in addition to metadata about the fragment (the molecule
+ * of DNA sequenced) and the read (the bases which were read by the sequencer).
+ * A read is equivalent to a line in a SAM file. A read belongs to exactly one
+ * read group and exactly one read group set.
+ */
+class Read {
+  /**
+   * The quality of the read sequence contained in this alignment record.
+   * alignedSequence and alignedQuality may be shorter than the full read
+   * sequence and quality. This will occur if the alignment is part of a
+   * chimeric alignment, or if the read was trimmed. When this occurs, the CIGAR
+   * for this read will begin/end with a hard clip operator that will indicate
+   * the length of the excised sequence.
+   */
+  core.List<core.int> alignedQuality;
+
+  /**
+   * The bases of the read sequence contained in this alignment record.
+   * alignedSequence and alignedQuality may be shorter than the full read
+   * sequence and quality. This will occur if the alignment is part of a
+   * chimeric alignment, or if the read was trimmed. When this occurs, the CIGAR
+   * for this read will begin/end with a hard clip operator that will indicate
+   * the length of the excised sequence.
+   */
+  core.String alignedSequence;
+
+  /**
+   * The linear alignment for this alignment record. This field will be null if
+   * the read is unmapped.
+   */
+  LinearAlignment alignment;
+
+  /** The fragment is a PCR or optical duplicate (SAM flag 0x400) */
+  core.bool duplicateFragment;
+
+  /** SAM flag 0x200 */
+  core.bool failedVendorQualityChecks;
+
+  /** The observed length of the fragment, equivalent to TLEN in SAM. */
+  core.int fragmentLength;
+
+  /** The fragment name. Equivalent to QNAME (query template name) in SAM. */
+  core.String fragmentName;
+
+  /**
+   * The unique ID for this read. This is a generated unique ID, not to be
+   * confused with fragmentName.
+   */
+  core.String id;
+
+  /** A map of additional read alignment information. */
+  core.Map<core.String, core.List<core.String>> info;
+
+  /**
+   * The mapping of the primary alignment of the (readNumber+1)%numberReads read
+   * in the fragment. It replaces mate position and mate strand in SAM.
+   */
+  Position nextMatePosition;
+
+  /** The number of reads in the fragment (extension to SAM flag 0x1). */
+  core.int numberReads;
+
+  /**
+   * The orientation and the distance between reads from the fragment are
+   * consistent with the sequencing protocol (extension to SAM flag 0x2)
+   */
+  core.bool properPlacement;
+
+  /**
+   * The ID of the read group this read belongs to. (Every read must belong to
+   * exactly one read group.)
+   */
+  core.String readGroupId;
+
+  /**
+   * The ID of the read group set this read belongs to. (Every read must belong
+   * to exactly one read group set.)
+   */
+  core.String readGroupSetId;
+
+  /**
+   * The read number in sequencing. 0-based and less than numberReads. This
+   * field replaces SAM flag 0x40 and 0x80.
+   */
+  core.int readNumber;
+
+  /**
+   * Whether this alignment is secondary. Equivalent to SAM flag 0x100. A
+   * secondary alignment represents an alternative to the primary alignment for
+   * this read. Aligners may return secondary alignments if a read can map
+   * ambiguously to multiple coordinates in the genome. By convention, each read
+   * has one and only one alignment where both secondaryAlignment and
+   * supplementaryAlignment are false.
+   */
+  core.bool secondaryAlignment;
+
+  /**
+   * Whether this alignment is supplementary. Equivalent to SAM flag 0x800.
+   * Supplementary alignments are used in the representation of a chimeric
+   * alignment. In a chimeric alignment, a read is split into multiple linear
+   * alignments that map to different reference contigs. The first linear
+   * alignment in the read will be designated as the representative alignment;
+   * the remaining linear alignments will be designated as supplementary
+   * alignments. These alignments may have different mapping quality scores. In
+   * each linear alignment in a chimeric alignment, the read will be hard
+   * clipped. The alignedSequence and alignedQuality fields in the alignment
+   * record will only represent the bases for its respective linear alignment.
+   */
+  core.bool supplementaryAlignment;
+
+
+  Read();
+
+  Read.fromJson(core.Map _json) {
+    if (_json.containsKey("alignedQuality")) {
+      alignedQuality = _json["alignedQuality"];
+    }
+    if (_json.containsKey("alignedSequence")) {
+      alignedSequence = _json["alignedSequence"];
+    }
+    if (_json.containsKey("alignment")) {
+      alignment = new LinearAlignment.fromJson(_json["alignment"]);
+    }
+    if (_json.containsKey("duplicateFragment")) {
+      duplicateFragment = _json["duplicateFragment"];
+    }
+    if (_json.containsKey("failedVendorQualityChecks")) {
+      failedVendorQualityChecks = _json["failedVendorQualityChecks"];
+    }
+    if (_json.containsKey("fragmentLength")) {
+      fragmentLength = _json["fragmentLength"];
+    }
+    if (_json.containsKey("fragmentName")) {
+      fragmentName = _json["fragmentName"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("info")) {
+      info = _json["info"];
+    }
+    if (_json.containsKey("nextMatePosition")) {
+      nextMatePosition = new Position.fromJson(_json["nextMatePosition"]);
+    }
+    if (_json.containsKey("numberReads")) {
+      numberReads = _json["numberReads"];
+    }
+    if (_json.containsKey("properPlacement")) {
+      properPlacement = _json["properPlacement"];
+    }
+    if (_json.containsKey("readGroupId")) {
+      readGroupId = _json["readGroupId"];
+    }
+    if (_json.containsKey("readGroupSetId")) {
+      readGroupSetId = _json["readGroupSetId"];
+    }
+    if (_json.containsKey("readNumber")) {
+      readNumber = _json["readNumber"];
+    }
+    if (_json.containsKey("secondaryAlignment")) {
+      secondaryAlignment = _json["secondaryAlignment"];
+    }
+    if (_json.containsKey("supplementaryAlignment")) {
+      supplementaryAlignment = _json["supplementaryAlignment"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (alignedQuality != null) {
+      _json["alignedQuality"] = alignedQuality;
+    }
+    if (alignedSequence != null) {
+      _json["alignedSequence"] = alignedSequence;
+    }
+    if (alignment != null) {
+      _json["alignment"] = (alignment).toJson();
+    }
+    if (duplicateFragment != null) {
+      _json["duplicateFragment"] = duplicateFragment;
+    }
+    if (failedVendorQualityChecks != null) {
+      _json["failedVendorQualityChecks"] = failedVendorQualityChecks;
+    }
+    if (fragmentLength != null) {
+      _json["fragmentLength"] = fragmentLength;
+    }
+    if (fragmentName != null) {
+      _json["fragmentName"] = fragmentName;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (info != null) {
+      _json["info"] = info;
+    }
+    if (nextMatePosition != null) {
+      _json["nextMatePosition"] = (nextMatePosition).toJson();
+    }
+    if (numberReads != null) {
+      _json["numberReads"] = numberReads;
+    }
+    if (properPlacement != null) {
+      _json["properPlacement"] = properPlacement;
+    }
+    if (readGroupId != null) {
+      _json["readGroupId"] = readGroupId;
+    }
+    if (readGroupSetId != null) {
+      _json["readGroupSetId"] = readGroupSetId;
+    }
+    if (readNumber != null) {
+      _json["readNumber"] = readNumber;
+    }
+    if (secondaryAlignment != null) {
+      _json["secondaryAlignment"] = secondaryAlignment;
+    }
+    if (supplementaryAlignment != null) {
+      _json["supplementaryAlignment"] = supplementaryAlignment;
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * A read group is all the data that's processed the same way by the sequencer.
+ */
+class ReadGroup {
+  /** The ID of the dataset this read group belongs to. */
+  core.String datasetId;
+
+  /** A free-form text description of this read group. */
+  core.String description;
+
+  /** The experiment used to generate this read group. */
+  ReadGroupExperiment experiment;
+
+  /**
+   * The generated unique read group ID. Note: This is different than the @RG ID
+   * field in the SAM spec. For that value, see the name field.
+   */
+  core.String id;
+
+  /** A map of additional read group information. */
+  core.Map<core.String, core.List<core.String>> info;
+
+  /**
+   * The read group name. This corresponds to the @RG ID field in the SAM spec.
+   */
+  core.String name;
+
+  /**
+   * The predicted insert size of this read group. The insert size is the length
+   * the sequenced DNA fragment from end-to-end, not including the adapters.
+   */
+  core.int predictedInsertSize;
+
+  /**
+   * The programs used to generate this read group. Programs are always
+   * identical for all read groups within a read group set. For this reason,
+   * only the first read group in a returned set will have this field populated.
+   */
+  core.List<ReadGroupProgram> programs;
+
+  /**
+   * The reference set the reads in this read group are aligned to. Required if
+   * there are any read alignments.
+   */
+  core.String referenceSetId;
+
+  /**
+   * The sample this read group's data was generated from. Note: This is not an
+   * actual ID within this repository, but rather an identifier for a sample
+   * which may be meaningful to some external system.
+   */
+  core.String sampleId;
+
+
+  ReadGroup();
+
+  ReadGroup.fromJson(core.Map _json) {
+    if (_json.containsKey("datasetId")) {
+      datasetId = _json["datasetId"];
+    }
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("experiment")) {
+      experiment = new ReadGroupExperiment.fromJson(_json["experiment"]);
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("info")) {
+      info = _json["info"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("predictedInsertSize")) {
+      predictedInsertSize = _json["predictedInsertSize"];
+    }
+    if (_json.containsKey("programs")) {
+      programs = _json["programs"].map((value) => new ReadGroupProgram.fromJson(value)).toList();
+    }
+    if (_json.containsKey("referenceSetId")) {
+      referenceSetId = _json["referenceSetId"];
+    }
+    if (_json.containsKey("sampleId")) {
+      sampleId = _json["sampleId"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (datasetId != null) {
+      _json["datasetId"] = datasetId;
+    }
+    if (description != null) {
+      _json["description"] = description;
+    }
+    if (experiment != null) {
+      _json["experiment"] = (experiment).toJson();
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (info != null) {
+      _json["info"] = info;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (predictedInsertSize != null) {
+      _json["predictedInsertSize"] = predictedInsertSize;
+    }
+    if (programs != null) {
+      _json["programs"] = programs.map((value) => (value).toJson()).toList();
+    }
+    if (referenceSetId != null) {
+      _json["referenceSetId"] = referenceSetId;
+    }
+    if (sampleId != null) {
+      _json["sampleId"] = sampleId;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class ReadGroupExperiment {
+  /**
+   * The instrument model used as part of this experiment. This maps to
+   * sequencing technology in BAM.
+   */
+  core.String instrumentModel;
+
+  /**
+   * The library used as part of this experiment. Note: This is not an actual ID
+   * within this repository, but rather an identifier for a library which may be
+   * meaningful to some external system.
+   */
+  core.String libraryId;
+
+  /**
+   * The platform unit used as part of this experiment e.g.
+   * flowcell-barcode.lane for Illumina or slide for SOLiD. Corresponds to the
+   */
+  core.String platformUnit;
+
+  /** The sequencing center used as part of this experiment. */
+  core.String sequencingCenter;
+
+
+  ReadGroupExperiment();
+
+  ReadGroupExperiment.fromJson(core.Map _json) {
+    if (_json.containsKey("instrumentModel")) {
+      instrumentModel = _json["instrumentModel"];
+    }
+    if (_json.containsKey("libraryId")) {
+      libraryId = _json["libraryId"];
+    }
+    if (_json.containsKey("platformUnit")) {
+      platformUnit = _json["platformUnit"];
+    }
+    if (_json.containsKey("sequencingCenter")) {
+      sequencingCenter = _json["sequencingCenter"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (instrumentModel != null) {
+      _json["instrumentModel"] = instrumentModel;
+    }
+    if (libraryId != null) {
+      _json["libraryId"] = libraryId;
+    }
+    if (platformUnit != null) {
+      _json["platformUnit"] = platformUnit;
+    }
+    if (sequencingCenter != null) {
+      _json["sequencingCenter"] = sequencingCenter;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class ReadGroupProgram {
+  /** The command line used to run this program. */
+  core.String commandLine;
+
+  /**
+   * The user specified locally unique ID of the program. Used along with
+   * prevProgramId to define an ordering between programs.
+   */
+  core.String id;
+
+  /** The name of the program. */
+  core.String name;
+
+  /** The ID of the program run before this one. */
+  core.String prevProgramId;
+
+  /** The version of the program run. */
+  core.String version;
+
+
+  ReadGroupProgram();
+
+  ReadGroupProgram.fromJson(core.Map _json) {
+    if (_json.containsKey("commandLine")) {
+      commandLine = _json["commandLine"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("prevProgramId")) {
+      prevProgramId = _json["prevProgramId"];
+    }
+    if (_json.containsKey("version")) {
+      version = _json["version"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (commandLine != null) {
+      _json["commandLine"] = commandLine;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (prevProgramId != null) {
+      _json["prevProgramId"] = prevProgramId;
+    }
+    if (version != null) {
+      _json["version"] = version;
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * A read group set is a logical collection of read groups, which are
+ * collections of reads produced by a sequencer. A read group set typically
+ * models reads corresponding to one sample, sequenced one way, and aligned one
+ * way.
+ * - A read group set belongs to one dataset.
+ * - A read group belongs to one read group set.
+ * - A read belongs to one read group.
+ */
+class ReadGroupSet {
+  /** The dataset ID. */
+  core.String datasetId;
+
+  /**
+   * The filename of the original source file for this read group set, if any.
+   */
+  core.String filename;
+
+  /** The read group set ID. */
+  core.String id;
+
+  /**
+   * The read group set name. By default this will be initialized to the sample
+   * name of the sequenced data contained in this set.
+   */
+  core.String name;
+
+  /**
+   * The read groups in this set. There are typically 1-10 read groups in a read
+   * group set.
+   */
+  core.List<ReadGroup> readGroups;
+
+  /** The reference set the reads in this read group set are aligned to. */
+  core.String referenceSetId;
+
+
+  ReadGroupSet();
+
+  ReadGroupSet.fromJson(core.Map _json) {
+    if (_json.containsKey("datasetId")) {
+      datasetId = _json["datasetId"];
+    }
+    if (_json.containsKey("filename")) {
+      filename = _json["filename"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("readGroups")) {
+      readGroups = _json["readGroups"].map((value) => new ReadGroup.fromJson(value)).toList();
+    }
+    if (_json.containsKey("referenceSetId")) {
+      referenceSetId = _json["referenceSetId"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (datasetId != null) {
+      _json["datasetId"] = datasetId;
+    }
+    if (filename != null) {
+      _json["filename"] = filename;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (readGroups != null) {
+      _json["readGroups"] = readGroups.map((value) => (value).toJson()).toList();
+    }
+    if (referenceSetId != null) {
+      _json["referenceSetId"] = referenceSetId;
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * A reference is a canonical assembled DNA sequence, intended to act as a
+ * reference coordinate space for other genomic annotations. A single reference
+ * might represent the human chromosome 1 or mitochandrial DNA, for instance. A
+ * reference belongs to one or more reference sets.
+ */
+class Reference {
+  /** The Google generated immutable ID of the reference. */
+  core.String id;
+
+  /** The length of this reference's sequence. */
+  core.String length;
+
+  /**
+   * MD5 of the upper-case sequence excluding all whitespace characters (this is
+   * equivalent to SQ:M5 in SAM). This value is represented in lower case
+   * hexadecimal format.
+   */
+  core.String md5checksum;
+
+  /** The name of this reference, for example 22. */
+  core.String name;
+
+  /**
+   * ID from http://www.ncbi.nlm.nih.gov/taxonomy (e.g. 9606->human) if not
+   * specified by the containing reference set.
+   */
+  core.int ncbiTaxonId;
+
+  /**
+   * All known corresponding accession IDs in INSDC (GenBank/ENA/DDBJ) ideally
+   * with a version number, for example GCF_000001405.26.
+   */
+  core.List<core.String> sourceAccessions;
+
+  /**
+   * The URI from which the sequence was obtained. Specifies a FASTA format
+   * file/string with one name, sequence pair.
+   */
+  core.String sourceURI;
+
+
+  Reference();
+
+  Reference.fromJson(core.Map _json) {
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("length")) {
+      length = _json["length"];
+    }
+    if (_json.containsKey("md5checksum")) {
+      md5checksum = _json["md5checksum"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("ncbiTaxonId")) {
+      ncbiTaxonId = _json["ncbiTaxonId"];
+    }
+    if (_json.containsKey("sourceAccessions")) {
+      sourceAccessions = _json["sourceAccessions"];
+    }
+    if (_json.containsKey("sourceURI")) {
+      sourceURI = _json["sourceURI"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (length != null) {
+      _json["length"] = length;
+    }
+    if (md5checksum != null) {
+      _json["md5checksum"] = md5checksum;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (ncbiTaxonId != null) {
+      _json["ncbiTaxonId"] = ncbiTaxonId;
+    }
+    if (sourceAccessions != null) {
+      _json["sourceAccessions"] = sourceAccessions;
+    }
+    if (sourceURI != null) {
+      _json["sourceURI"] = sourceURI;
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * ReferenceBound records an upper bound for the starting coordinate of variants
+ * in a particular reference.
+ */
+class ReferenceBound {
+  /** The reference the bound is associate with. */
+  core.String referenceName;
+
+  /**
+   * An upper bound (inclusive) on the starting coordinate of any variant in the
+   * reference sequence.
+   */
+  core.String upperBound;
+
+
+  ReferenceBound();
+
+  ReferenceBound.fromJson(core.Map _json) {
+    if (_json.containsKey("referenceName")) {
+      referenceName = _json["referenceName"];
+    }
+    if (_json.containsKey("upperBound")) {
+      upperBound = _json["upperBound"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (referenceName != null) {
+      _json["referenceName"] = referenceName;
+    }
+    if (upperBound != null) {
+      _json["upperBound"] = upperBound;
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * A reference set is a set of references which typically comprise a reference
+ * assembly for a species, such as GRCh38 which is representative of the human
+ * genome. A reference set defines a common coordinate space for comparing
+ * reference-aligned experimental data. A reference set contains 1 or more
+ * references.
+ */
+class ReferenceSet {
+  /** Public id of this reference set, such as GRCh37. */
+  core.String assemblyId;
+
+  /** Optional free text description of this reference set. */
+  core.String description;
+
+  /** The Google generated immutable ID of the reference set. */
+  core.String id;
+
+  /**
+   * Order-independent MD5 checksum which identifies this reference set. The
+   * checksum is computed by sorting all lower case hexidecimal string
+   * reference.md5checksum (for all reference in this set) in ascending
+   * lexicographic order, concatenating, and taking the MD5 of that value. The
+   * resulting value is represented in lower case hexadecimal format.
+   */
+  core.String md5checksum;
+
+  /**
+   * ID from http://www.ncbi.nlm.nih.gov/taxonomy (e.g. 9606->human) indicating
+   * the species which this assembly is intended to model. Note that contained
+   * references may specify a different ncbiTaxonId, as assemblies may contain
+   * reference sequences which do not belong to the modeled species, e.g. EBV in
+   * a human reference genome.
+   */
+  core.int ncbiTaxonId;
+
+  /**
+   * The IDs of the reference objects that are part of this set.
+   * Reference.md5checksum must be unique within this set.
+   */
+  core.List<core.String> referenceIds;
+
+  /**
+   * All known corresponding accession IDs in INSDC (GenBank/ENA/DDBJ) ideally
+   * with a version number, for example NC_000001.11.
+   */
+  core.List<core.String> sourceAccessions;
+
+  /** The URI from which the references were obtained. */
+  core.String sourceURI;
+
+
+  ReferenceSet();
+
+  ReferenceSet.fromJson(core.Map _json) {
+    if (_json.containsKey("assemblyId")) {
+      assemblyId = _json["assemblyId"];
+    }
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("md5checksum")) {
+      md5checksum = _json["md5checksum"];
+    }
+    if (_json.containsKey("ncbiTaxonId")) {
+      ncbiTaxonId = _json["ncbiTaxonId"];
+    }
+    if (_json.containsKey("referenceIds")) {
+      referenceIds = _json["referenceIds"];
+    }
+    if (_json.containsKey("sourceAccessions")) {
+      sourceAccessions = _json["sourceAccessions"];
+    }
+    if (_json.containsKey("sourceURI")) {
+      sourceURI = _json["sourceURI"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (assemblyId != null) {
+      _json["assemblyId"] = assemblyId;
+    }
+    if (description != null) {
+      _json["description"] = description;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (md5checksum != null) {
+      _json["md5checksum"] = md5checksum;
+    }
+    if (ncbiTaxonId != null) {
+      _json["ncbiTaxonId"] = ncbiTaxonId;
+    }
+    if (referenceIds != null) {
+      _json["referenceIds"] = referenceIds;
+    }
+    if (sourceAccessions != null) {
+      _json["sourceAccessions"] = sourceAccessions;
+    }
+    if (sourceURI != null) {
+      _json["sourceURI"] = sourceURI;
+    }
+    return _json;
+  }
+}
+
+
+/** The call set search request. */
+class SearchCallSetsRequest {
+  /**
+   * Only return call sets for which a substring of the name matches this
+   * string.
+   */
+  core.String name;
+
+  /** The maximum number of call sets to return. */
+  core.int pageSize;
+
+  /**
+   * The continuation token, which is used to page through large result sets. To
+   * get the next page of results, set this parameter to the value of
+   * nextPageToken from the previous response.
+   */
+  core.String pageToken;
+
+  /**
+   * Restrict the query to call sets within the given variant sets. At least one
+   * ID must be provided.
+   */
+  core.List<core.String> variantSetIds;
+
+
+  SearchCallSetsRequest();
+
+  SearchCallSetsRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("pageSize")) {
+      pageSize = _json["pageSize"];
+    }
+    if (_json.containsKey("pageToken")) {
+      pageToken = _json["pageToken"];
+    }
+    if (_json.containsKey("variantSetIds")) {
+      variantSetIds = _json["variantSetIds"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (pageSize != null) {
+      _json["pageSize"] = pageSize;
+    }
+    if (pageToken != null) {
+      _json["pageToken"] = pageToken;
+    }
+    if (variantSetIds != null) {
+      _json["variantSetIds"] = variantSetIds;
+    }
+    return _json;
+  }
+}
+
+
+/** The call set search response. */
+class SearchCallSetsResponse {
+  /** The list of matching call sets. */
+  core.List<CallSet> callSets;
+
+  /**
+   * The continuation token, which is used to page through large result sets.
+   * Provide this value in a subsequent request to return the next page of
+   * results. This field will be empty if there aren't any additional results.
+   */
+  core.String nextPageToken;
+
+
+  SearchCallSetsResponse();
+
+  SearchCallSetsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("callSets")) {
+      callSets = _json["callSets"].map((value) => new CallSet.fromJson(value)).toList();
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (callSets != null) {
+      _json["callSets"] = callSets.map((value) => (value).toJson()).toList();
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+
+/** The jobs search request. */
+class SearchJobsRequest {
+  /**
+   * If specified, only jobs created on or after this date, given in
+   * milliseconds since Unix epoch, will be returned.
+   */
+  core.String createdAfter;
+
+  /**
+   * If specified, only jobs created prior to this date, given in milliseconds
+   * since Unix epoch, will be returned.
+   */
+  core.String createdBefore;
+
+  /**
+   * Specifies the number of results to return in a single page. Defaults to
+   * 128. The maximum value is 256.
+   */
+  core.int pageSize;
+
+  /**
+   * The continuation token which is used to page through large result sets. To
+   * get the next page of results, set this parameter to the value of the
+   * nextPageToken from the previous response.
+   */
+  core.String pageToken;
+
+  /** Required. Only return jobs which belong to this Google Developers */
+  core.String projectNumber;
+
+  /** Only return jobs which have a matching status. */
+  core.List<core.String> status;
+
+
+  SearchJobsRequest();
+
+  SearchJobsRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("createdAfter")) {
+      createdAfter = _json["createdAfter"];
+    }
+    if (_json.containsKey("createdBefore")) {
+      createdBefore = _json["createdBefore"];
+    }
+    if (_json.containsKey("pageSize")) {
+      pageSize = _json["pageSize"];
+    }
+    if (_json.containsKey("pageToken")) {
+      pageToken = _json["pageToken"];
+    }
+    if (_json.containsKey("projectNumber")) {
+      projectNumber = _json["projectNumber"];
+    }
+    if (_json.containsKey("status")) {
+      status = _json["status"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (createdAfter != null) {
+      _json["createdAfter"] = createdAfter;
+    }
+    if (createdBefore != null) {
+      _json["createdBefore"] = createdBefore;
+    }
+    if (pageSize != null) {
+      _json["pageSize"] = pageSize;
+    }
+    if (pageToken != null) {
+      _json["pageToken"] = pageToken;
+    }
+    if (projectNumber != null) {
+      _json["projectNumber"] = projectNumber;
+    }
+    if (status != null) {
+      _json["status"] = status;
+    }
+    return _json;
+  }
+}
+
+
+/** The job search response. */
+class SearchJobsResponse {
+  /** The list of jobs results, ordered newest to oldest. */
+  core.List<Job> jobs;
+
+  /**
+   * The continuation token which is used to page through large result sets.
+   * Provide this value is a subsequent request to return the next page of
+   * results. This field will be empty if there are no more results.
+   */
+  core.String nextPageToken;
+
+
+  SearchJobsResponse();
+
+  SearchJobsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("jobs")) {
+      jobs = _json["jobs"].map((value) => new Job.fromJson(value)).toList();
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (jobs != null) {
+      _json["jobs"] = jobs.map((value) => (value).toJson()).toList();
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+
+/** The read group set search request. */
+class SearchReadGroupSetsRequest {
+  /**
+   * Restricts this query to read group sets within the given datasets. At least
+   * one ID must be provided.
+   */
+  core.List<core.String> datasetIds;
+
+  /**
+   * Only return read group sets for which a substring of the name matches this
+   * string.
+   */
+  core.String name;
+
+  /**
+   * Specifies number of results to return in a single page. If unspecified, it
+   * will default to 128. The maximum value is 1024.
+   */
+  core.int pageSize;
+
+  /**
+   * The continuation token, which is used to page through large result sets. To
+   * get the next page of results, set this parameter to the value of
+   * nextPageToken from the previous response.
+   */
+  core.String pageToken;
+
+
+  SearchReadGroupSetsRequest();
+
+  SearchReadGroupSetsRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("datasetIds")) {
+      datasetIds = _json["datasetIds"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("pageSize")) {
+      pageSize = _json["pageSize"];
+    }
+    if (_json.containsKey("pageToken")) {
+      pageToken = _json["pageToken"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (datasetIds != null) {
+      _json["datasetIds"] = datasetIds;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (pageSize != null) {
+      _json["pageSize"] = pageSize;
+    }
+    if (pageToken != null) {
+      _json["pageToken"] = pageToken;
+    }
+    return _json;
+  }
+}
+
+
+/** The read group set search response. */
+class SearchReadGroupSetsResponse {
+  /**
+   * The continuation token, which is used to page through large result sets.
+   * Provide this value in a subsequent request to return the next page of
+   * results. This field will be empty if there aren't any additional results.
+   */
+  core.String nextPageToken;
+
+  /** The list of matching read group sets. */
+  core.List<ReadGroupSet> readGroupSets;
+
+
+  SearchReadGroupSetsResponse();
+
+  SearchReadGroupSetsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("readGroupSets")) {
+      readGroupSets = _json["readGroupSets"].map((value) => new ReadGroupSet.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (readGroupSets != null) {
+      _json["readGroupSets"] = readGroupSets.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/** The read search request. */
+class SearchReadsRequest {
+  /**
+   * The end position of the range on the reference, 0-based exclusive. If
+   * specified, referenceName must also be specified.
+   */
+  core.String end;
+
+  /**
+   * Specifies number of results to return in a single page. If unspecified, it
+   * will default to 256. The maximum value is 2048.
+   */
+  core.int pageSize;
+
+  /**
+   * The continuation token, which is used to page through large result sets. To
+   * get the next page of results, set this parameter to the value of
+   * nextPageToken from the previous response.
+   */
+  core.String pageToken;
+
+  /**
+   * The IDs of the read groups within which to search for reads. All specified
+   * read groups must belong to the same read group sets. Must specify one of
+   * readGroupSetIds or readGroupIds.
+   */
+  core.List<core.String> readGroupIds;
+
+  /**
+   * The IDs of the read groups sets within which to search for reads. All
+   * specified read group sets must be aligned against a common set of reference
+   * sequences; this defines the genomic coordinates for the query. Must specify
+   * one of readGroupSetIds or readGroupIds.
+   */
+  core.List<core.String> readGroupSetIds;
+
+  /**
+   * The reference sequence name, for example chr1, 1, or chrX. If set to *,
+   * only unmapped reads are returned.
+   */
+  core.String referenceName;
+
+  /**
+   * The start position of the range on the reference, 0-based inclusive. If
+   * specified, referenceName must also be specified.
+   */
+  core.String start;
+
+
+  SearchReadsRequest();
+
+  SearchReadsRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("end")) {
+      end = _json["end"];
+    }
+    if (_json.containsKey("pageSize")) {
+      pageSize = _json["pageSize"];
+    }
+    if (_json.containsKey("pageToken")) {
+      pageToken = _json["pageToken"];
+    }
+    if (_json.containsKey("readGroupIds")) {
+      readGroupIds = _json["readGroupIds"];
+    }
+    if (_json.containsKey("readGroupSetIds")) {
+      readGroupSetIds = _json["readGroupSetIds"];
+    }
+    if (_json.containsKey("referenceName")) {
+      referenceName = _json["referenceName"];
+    }
+    if (_json.containsKey("start")) {
+      start = _json["start"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (end != null) {
+      _json["end"] = end;
+    }
+    if (pageSize != null) {
+      _json["pageSize"] = pageSize;
+    }
+    if (pageToken != null) {
+      _json["pageToken"] = pageToken;
+    }
+    if (readGroupIds != null) {
+      _json["readGroupIds"] = readGroupIds;
+    }
+    if (readGroupSetIds != null) {
+      _json["readGroupSetIds"] = readGroupSetIds;
+    }
+    if (referenceName != null) {
+      _json["referenceName"] = referenceName;
+    }
+    if (start != null) {
+      _json["start"] = start;
+    }
+    return _json;
+  }
+}
+
+
+/** The read search response. */
+class SearchReadsResponse {
+  /**
+   * The list of matching alignments sorted by mapped genomic coordinate, if
+   * any, ascending in position within the same reference. Unmapped reads, which
+   * have no position, are returned last and are further sorted in ascending
+   * lexicographic order by fragment name.
+   */
+  core.List<Read> alignments;
+
+  /**
+   * The continuation token, which is used to page through large result sets.
+   * Provide this value in a subsequent request to return the next page of
+   * results. This field will be empty if there aren't any additional results.
+   */
+  core.String nextPageToken;
+
+
+  SearchReadsResponse();
+
+  SearchReadsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("alignments")) {
+      alignments = _json["alignments"].map((value) => new Read.fromJson(value)).toList();
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (alignments != null) {
+      _json["alignments"] = alignments.map((value) => (value).toJson()).toList();
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class SearchReferenceSetsRequest {
+  /**
+   * If present, return references for which the accession matches any of these
+   * strings. Best to give a version number, for example GCF_000001405.26. If
+   * only the main accession number is given then all records with that main
+   * accession will be returned, whichever version. Note that different versions
+   * will have different sequences.
+   */
+  core.List<core.String> accessions;
+
+  /**
+   * If present, return references for which the md5checksum matches. See
+   * ReferenceSet.md5checksum for details.
+   */
+  core.List<core.String> md5checksums;
+
+  /** Specifies the maximum number of results to return in a single page. */
+  core.int pageSize;
+
+  /**
+   * The continuation token, which is used to page through large result sets. To
+   * get the next page of results, set this parameter to the value of
+   * nextPageToken from the previous response.
+   */
+  core.String pageToken;
+
+
+  SearchReferenceSetsRequest();
+
+  SearchReferenceSetsRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("accessions")) {
+      accessions = _json["accessions"];
+    }
+    if (_json.containsKey("md5checksums")) {
+      md5checksums = _json["md5checksums"];
+    }
+    if (_json.containsKey("pageSize")) {
+      pageSize = _json["pageSize"];
+    }
+    if (_json.containsKey("pageToken")) {
+      pageToken = _json["pageToken"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (accessions != null) {
+      _json["accessions"] = accessions;
+    }
+    if (md5checksums != null) {
+      _json["md5checksums"] = md5checksums;
+    }
+    if (pageSize != null) {
+      _json["pageSize"] = pageSize;
+    }
+    if (pageToken != null) {
+      _json["pageToken"] = pageToken;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class SearchReferenceSetsResponse {
+  /**
+   * The continuation token, which is used to page through large result sets.
+   * Provide this value in a subsequent request to return the next page of
+   * results. This field will be empty if there aren't any additional results.
+   */
+  core.String nextPageToken;
+
+  /** The matching references sets. */
+  core.List<ReferenceSet> referenceSets;
+
+
+  SearchReferenceSetsResponse();
+
+  SearchReferenceSetsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("referenceSets")) {
+      referenceSets = _json["referenceSets"].map((value) => new ReferenceSet.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (referenceSets != null) {
+      _json["referenceSets"] = referenceSets.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class SearchReferencesRequest {
+  /**
+   * If present, return references for which the accession matches this string.
+   * Best to give a version number, for example GCF_000001405.26. If only the
+   * main accession number is given then all records with that main accession
+   * will be returned, whichever version. Note that different versions will have
+   * different sequences.
+   */
+  core.List<core.String> accessions;
+
+  /**
+   * If present, return references for which the md5checksum matches. See
+   * Reference.md5checksum for construction details.
+   */
+  core.List<core.String> md5checksums;
+
+  /** Specifies the maximum number of results to return in a single page. */
+  core.int pageSize;
+
+  /**
+   * The continuation token, which is used to page through large result sets. To
+   * get the next page of results, set this parameter to the value of
+   * nextPageToken from the previous response.
+   */
+  core.String pageToken;
+
+  /** If present, return only references which belong to this reference set. */
+  core.String referenceSetId;
+
+
+  SearchReferencesRequest();
+
+  SearchReferencesRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("accessions")) {
+      accessions = _json["accessions"];
+    }
+    if (_json.containsKey("md5checksums")) {
+      md5checksums = _json["md5checksums"];
+    }
+    if (_json.containsKey("pageSize")) {
+      pageSize = _json["pageSize"];
+    }
+    if (_json.containsKey("pageToken")) {
+      pageToken = _json["pageToken"];
+    }
+    if (_json.containsKey("referenceSetId")) {
+      referenceSetId = _json["referenceSetId"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (accessions != null) {
+      _json["accessions"] = accessions;
+    }
+    if (md5checksums != null) {
+      _json["md5checksums"] = md5checksums;
+    }
+    if (pageSize != null) {
+      _json["pageSize"] = pageSize;
+    }
+    if (pageToken != null) {
+      _json["pageToken"] = pageToken;
+    }
+    if (referenceSetId != null) {
+      _json["referenceSetId"] = referenceSetId;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class SearchReferencesResponse {
+  /**
+   * The continuation token, which is used to page through large result sets.
+   * Provide this value in a subsequent request to return the next page of
+   * results. This field will be empty if there aren't any additional results.
+   */
+  core.String nextPageToken;
+
+  /** The matching references. */
+  core.List<Reference> references;
+
+
+  SearchReferencesResponse();
+
+  SearchReferencesResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("references")) {
+      references = _json["references"].map((value) => new Reference.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (references != null) {
+      _json["references"] = references.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/** The search variant sets request. */
+class SearchVariantSetsRequest {
+  /**
+   * Exactly one dataset ID must be provided here. Only variant sets which
+   * belong to this dataset will be returned.
+   */
+  core.List<core.String> datasetIds;
+
+  /** The maximum number of variant sets to return in a request. */
+  core.int pageSize;
+
+  /**
+   * The continuation token, which is used to page through large result sets. To
+   * get the next page of results, set this parameter to the value of
+   * nextPageToken from the previous response.
+   */
+  core.String pageToken;
+
+
+  SearchVariantSetsRequest();
+
+  SearchVariantSetsRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("datasetIds")) {
+      datasetIds = _json["datasetIds"];
+    }
+    if (_json.containsKey("pageSize")) {
+      pageSize = _json["pageSize"];
+    }
+    if (_json.containsKey("pageToken")) {
+      pageToken = _json["pageToken"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (datasetIds != null) {
+      _json["datasetIds"] = datasetIds;
+    }
+    if (pageSize != null) {
+      _json["pageSize"] = pageSize;
+    }
+    if (pageToken != null) {
+      _json["pageToken"] = pageToken;
+    }
+    return _json;
+  }
+}
+
+
+/** The search variant sets response. */
+class SearchVariantSetsResponse {
+  /**
+   * The continuation token, which is used to page through large result sets.
+   * Provide this value in a subsequent request to return the next page of
+   * results. This field will be empty if there aren't any additional results.
+   */
+  core.String nextPageToken;
+
+  /** The variant sets belonging to the requested dataset. */
+  core.List<VariantSet> variantSets;
+
+
+  SearchVariantSetsResponse();
+
+  SearchVariantSetsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("variantSets")) {
+      variantSets = _json["variantSets"].map((value) => new VariantSet.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (variantSets != null) {
+      _json["variantSets"] = variantSets.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/** The variant search request. */
+class SearchVariantsRequest {
+  /**
+   * Only return variant calls which belong to call sets with these ids. Leaving
+   * this blank returns all variant calls. If a variant has no calls belonging
+   * to any of these call sets, it won't be returned at all. Currently, variants
+   * with no calls from any call set will never be returned.
+   */
+  core.List<core.String> callSetIds;
+
+  /**
+   * Required. The end of the window (0-based, exclusive) for which overlapping
+   * variants should be returned.
+   */
+  core.String end;
+
+  /**
+   * The maximum number of calls to return. However, at least one variant will
+   * always be returned, even if it has more calls than this limit.
+   */
+  core.int maxCalls;
+
+  /** The maximum number of variants to return. */
+  core.int pageSize;
+
+  /**
+   * The continuation token, which is used to page through large result sets. To
+   * get the next page of results, set this parameter to the value of
+   * nextPageToken from the previous response.
+   */
+  core.String pageToken;
+
+  /** Required. Only return variants in this reference sequence. */
+  core.String referenceName;
+
+  /**
+   * Required. The beginning of the window (0-based, inclusive) for which
+   * overlapping variants should be returned.
+   */
+  core.String start;
+
+  /** Only return variants which have exactly this name. */
+  core.String variantName;
+
+  /**
+   * Exactly one variant set ID must be provided. Only variants from this
+   * variant set will be returned.
+   */
+  core.List<core.String> variantSetIds;
+
+
+  SearchVariantsRequest();
+
+  SearchVariantsRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("callSetIds")) {
+      callSetIds = _json["callSetIds"];
+    }
+    if (_json.containsKey("end")) {
+      end = _json["end"];
+    }
+    if (_json.containsKey("maxCalls")) {
+      maxCalls = _json["maxCalls"];
+    }
+    if (_json.containsKey("pageSize")) {
+      pageSize = _json["pageSize"];
+    }
+    if (_json.containsKey("pageToken")) {
+      pageToken = _json["pageToken"];
+    }
+    if (_json.containsKey("referenceName")) {
+      referenceName = _json["referenceName"];
+    }
+    if (_json.containsKey("start")) {
+      start = _json["start"];
+    }
+    if (_json.containsKey("variantName")) {
+      variantName = _json["variantName"];
+    }
+    if (_json.containsKey("variantSetIds")) {
+      variantSetIds = _json["variantSetIds"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (callSetIds != null) {
+      _json["callSetIds"] = callSetIds;
+    }
+    if (end != null) {
+      _json["end"] = end;
+    }
+    if (maxCalls != null) {
+      _json["maxCalls"] = maxCalls;
+    }
+    if (pageSize != null) {
+      _json["pageSize"] = pageSize;
+    }
+    if (pageToken != null) {
+      _json["pageToken"] = pageToken;
+    }
+    if (referenceName != null) {
+      _json["referenceName"] = referenceName;
+    }
+    if (start != null) {
+      _json["start"] = start;
+    }
+    if (variantName != null) {
+      _json["variantName"] = variantName;
+    }
+    if (variantSetIds != null) {
+      _json["variantSetIds"] = variantSetIds;
+    }
+    return _json;
+  }
+}
+
+
+/** The variant search response. */
+class SearchVariantsResponse {
+  /**
+   * The continuation token, which is used to page through large result sets.
+   * Provide this value in a subsequent request to return the next page of
+   * results. This field will be empty if there aren't any additional results.
+   */
+  core.String nextPageToken;
+
+  /** The list of matching Variants. */
+  core.List<Variant> variants;
+
+
+  SearchVariantsResponse();
+
+  SearchVariantsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("variants")) {
+      variants = _json["variants"].map((value) => new Variant.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (variants != null) {
+      _json["variants"] = variants.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * A variant represents a change in DNA sequence relative to a reference
+ * sequence. For example, a variant could represent a SNP or an insertion.
+ * Variants belong to a variant set. Each of the calls on a variant represent a
+ * determination of genotype with respect to that variant. For example, a call
+ * might assign probability of 0.32 to the occurrence of a SNP named rs1234 in a
+ * sample named NA12345. A call belongs to a call set, which contains related
+ * calls typically from one sample.
+ */
+class Variant {
+  /** The bases that appear instead of the reference bases. */
+  core.List<core.String> alternateBases;
+
+  /**
+   * The variant calls for this particular variant. Each one represents the
+   * determination of genotype with respect to this variant.
+   */
+  core.List<Call> calls;
+
+  /** The date this variant was created, in milliseconds from the epoch. */
+  core.String created;
+
+  /**
+   * The end position (0-based) of this variant. This corresponds to the first
+   * base after the last base in the reference allele. So, the length of the
+   * reference allele is (end - start). This is useful for variants that don't
+   * explicitly give alternate bases, for example large deletions.
+   */
+  core.String end;
+
+  /**
+   * A list of filters (normally quality filters) this variant has failed. PASS
+   * indicates this variant has passed all filters.
+   */
+  core.List<core.String> filter;
+
+  /** The Google generated ID of the variant, immutable. */
+  core.String id;
+
+  /** A map of additional variant information. */
+  core.Map<core.String, core.List<core.String>> info;
+
+  /** Names for the variant, for example a RefSNP ID. */
+  core.List<core.String> names;
+
+  /**
+   * A measure of how likely this variant is to be real. A higher value is
+   * better.
+   */
+  core.double quality;
+
+  /**
+   * The reference bases for this variant. They start at the given position.
+   */
+  core.String referenceBases;
+
+  /** The reference on which this variant occurs. (such as chr20 or X) */
+  core.String referenceName;
+
+  /**
+   * The position at which this variant occurs (0-based). This corresponds to
+   * the first base of the string of reference bases.
+   */
+  core.String start;
+
+  /** The ID of the variant set this variant belongs to. */
+  core.String variantSetId;
+
+
+  Variant();
+
+  Variant.fromJson(core.Map _json) {
+    if (_json.containsKey("alternateBases")) {
+      alternateBases = _json["alternateBases"];
+    }
+    if (_json.containsKey("calls")) {
+      calls = _json["calls"].map((value) => new Call.fromJson(value)).toList();
+    }
+    if (_json.containsKey("created")) {
+      created = _json["created"];
+    }
+    if (_json.containsKey("end")) {
+      end = _json["end"];
+    }
+    if (_json.containsKey("filter")) {
+      filter = _json["filter"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("info")) {
+      info = _json["info"];
+    }
+    if (_json.containsKey("names")) {
+      names = _json["names"];
+    }
+    if (_json.containsKey("quality")) {
+      quality = _json["quality"];
+    }
+    if (_json.containsKey("referenceBases")) {
+      referenceBases = _json["referenceBases"];
+    }
+    if (_json.containsKey("referenceName")) {
+      referenceName = _json["referenceName"];
+    }
+    if (_json.containsKey("start")) {
+      start = _json["start"];
+    }
+    if (_json.containsKey("variantSetId")) {
+      variantSetId = _json["variantSetId"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (alternateBases != null) {
+      _json["alternateBases"] = alternateBases;
+    }
+    if (calls != null) {
+      _json["calls"] = calls.map((value) => (value).toJson()).toList();
+    }
+    if (created != null) {
+      _json["created"] = created;
+    }
+    if (end != null) {
+      _json["end"] = end;
+    }
+    if (filter != null) {
+      _json["filter"] = filter;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (info != null) {
+      _json["info"] = info;
+    }
+    if (names != null) {
+      _json["names"] = names;
+    }
+    if (quality != null) {
+      _json["quality"] = quality;
+    }
+    if (referenceBases != null) {
+      _json["referenceBases"] = referenceBases;
+    }
+    if (referenceName != null) {
+      _json["referenceName"] = referenceName;
+    }
+    if (start != null) {
+      _json["start"] = start;
+    }
+    if (variantSetId != null) {
+      _json["variantSetId"] = variantSetId;
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * A variant set is a collection of call sets and variants. It contains summary
+ * statistics of those contents. A variant set belongs to a dataset.
+ */
+class VariantSet {
+  /** The dataset to which this variant set belongs. Immutable. */
+  core.String datasetId;
+
+  /** The Google-generated ID of the variant set. Immutable. */
+  core.String id;
+
+  /** The metadata associated with this variant set. */
+  core.List<Metadata> metadata;
+
+  /**
+   * A list of all references used by the variants in a variant set with
+   * associated coordinate upper bounds for each one.
+   */
+  core.List<ReferenceBound> referenceBounds;
+
+
+  VariantSet();
+
+  VariantSet.fromJson(core.Map _json) {
+    if (_json.containsKey("datasetId")) {
+      datasetId = _json["datasetId"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("metadata")) {
+      metadata = _json["metadata"].map((value) => new Metadata.fromJson(value)).toList();
+    }
+    if (_json.containsKey("referenceBounds")) {
+      referenceBounds = _json["referenceBounds"].map((value) => new ReferenceBound.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (datasetId != null) {
+      _json["datasetId"] = datasetId;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (metadata != null) {
+      _json["metadata"] = metadata.map((value) => (value).toJson()).toList();
+    }
+    if (referenceBounds != null) {
+      _json["referenceBounds"] = referenceBounds.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
diff --git a/generated/googleapis_beta/lib/pubsub/v1beta1.dart b/generated/googleapis_beta/lib/pubsub/v1beta1.dart
index c7b372f..de0d478 100644
--- a/generated/googleapis_beta/lib/pubsub/v1beta1.dart
+++ b/generated/googleapis_beta/lib/pubsub/v1beta1.dart
@@ -89,6 +89,9 @@
    * subscription already exists, returns ALREADY_EXISTS. If the corresponding
    * topic doesn't exist, returns NOT_FOUND.
    *
+   * If the name is not provided in the request, the server will assign a random
+   * name for this subscription on the same project as the topic.
+   *
    * [request] - The metadata request object.
    *
    * Request parameters:
@@ -862,7 +865,7 @@
   /** The message to publish. */
   PubsubMessage message;
 
-  /** The name of the topic for which the message is being added. */
+  /** The message in the request will be published on this topic. */
   core.String topic;
 
 
diff --git a/generated/googleapis_beta/lib/replicapool/v1beta1.dart b/generated/googleapis_beta/lib/replicapool/v1beta1.dart
deleted file mode 100644
index f0f1414..0000000
--- a/generated/googleapis_beta/lib/replicapool/v1beta1.dart
+++ /dev/null
@@ -1,1939 +0,0 @@
-library googleapis_beta.replicapool.v1beta1;
-
-import "dart:core" as core;
-import "dart:collection" as collection;
-import "dart:async" as async;
-import "dart:convert" as convert;
-
-import "package:crypto/crypto.dart" as crypto;
-import 'package:http/http.dart' as http;
-import '../src/common_internal.dart' as common_internal;
-import '../common/common.dart' as common;
-
-export '../common/common.dart' show ApiRequestError;
-export '../common/common.dart' show DetailedApiRequestError;
-
-/**
- * The Replica Pool API allows users to declaratively provision and manage
- * groups of Google Compute Engine instances based on a common template.
- */
-class ReplicapoolApi {
-  /** View and manage your data across Google Cloud Platform services */
-  static const CloudPlatformScope = "https://www.googleapis.com/auth/cloud-platform";
-
-  /**
-   * View and manage your Google Cloud Platform management resources and
-   * deployment status information
-   */
-  static const NdevCloudmanScope = "https://www.googleapis.com/auth/ndev.cloudman";
-
-  /**
-   * View your Google Cloud Platform management resources and deployment status
-   * information
-   */
-  static const NdevCloudmanReadonlyScope = "https://www.googleapis.com/auth/ndev.cloudman.readonly";
-
-  /** View and manage replica pools */
-  static const ReplicapoolScope = "https://www.googleapis.com/auth/replicapool";
-
-  /** View replica pools */
-  static const ReplicapoolReadonlyScope = "https://www.googleapis.com/auth/replicapool.readonly";
-
-
-  final common_internal.ApiRequester _requester;
-
-  PoolsResourceApi get pools => new PoolsResourceApi(_requester);
-  ReplicasResourceApi get replicas => new ReplicasResourceApi(_requester);
-
-  ReplicapoolApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "replicapool/v1beta1/projects/");
-}
-
-
-/** Not documented yet. */
-class PoolsResourceApi {
-  final common_internal.ApiRequester _requester;
-
-  PoolsResourceApi(common_internal.ApiRequester client) : 
-      _requester = client;
-
-  /**
-   * Deletes a replica pool.
-   *
-   * [request] - The metadata request object.
-   *
-   * Request parameters:
-   *
-   * [projectName] - The project ID for this replica pool.
-   *
-   * [zone] - The zone for this replica pool.
-   *
-   * [poolName] - The name of the replica pool for this request.
-   *
-   * Completes with a [common.ApiRequestError] if the API endpoint returned an
-   * error.
-   *
-   * If the used [http.Client] completes with an error when making a REST call,
-   * this method  will complete with the same error.
-   */
-  async.Future delete(PoolsDeleteRequest request, core.String projectName, core.String zone, core.String poolName) {
-    var _url = null;
-    var _queryParams = new core.Map();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = common.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (request != null) {
-      _body = convert.JSON.encode((request).toJson());
-    }
-    if (projectName == null) {
-      throw new core.ArgumentError("Parameter projectName is required.");
-    }
-    if (zone == null) {
-      throw new core.ArgumentError("Parameter zone is required.");
-    }
-    if (poolName == null) {
-      throw new core.ArgumentError("Parameter poolName is required.");
-    }
-
-    _downloadOptions = null;
-
-    _url = common_internal.Escaper.ecapeVariable('$projectName') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/pools/' + common_internal.Escaper.ecapeVariable('$poolName');
-
-    var _response = _requester.request(_url,
-                                       "POST",
-                                       body: _body,
-                                       queryParams: _queryParams,
-                                       uploadOptions: _uploadOptions,
-                                       uploadMedia: _uploadMedia,
-                                       downloadOptions: _downloadOptions);
-    return _response.then((data) => null);
-  }
-
-  /**
-   * Gets information about a single replica pool.
-   *
-   * Request parameters:
-   *
-   * [projectName] - The project ID for this replica pool.
-   *
-   * [zone] - The zone for this replica pool.
-   *
-   * [poolName] - The name of the replica pool for this request.
-   *
-   * Completes with a [Pool].
-   *
-   * Completes with a [common.ApiRequestError] if the API endpoint returned an
-   * error.
-   *
-   * If the used [http.Client] completes with an error when making a REST call,
-   * this method  will complete with the same error.
-   */
-  async.Future<Pool> get(core.String projectName, core.String zone, core.String poolName) {
-    var _url = null;
-    var _queryParams = new core.Map();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = common.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (projectName == null) {
-      throw new core.ArgumentError("Parameter projectName is required.");
-    }
-    if (zone == null) {
-      throw new core.ArgumentError("Parameter zone is required.");
-    }
-    if (poolName == null) {
-      throw new core.ArgumentError("Parameter poolName is required.");
-    }
-
-
-    _url = common_internal.Escaper.ecapeVariable('$projectName') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/pools/' + common_internal.Escaper.ecapeVariable('$poolName');
-
-    var _response = _requester.request(_url,
-                                       "GET",
-                                       body: _body,
-                                       queryParams: _queryParams,
-                                       uploadOptions: _uploadOptions,
-                                       uploadMedia: _uploadMedia,
-                                       downloadOptions: _downloadOptions);
-    return _response.then((data) => new Pool.fromJson(data));
-  }
-
-  /**
-   * Inserts a new replica pool.
-   *
-   * [request] - The metadata request object.
-   *
-   * Request parameters:
-   *
-   * [projectName] - The project ID for this replica pool.
-   *
-   * [zone] - The zone for this replica pool.
-   *
-   * Completes with a [Pool].
-   *
-   * Completes with a [common.ApiRequestError] if the API endpoint returned an
-   * error.
-   *
-   * If the used [http.Client] completes with an error when making a REST call,
-   * this method  will complete with the same error.
-   */
-  async.Future<Pool> insert(Pool request, core.String projectName, core.String zone) {
-    var _url = null;
-    var _queryParams = new core.Map();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = common.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (request != null) {
-      _body = convert.JSON.encode((request).toJson());
-    }
-    if (projectName == null) {
-      throw new core.ArgumentError("Parameter projectName is required.");
-    }
-    if (zone == null) {
-      throw new core.ArgumentError("Parameter zone is required.");
-    }
-
-
-    _url = common_internal.Escaper.ecapeVariable('$projectName') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/pools';
-
-    var _response = _requester.request(_url,
-                                       "POST",
-                                       body: _body,
-                                       queryParams: _queryParams,
-                                       uploadOptions: _uploadOptions,
-                                       uploadMedia: _uploadMedia,
-                                       downloadOptions: _downloadOptions);
-    return _response.then((data) => new Pool.fromJson(data));
-  }
-
-  /**
-   * List all replica pools.
-   *
-   * Request parameters:
-   *
-   * [projectName] - The project ID for this request.
-   *
-   * [zone] - The zone for this replica pool.
-   *
-   * [maxResults] - Maximum count of results to be returned. Acceptable values
-   * are 0 to 100, inclusive. (Default: 50)
-   * Value must be between "0" and "1000".
-   *
-   * [pageToken] - Set this to the nextPageToken value returned by a previous
-   * list request to obtain the next page of results from the previous list
-   * request.
-   *
-   * Completes with a [PoolsListResponse].
-   *
-   * Completes with a [common.ApiRequestError] if the API endpoint returned an
-   * error.
-   *
-   * If the used [http.Client] completes with an error when making a REST call,
-   * this method  will complete with the same error.
-   */
-  async.Future<PoolsListResponse> list(core.String projectName, core.String zone, {core.int maxResults, core.String pageToken}) {
-    var _url = null;
-    var _queryParams = new core.Map();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = common.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (projectName == null) {
-      throw new core.ArgumentError("Parameter projectName is required.");
-    }
-    if (zone == null) {
-      throw new core.ArgumentError("Parameter zone is required.");
-    }
-    if (maxResults != null) {
-      _queryParams["maxResults"] = ["${maxResults}"];
-    }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
-
-
-    _url = common_internal.Escaper.ecapeVariable('$projectName') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/pools';
-
-    var _response = _requester.request(_url,
-                                       "GET",
-                                       body: _body,
-                                       queryParams: _queryParams,
-                                       uploadOptions: _uploadOptions,
-                                       uploadMedia: _uploadMedia,
-                                       downloadOptions: _downloadOptions);
-    return _response.then((data) => new PoolsListResponse.fromJson(data));
-  }
-
-  /**
-   * Resize a pool. This is an asynchronous operation, and multiple overlapping
-   * resize requests can be made. Replica Pools will use the information from
-   * the last resize request.
-   *
-   * Request parameters:
-   *
-   * [projectName] - The project ID for this replica pool.
-   *
-   * [zone] - The zone for this replica pool.
-   *
-   * [poolName] - The name of the replica pool for this request.
-   *
-   * [numReplicas] - The desired number of replicas to resize to. If this number
-   * is larger than the existing number of replicas, new replicas will be added.
-   * If the number is smaller, then existing replicas will be deleted.
-   *
-   * Completes with a [Pool].
-   *
-   * Completes with a [common.ApiRequestError] if the API endpoint returned an
-   * error.
-   *
-   * If the used [http.Client] completes with an error when making a REST call,
-   * this method  will complete with the same error.
-   */
-  async.Future<Pool> resize(core.String projectName, core.String zone, core.String poolName, {core.int numReplicas}) {
-    var _url = null;
-    var _queryParams = new core.Map();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = common.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (projectName == null) {
-      throw new core.ArgumentError("Parameter projectName is required.");
-    }
-    if (zone == null) {
-      throw new core.ArgumentError("Parameter zone is required.");
-    }
-    if (poolName == null) {
-      throw new core.ArgumentError("Parameter poolName is required.");
-    }
-    if (numReplicas != null) {
-      _queryParams["numReplicas"] = ["${numReplicas}"];
-    }
-
-
-    _url = common_internal.Escaper.ecapeVariable('$projectName') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/pools/' + common_internal.Escaper.ecapeVariable('$poolName') + '/resize';
-
-    var _response = _requester.request(_url,
-                                       "POST",
-                                       body: _body,
-                                       queryParams: _queryParams,
-                                       uploadOptions: _uploadOptions,
-                                       uploadMedia: _uploadMedia,
-                                       downloadOptions: _downloadOptions);
-    return _response.then((data) => new Pool.fromJson(data));
-  }
-
-  /**
-   * Update the template used by the pool.
-   *
-   * [request] - The metadata request object.
-   *
-   * Request parameters:
-   *
-   * [projectName] - The project ID for this replica pool.
-   *
-   * [zone] - The zone for this replica pool.
-   *
-   * [poolName] - The name of the replica pool for this request.
-   *
-   * Completes with a [common.ApiRequestError] if the API endpoint returned an
-   * error.
-   *
-   * If the used [http.Client] completes with an error when making a REST call,
-   * this method  will complete with the same error.
-   */
-  async.Future updatetemplate(Template request, core.String projectName, core.String zone, core.String poolName) {
-    var _url = null;
-    var _queryParams = new core.Map();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = common.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (request != null) {
-      _body = convert.JSON.encode((request).toJson());
-    }
-    if (projectName == null) {
-      throw new core.ArgumentError("Parameter projectName is required.");
-    }
-    if (zone == null) {
-      throw new core.ArgumentError("Parameter zone is required.");
-    }
-    if (poolName == null) {
-      throw new core.ArgumentError("Parameter poolName is required.");
-    }
-
-    _downloadOptions = null;
-
-    _url = common_internal.Escaper.ecapeVariable('$projectName') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/pools/' + common_internal.Escaper.ecapeVariable('$poolName') + '/updateTemplate';
-
-    var _response = _requester.request(_url,
-                                       "POST",
-                                       body: _body,
-                                       queryParams: _queryParams,
-                                       uploadOptions: _uploadOptions,
-                                       uploadMedia: _uploadMedia,
-                                       downloadOptions: _downloadOptions);
-    return _response.then((data) => null);
-  }
-
-}
-
-
-/** Not documented yet. */
-class ReplicasResourceApi {
-  final common_internal.ApiRequester _requester;
-
-  ReplicasResourceApi(common_internal.ApiRequester client) : 
-      _requester = client;
-
-  /**
-   * Deletes a replica from the pool.
-   *
-   * [request] - The metadata request object.
-   *
-   * Request parameters:
-   *
-   * [projectName] - The project ID for this request.
-   *
-   * [zone] - The zone where the replica lives.
-   *
-   * [poolName] - The replica pool name for this request.
-   *
-   * [replicaName] - The name of the replica for this request.
-   *
-   * Completes with a [Replica].
-   *
-   * Completes with a [common.ApiRequestError] if the API endpoint returned an
-   * error.
-   *
-   * If the used [http.Client] completes with an error when making a REST call,
-   * this method  will complete with the same error.
-   */
-  async.Future<Replica> delete(ReplicasDeleteRequest request, core.String projectName, core.String zone, core.String poolName, core.String replicaName) {
-    var _url = null;
-    var _queryParams = new core.Map();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = common.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (request != null) {
-      _body = convert.JSON.encode((request).toJson());
-    }
-    if (projectName == null) {
-      throw new core.ArgumentError("Parameter projectName is required.");
-    }
-    if (zone == null) {
-      throw new core.ArgumentError("Parameter zone is required.");
-    }
-    if (poolName == null) {
-      throw new core.ArgumentError("Parameter poolName is required.");
-    }
-    if (replicaName == null) {
-      throw new core.ArgumentError("Parameter replicaName is required.");
-    }
-
-
-    _url = common_internal.Escaper.ecapeVariable('$projectName') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/pools/' + common_internal.Escaper.ecapeVariable('$poolName') + '/replicas/' + common_internal.Escaper.ecapeVariable('$replicaName');
-
-    var _response = _requester.request(_url,
-                                       "POST",
-                                       body: _body,
-                                       queryParams: _queryParams,
-                                       uploadOptions: _uploadOptions,
-                                       uploadMedia: _uploadMedia,
-                                       downloadOptions: _downloadOptions);
-    return _response.then((data) => new Replica.fromJson(data));
-  }
-
-  /**
-   * Gets information about a specific replica.
-   *
-   * Request parameters:
-   *
-   * [projectName] - The project ID for this request.
-   *
-   * [zone] - The zone where the replica lives.
-   *
-   * [poolName] - The replica pool name for this request.
-   *
-   * [replicaName] - The name of the replica for this request.
-   *
-   * Completes with a [Replica].
-   *
-   * Completes with a [common.ApiRequestError] if the API endpoint returned an
-   * error.
-   *
-   * If the used [http.Client] completes with an error when making a REST call,
-   * this method  will complete with the same error.
-   */
-  async.Future<Replica> get(core.String projectName, core.String zone, core.String poolName, core.String replicaName) {
-    var _url = null;
-    var _queryParams = new core.Map();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = common.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (projectName == null) {
-      throw new core.ArgumentError("Parameter projectName is required.");
-    }
-    if (zone == null) {
-      throw new core.ArgumentError("Parameter zone is required.");
-    }
-    if (poolName == null) {
-      throw new core.ArgumentError("Parameter poolName is required.");
-    }
-    if (replicaName == null) {
-      throw new core.ArgumentError("Parameter replicaName is required.");
-    }
-
-
-    _url = common_internal.Escaper.ecapeVariable('$projectName') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/pools/' + common_internal.Escaper.ecapeVariable('$poolName') + '/replicas/' + common_internal.Escaper.ecapeVariable('$replicaName');
-
-    var _response = _requester.request(_url,
-                                       "GET",
-                                       body: _body,
-                                       queryParams: _queryParams,
-                                       uploadOptions: _uploadOptions,
-                                       uploadMedia: _uploadMedia,
-                                       downloadOptions: _downloadOptions);
-    return _response.then((data) => new Replica.fromJson(data));
-  }
-
-  /**
-   * Lists all replicas in a pool.
-   *
-   * Request parameters:
-   *
-   * [projectName] - The project ID for this request.
-   *
-   * [zone] - The zone where the replica pool lives.
-   *
-   * [poolName] - The replica pool name for this request.
-   *
-   * [maxResults] - Maximum count of results to be returned. Acceptable values
-   * are 0 to 100, inclusive. (Default: 50)
-   * Value must be between "0" and "1000".
-   *
-   * [pageToken] - Set this to the nextPageToken value returned by a previous
-   * list request to obtain the next page of results from the previous list
-   * request.
-   *
-   * Completes with a [ReplicasListResponse].
-   *
-   * Completes with a [common.ApiRequestError] if the API endpoint returned an
-   * error.
-   *
-   * If the used [http.Client] completes with an error when making a REST call,
-   * this method  will complete with the same error.
-   */
-  async.Future<ReplicasListResponse> list(core.String projectName, core.String zone, core.String poolName, {core.int maxResults, core.String pageToken}) {
-    var _url = null;
-    var _queryParams = new core.Map();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = common.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (projectName == null) {
-      throw new core.ArgumentError("Parameter projectName is required.");
-    }
-    if (zone == null) {
-      throw new core.ArgumentError("Parameter zone is required.");
-    }
-    if (poolName == null) {
-      throw new core.ArgumentError("Parameter poolName is required.");
-    }
-    if (maxResults != null) {
-      _queryParams["maxResults"] = ["${maxResults}"];
-    }
-    if (pageToken != null) {
-      _queryParams["pageToken"] = [pageToken];
-    }
-
-
-    _url = common_internal.Escaper.ecapeVariable('$projectName') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/pools/' + common_internal.Escaper.ecapeVariable('$poolName') + '/replicas';
-
-    var _response = _requester.request(_url,
-                                       "GET",
-                                       body: _body,
-                                       queryParams: _queryParams,
-                                       uploadOptions: _uploadOptions,
-                                       uploadMedia: _uploadMedia,
-                                       downloadOptions: _downloadOptions);
-    return _response.then((data) => new ReplicasListResponse.fromJson(data));
-  }
-
-  /**
-   * Restarts a replica in a pool.
-   *
-   * Request parameters:
-   *
-   * [projectName] - The project ID for this request.
-   *
-   * [zone] - The zone where the replica lives.
-   *
-   * [poolName] - The replica pool name for this request.
-   *
-   * [replicaName] - The name of the replica for this request.
-   *
-   * Completes with a [Replica].
-   *
-   * Completes with a [common.ApiRequestError] if the API endpoint returned an
-   * error.
-   *
-   * If the used [http.Client] completes with an error when making a REST call,
-   * this method  will complete with the same error.
-   */
-  async.Future<Replica> restart(core.String projectName, core.String zone, core.String poolName, core.String replicaName) {
-    var _url = null;
-    var _queryParams = new core.Map();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = common.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (projectName == null) {
-      throw new core.ArgumentError("Parameter projectName is required.");
-    }
-    if (zone == null) {
-      throw new core.ArgumentError("Parameter zone is required.");
-    }
-    if (poolName == null) {
-      throw new core.ArgumentError("Parameter poolName is required.");
-    }
-    if (replicaName == null) {
-      throw new core.ArgumentError("Parameter replicaName is required.");
-    }
-
-
-    _url = common_internal.Escaper.ecapeVariable('$projectName') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/pools/' + common_internal.Escaper.ecapeVariable('$poolName') + '/replicas/' + common_internal.Escaper.ecapeVariable('$replicaName') + '/restart';
-
-    var _response = _requester.request(_url,
-                                       "POST",
-                                       body: _body,
-                                       queryParams: _queryParams,
-                                       uploadOptions: _uploadOptions,
-                                       uploadMedia: _uploadMedia,
-                                       downloadOptions: _downloadOptions);
-    return _response.then((data) => new Replica.fromJson(data));
-  }
-
-}
-
-
-
-/**
- * A Compute Engine network accessConfig. Identical to the accessConfig on
- * corresponding Compute Engine resource.
- */
-class AccessConfig {
-  /** Name of this access configuration. */
-  core.String name;
-
-  /** An external IP address associated with this instance. */
-  core.String natIp;
-
-  /**
-   * Type of this access configuration file. Currently only ONE_TO_ONE_NAT is
-   * supported.
-   */
-  core.String type;
-
-
-  AccessConfig();
-
-  AccessConfig.fromJson(core.Map _json) {
-    if (_json.containsKey("name")) {
-      name = _json["name"];
-    }
-    if (_json.containsKey("natIp")) {
-      natIp = _json["natIp"];
-    }
-    if (_json.containsKey("type")) {
-      type = _json["type"];
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (name != null) {
-      _json["name"] = name;
-    }
-    if (natIp != null) {
-      _json["natIp"] = natIp;
-    }
-    if (type != null) {
-      _json["type"] = type;
-    }
-    return _json;
-  }
-}
-
-
-/** An action that gets executed during initialization of the replicas. */
-class Action {
-  /**
-   * A list of commands to run, one per line. If any command fails, the whole
-   * action is considered a failure and no further actions are run. This also
-   * marks the virtual machine or replica as a failure.
-   */
-  core.List<core.String> commands;
-
-  /**
-   * A list of environment variables to use for the commands in this action.
-   */
-  core.List<EnvVariable> envVariables;
-
-  /**
-   * If an action's commands on a particular replica do not finish in the
-   * specified timeoutMilliSeconds, the replica is considered to be in a FAILING
-   * state. No efforts are made to stop any processes that were spawned or
-   * created as the result of running the action's commands. The default is the
-   * max allowed value, 1 hour (i.e. 3600000 milliseconds).
-   */
-  core.int timeoutMilliSeconds;
-
-
-  Action();
-
-  Action.fromJson(core.Map _json) {
-    if (_json.containsKey("commands")) {
-      commands = _json["commands"];
-    }
-    if (_json.containsKey("envVariables")) {
-      envVariables = _json["envVariables"].map((value) => new EnvVariable.fromJson(value)).toList();
-    }
-    if (_json.containsKey("timeoutMilliSeconds")) {
-      timeoutMilliSeconds = _json["timeoutMilliSeconds"];
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (commands != null) {
-      _json["commands"] = commands;
-    }
-    if (envVariables != null) {
-      _json["envVariables"] = envVariables.map((value) => (value).toJson()).toList();
-    }
-    if (timeoutMilliSeconds != null) {
-      _json["timeoutMilliSeconds"] = timeoutMilliSeconds;
-    }
-    return _json;
-  }
-}
-
-
-/** Specifies how to attach a disk to a Replica. */
-class DiskAttachment {
-  /** The device name of this disk. */
-  core.String deviceName;
-
-  /**
-   * A zero-based index to assign to this disk, where 0 is reserved for the boot
-   * disk. If not specified, this is assigned by the server.
-   */
-  core.int index;
-
-
-  DiskAttachment();
-
-  DiskAttachment.fromJson(core.Map _json) {
-    if (_json.containsKey("deviceName")) {
-      deviceName = _json["deviceName"];
-    }
-    if (_json.containsKey("index")) {
-      index = _json["index"];
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (deviceName != null) {
-      _json["deviceName"] = deviceName;
-    }
-    if (index != null) {
-      _json["index"] = index;
-    }
-    return _json;
-  }
-}
-
-
-/** An environment variable to set for an action. */
-class EnvVariable {
-  /** Deprecated, do not use. */
-  core.bool hidden;
-
-  /** The name of the environment variable. */
-  core.String name;
-
-  /** The value of the variable. */
-  core.String value;
-
-
-  EnvVariable();
-
-  EnvVariable.fromJson(core.Map _json) {
-    if (_json.containsKey("hidden")) {
-      hidden = _json["hidden"];
-    }
-    if (_json.containsKey("name")) {
-      name = _json["name"];
-    }
-    if (_json.containsKey("value")) {
-      value = _json["value"];
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (hidden != null) {
-      _json["hidden"] = hidden;
-    }
-    if (name != null) {
-      _json["name"] = name;
-    }
-    if (value != null) {
-      _json["value"] = value;
-    }
-    return _json;
-  }
-}
-
-
-/**
- * A pre-existing persistent disk that will be attached to every Replica in the
- * Pool in READ_ONLY mode.
- */
-class ExistingDisk {
-  /** How the disk will be attached to the Replica. */
-  DiskAttachment attachment;
-
-  /**
-   * The name of the Persistent Disk resource. The Persistent Disk resource must
-   * be in the same zone as the Pool.
-   */
-  core.String source;
-
-
-  ExistingDisk();
-
-  ExistingDisk.fromJson(core.Map _json) {
-    if (_json.containsKey("attachment")) {
-      attachment = new DiskAttachment.fromJson(_json["attachment"]);
-    }
-    if (_json.containsKey("source")) {
-      source = _json["source"];
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (attachment != null) {
-      _json["attachment"] = (attachment).toJson();
-    }
-    if (source != null) {
-      _json["source"] = source;
-    }
-    return _json;
-  }
-}
-
-
-/** Not documented yet. */
-class HealthCheck {
-  /**
-   * How often (in seconds) to make HTTP requests for this healthcheck. The
-   * default value is 5 seconds.
-   */
-  core.int checkIntervalSec;
-
-  /** The description for this health check. */
-  core.String description;
-
-  /**
-   * The number of consecutive health check requests that need to succeed before
-   * the replica is considered healthy again. The default value is 2.
-   */
-  core.int healthyThreshold;
-
-  /**
-   * The value of the host header in the HTTP health check request. If left
-   * empty (default value), the localhost IP 127.0.0.1 will be used.
-   */
-  core.String host;
-
-  /** The name of this health check. */
-  core.String name;
-
-  /**
-   * The localhost request path to send this health check, in the format
-   * /path/to/use. For example, /healthcheck.
-   */
-  core.String path;
-
-  /** The TCP port for the health check requests. */
-  core.int port;
-
-  /**
-   * How long (in seconds) to wait before a timeout failure for this
-   * healthcheck. The default value is 5 seconds.
-   */
-  core.int timeoutSec;
-
-  /**
-   * The number of consecutive health check requests that need to fail in order
-   * to consider the replica unhealthy. The default value is 2.
-   */
-  core.int unhealthyThreshold;
-
-
-  HealthCheck();
-
-  HealthCheck.fromJson(core.Map _json) {
-    if (_json.containsKey("checkIntervalSec")) {
-      checkIntervalSec = _json["checkIntervalSec"];
-    }
-    if (_json.containsKey("description")) {
-      description = _json["description"];
-    }
-    if (_json.containsKey("healthyThreshold")) {
-      healthyThreshold = _json["healthyThreshold"];
-    }
-    if (_json.containsKey("host")) {
-      host = _json["host"];
-    }
-    if (_json.containsKey("name")) {
-      name = _json["name"];
-    }
-    if (_json.containsKey("path")) {
-      path = _json["path"];
-    }
-    if (_json.containsKey("port")) {
-      port = _json["port"];
-    }
-    if (_json.containsKey("timeoutSec")) {
-      timeoutSec = _json["timeoutSec"];
-    }
-    if (_json.containsKey("unhealthyThreshold")) {
-      unhealthyThreshold = _json["unhealthyThreshold"];
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (checkIntervalSec != null) {
-      _json["checkIntervalSec"] = checkIntervalSec;
-    }
-    if (description != null) {
-      _json["description"] = description;
-    }
-    if (healthyThreshold != null) {
-      _json["healthyThreshold"] = healthyThreshold;
-    }
-    if (host != null) {
-      _json["host"] = host;
-    }
-    if (name != null) {
-      _json["name"] = name;
-    }
-    if (path != null) {
-      _json["path"] = path;
-    }
-    if (port != null) {
-      _json["port"] = port;
-    }
-    if (timeoutSec != null) {
-      _json["timeoutSec"] = timeoutSec;
-    }
-    if (unhealthyThreshold != null) {
-      _json["unhealthyThreshold"] = unhealthyThreshold;
-    }
-    return _json;
-  }
-}
-
-
-/** A label to apply to this replica pool. */
-class Label {
-  /** The key for this label. */
-  core.String key;
-
-  /** The value of this label. */
-  core.String value;
-
-
-  Label();
-
-  Label.fromJson(core.Map _json) {
-    if (_json.containsKey("key")) {
-      key = _json["key"];
-    }
-    if (_json.containsKey("value")) {
-      value = _json["value"];
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (key != null) {
-      _json["key"] = key;
-    }
-    if (value != null) {
-      _json["value"] = value;
-    }
-    return _json;
-  }
-}
-
-
-/**
- * A Compute Engine metadata entry. Identical to the metadata on the
- * corresponding Compute Engine resource.
- */
-class Metadata {
-  /**
-   * The fingerprint of the metadata. Required for updating the metadata entries
-   * for this instance.
-   */
-  core.String fingerPrint;
-
-  /** A list of metadata items. */
-  core.List<MetadataItem> items;
-
-
-  Metadata();
-
-  Metadata.fromJson(core.Map _json) {
-    if (_json.containsKey("fingerPrint")) {
-      fingerPrint = _json["fingerPrint"];
-    }
-    if (_json.containsKey("items")) {
-      items = _json["items"].map((value) => new MetadataItem.fromJson(value)).toList();
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (fingerPrint != null) {
-      _json["fingerPrint"] = fingerPrint;
-    }
-    if (items != null) {
-      _json["items"] = items.map((value) => (value).toJson()).toList();
-    }
-    return _json;
-  }
-}
-
-
-/**
- * A Compute Engine metadata item, defined as a key:value pair. Identical to the
- * metadata on the corresponding Compute Engine resource.
- */
-class MetadataItem {
-  /** A metadata key. */
-  core.String key;
-
-  /** A metadata value. */
-  core.String value;
-
-
-  MetadataItem();
-
-  MetadataItem.fromJson(core.Map _json) {
-    if (_json.containsKey("key")) {
-      key = _json["key"];
-    }
-    if (_json.containsKey("value")) {
-      value = _json["value"];
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (key != null) {
-      _json["key"] = key;
-    }
-    if (value != null) {
-      _json["value"] = value;
-    }
-    return _json;
-  }
-}
-
-
-/**
- * A Compute Engine NetworkInterface resource. Identical to the NetworkInterface
- * on the corresponding Compute Engine resource.
- */
-class NetworkInterface {
-  /**
-   * An array of configurations for this interface. This specifies how this
-   * interface is configured to interact with other network services.
-   */
-  core.List<AccessConfig> accessConfigs;
-
-  /** Name the Network resource to which this interface applies. */
-  core.String network;
-
-  /**
-   * An optional IPV4 internal network address to assign to the instance for
-   * this network interface.
-   */
-  core.String networkIp;
-
-
-  NetworkInterface();
-
-  NetworkInterface.fromJson(core.Map _json) {
-    if (_json.containsKey("accessConfigs")) {
-      accessConfigs = _json["accessConfigs"].map((value) => new AccessConfig.fromJson(value)).toList();
-    }
-    if (_json.containsKey("network")) {
-      network = _json["network"];
-    }
-    if (_json.containsKey("networkIp")) {
-      networkIp = _json["networkIp"];
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (accessConfigs != null) {
-      _json["accessConfigs"] = accessConfigs.map((value) => (value).toJson()).toList();
-    }
-    if (network != null) {
-      _json["network"] = network;
-    }
-    if (networkIp != null) {
-      _json["networkIp"] = networkIp;
-    }
-    return _json;
-  }
-}
-
-
-/**
- * A Persistent Disk resource that will be created and attached to each Replica
- * in the Pool. Each Replica will have a unique persistent disk that is created
- * and attached to that Replica in READ_WRITE mode.
- */
-class NewDisk {
-  /** How the disk will be attached to the Replica. */
-  DiskAttachment attachment;
-
-  /**
-   * If true, then this disk will be deleted when the instance is deleted. The
-   * default value is true.
-   */
-  core.bool autoDelete;
-
-  /** If true, indicates that this is the root persistent disk. */
-  core.bool boot;
-
-  /**
-   * Create the new disk using these parameters. The name of the disk will be
-   * <instance_name>-<four_random_charactersgt;.
-   */
-  NewDiskInitializeParams initializeParams;
-
-
-  NewDisk();
-
-  NewDisk.fromJson(core.Map _json) {
-    if (_json.containsKey("attachment")) {
-      attachment = new DiskAttachment.fromJson(_json["attachment"]);
-    }
-    if (_json.containsKey("autoDelete")) {
-      autoDelete = _json["autoDelete"];
-    }
-    if (_json.containsKey("boot")) {
-      boot = _json["boot"];
-    }
-    if (_json.containsKey("initializeParams")) {
-      initializeParams = new NewDiskInitializeParams.fromJson(_json["initializeParams"]);
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (attachment != null) {
-      _json["attachment"] = (attachment).toJson();
-    }
-    if (autoDelete != null) {
-      _json["autoDelete"] = autoDelete;
-    }
-    if (boot != null) {
-      _json["boot"] = boot;
-    }
-    if (initializeParams != null) {
-      _json["initializeParams"] = (initializeParams).toJson();
-    }
-    return _json;
-  }
-}
-
-
-/** Initialization parameters for creating a new disk. */
-class NewDiskInitializeParams {
-  /** The size of the created disk in gigabytes. */
-  core.String diskSizeGb;
-
-  /**
-   * Name of the disk type resource describing which disk type to use to create
-   * the disk. For example 'pd-ssd' or 'pd-standard'. Default is 'pd-standard'
-   */
-  core.String diskType;
-
-  /**
-   * The name or fully-qualified URL of a source image to use to create this
-   * disk. If you provide a name of the source image, Replica Pool will look for
-   * an image with that name in your project. If you are specifying an image
-   * provided by Compute Engine, you will need to provide the full URL with the
-   * correct project, such as:
-   * http://www.googleapis.com/compute/v1/projects/debian-cloud/
-   * global/images/debian-wheezy-7-vYYYYMMDD
-   */
-  core.String sourceImage;
-
-
-  NewDiskInitializeParams();
-
-  NewDiskInitializeParams.fromJson(core.Map _json) {
-    if (_json.containsKey("diskSizeGb")) {
-      diskSizeGb = _json["diskSizeGb"];
-    }
-    if (_json.containsKey("diskType")) {
-      diskType = _json["diskType"];
-    }
-    if (_json.containsKey("sourceImage")) {
-      sourceImage = _json["sourceImage"];
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (diskSizeGb != null) {
-      _json["diskSizeGb"] = diskSizeGb;
-    }
-    if (diskType != null) {
-      _json["diskType"] = diskType;
-    }
-    if (sourceImage != null) {
-      _json["sourceImage"] = sourceImage;
-    }
-    return _json;
-  }
-}
-
-
-/** Not documented yet. */
-class Pool {
-  /**
-   * Whether replicas in this pool should be restarted if they experience a
-   * failure. The default value is true.
-   */
-  core.bool autoRestart;
-
-  /**
-   * The base instance name to use for the replicas in this pool. This must
-   * match the regex [a-z]([-a-z0-9]*[a-z0-9])?. If specified, the instances in
-   * this replica pool will be named in the format <base-instance-name>-<ID>.
-   * The <ID> postfix will be a four character alphanumeric identifier generated
-   * by the service.
-   *
-   * If this is not specified by the user, a random base instance name is
-   * generated by the service.
-   */
-  core.String baseInstanceName;
-
-  /** [Output Only] The current number of replicas in the pool. */
-  core.int currentNumReplicas;
-
-  /** An optional description of the replica pool. */
-  core.String description;
-
-  /** Deprecated. Please use template[].healthChecks instead. */
-  core.List<HealthCheck> healthChecks;
-
-  /**
-   * The initial number of replicas this pool should have. You must provide a
-   * value greater than or equal to 0.
-   */
-  core.int initialNumReplicas;
-
-  /**
-   * A list of labels to attach to this replica pool and all created virtual
-   * machines in this replica pool.
-   */
-  core.List<Label> labels;
-
-  /**
-   * The name of the replica pool. Must follow the regex
-   * [a-z]([-a-z0-9]*[a-z0-9])? and be 1-28 characters long.
-   */
-  core.String name;
-
-  /** Deprecated! Use initial_num_replicas instead. */
-  core.int numReplicas;
-
-  /**
-   * The list of resource views that should be updated with all the replicas
-   * that are managed by this pool.
-   */
-  core.List<core.String> resourceViews;
-
-  /** [Output Only] A self-link to the replica pool. */
-  core.String selfLink;
-
-  /** Deprecated, please use target_pools instead. */
-  core.String targetPool;
-
-  /**
-   * A list of target pools to update with the replicas that are managed by this
-   * pool. If specified, the replicas in this replica pool will be added to the
-   * specified target pools for load balancing purposes. The replica pool must
-   * live in the same region as the specified target pools. These values must be
-   * the target pool resource names, and not fully qualified URLs.
-   */
-  core.List<core.String> targetPools;
-
-  /**
-   * The template to use when creating replicas in this pool. This template is
-   * used during initial instance creation of the pool, when growing the pool in
-   * size, or when a replica restarts.
-   */
-  Template template;
-
-  /** Deprecated! Do not set. */
-  core.String type;
-
-
-  Pool();
-
-  Pool.fromJson(core.Map _json) {
-    if (_json.containsKey("autoRestart")) {
-      autoRestart = _json["autoRestart"];
-    }
-    if (_json.containsKey("baseInstanceName")) {
-      baseInstanceName = _json["baseInstanceName"];
-    }
-    if (_json.containsKey("currentNumReplicas")) {
-      currentNumReplicas = _json["currentNumReplicas"];
-    }
-    if (_json.containsKey("description")) {
-      description = _json["description"];
-    }
-    if (_json.containsKey("healthChecks")) {
-      healthChecks = _json["healthChecks"].map((value) => new HealthCheck.fromJson(value)).toList();
-    }
-    if (_json.containsKey("initialNumReplicas")) {
-      initialNumReplicas = _json["initialNumReplicas"];
-    }
-    if (_json.containsKey("labels")) {
-      labels = _json["labels"].map((value) => new Label.fromJson(value)).toList();
-    }
-    if (_json.containsKey("name")) {
-      name = _json["name"];
-    }
-    if (_json.containsKey("numReplicas")) {
-      numReplicas = _json["numReplicas"];
-    }
-    if (_json.containsKey("resourceViews")) {
-      resourceViews = _json["resourceViews"];
-    }
-    if (_json.containsKey("selfLink")) {
-      selfLink = _json["selfLink"];
-    }
-    if (_json.containsKey("targetPool")) {
-      targetPool = _json["targetPool"];
-    }
-    if (_json.containsKey("targetPools")) {
-      targetPools = _json["targetPools"];
-    }
-    if (_json.containsKey("template")) {
-      template = new Template.fromJson(_json["template"]);
-    }
-    if (_json.containsKey("type")) {
-      type = _json["type"];
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (autoRestart != null) {
-      _json["autoRestart"] = autoRestart;
-    }
-    if (baseInstanceName != null) {
-      _json["baseInstanceName"] = baseInstanceName;
-    }
-    if (currentNumReplicas != null) {
-      _json["currentNumReplicas"] = currentNumReplicas;
-    }
-    if (description != null) {
-      _json["description"] = description;
-    }
-    if (healthChecks != null) {
-      _json["healthChecks"] = healthChecks.map((value) => (value).toJson()).toList();
-    }
-    if (initialNumReplicas != null) {
-      _json["initialNumReplicas"] = initialNumReplicas;
-    }
-    if (labels != null) {
-      _json["labels"] = labels.map((value) => (value).toJson()).toList();
-    }
-    if (name != null) {
-      _json["name"] = name;
-    }
-    if (numReplicas != null) {
-      _json["numReplicas"] = numReplicas;
-    }
-    if (resourceViews != null) {
-      _json["resourceViews"] = resourceViews;
-    }
-    if (selfLink != null) {
-      _json["selfLink"] = selfLink;
-    }
-    if (targetPool != null) {
-      _json["targetPool"] = targetPool;
-    }
-    if (targetPools != null) {
-      _json["targetPools"] = targetPools;
-    }
-    if (template != null) {
-      _json["template"] = (template).toJson();
-    }
-    if (type != null) {
-      _json["type"] = type;
-    }
-    return _json;
-  }
-}
-
-
-/** Not documented yet. */
-class PoolsDeleteRequest {
-  /**
-   * If there are instances you would like to keep, you can specify them here.
-   * These instances won't be deleted, but the associated replica objects will
-   * be removed.
-   */
-  core.List<core.String> abandonInstances;
-
-
-  PoolsDeleteRequest();
-
-  PoolsDeleteRequest.fromJson(core.Map _json) {
-    if (_json.containsKey("abandonInstances")) {
-      abandonInstances = _json["abandonInstances"];
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (abandonInstances != null) {
-      _json["abandonInstances"] = abandonInstances;
-    }
-    return _json;
-  }
-}
-
-
-/** Not documented yet. */
-class PoolsListResponse {
-  /** Not documented yet. */
-  core.String nextPageToken;
-
-  /** Not documented yet. */
-  core.List<Pool> resources;
-
-
-  PoolsListResponse();
-
-  PoolsListResponse.fromJson(core.Map _json) {
-    if (_json.containsKey("nextPageToken")) {
-      nextPageToken = _json["nextPageToken"];
-    }
-    if (_json.containsKey("resources")) {
-      resources = _json["resources"].map((value) => new Pool.fromJson(value)).toList();
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (nextPageToken != null) {
-      _json["nextPageToken"] = nextPageToken;
-    }
-    if (resources != null) {
-      _json["resources"] = resources.map((value) => (value).toJson()).toList();
-    }
-    return _json;
-  }
-}
-
-
-/**
- * An individual Replica within a Pool. Replicas are automatically created by
- * the replica pool, using the template provided by the user. You cannot
- * directly create replicas.
- */
-class Replica {
-  /** [Output Only] The name of the Replica object. */
-  core.String name;
-
-  /** [Output Only] The self-link of the Replica. */
-  core.String selfLink;
-
-  /** [Output Only] Last known status of the Replica. */
-  ReplicaStatus status;
-
-
-  Replica();
-
-  Replica.fromJson(core.Map _json) {
-    if (_json.containsKey("name")) {
-      name = _json["name"];
-    }
-    if (_json.containsKey("selfLink")) {
-      selfLink = _json["selfLink"];
-    }
-    if (_json.containsKey("status")) {
-      status = new ReplicaStatus.fromJson(_json["status"]);
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (name != null) {
-      _json["name"] = name;
-    }
-    if (selfLink != null) {
-      _json["selfLink"] = selfLink;
-    }
-    if (status != null) {
-      _json["status"] = (status).toJson();
-    }
-    return _json;
-  }
-}
-
-
-/** The current status of a Replica. */
-class ReplicaStatus {
-  /**
-   * [Output Only] Human-readable details about the current state of the replica
-   */
-  core.String details;
-
-  /** [Output Only] The state of the Replica. */
-  core.String state;
-
-  /** [Output Only] The template used to build the replica. */
-  core.String templateVersion;
-
-  /**
-   * [Output Only] Link to the virtual machine that this Replica represents.
-   */
-  core.String vmLink;
-
-  /**
-   * [Output Only] The time that this Replica got to the RUNNING state, in RFC
-   * 3339 format. If the start time is unknown, UNKNOWN is returned.
-   */
-  core.String vmStartTime;
-
-
-  ReplicaStatus();
-
-  ReplicaStatus.fromJson(core.Map _json) {
-    if (_json.containsKey("details")) {
-      details = _json["details"];
-    }
-    if (_json.containsKey("state")) {
-      state = _json["state"];
-    }
-    if (_json.containsKey("templateVersion")) {
-      templateVersion = _json["templateVersion"];
-    }
-    if (_json.containsKey("vmLink")) {
-      vmLink = _json["vmLink"];
-    }
-    if (_json.containsKey("vmStartTime")) {
-      vmStartTime = _json["vmStartTime"];
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (details != null) {
-      _json["details"] = details;
-    }
-    if (state != null) {
-      _json["state"] = state;
-    }
-    if (templateVersion != null) {
-      _json["templateVersion"] = templateVersion;
-    }
-    if (vmLink != null) {
-      _json["vmLink"] = vmLink;
-    }
-    if (vmStartTime != null) {
-      _json["vmStartTime"] = vmStartTime;
-    }
-    return _json;
-  }
-}
-
-
-/** Not documented yet. */
-class ReplicasDeleteRequest {
-  /**
-   * Whether the instance resource represented by this replica should be deleted
-   * or abandoned. If abandoned, the replica will be deleted but the virtual
-   * machine instance will remain. By default, this is set to false and the
-   * instance will be deleted along with the replica.
-   */
-  core.bool abandonInstance;
-
-
-  ReplicasDeleteRequest();
-
-  ReplicasDeleteRequest.fromJson(core.Map _json) {
-    if (_json.containsKey("abandonInstance")) {
-      abandonInstance = _json["abandonInstance"];
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (abandonInstance != null) {
-      _json["abandonInstance"] = abandonInstance;
-    }
-    return _json;
-  }
-}
-
-
-/** Not documented yet. */
-class ReplicasListResponse {
-  /** Not documented yet. */
-  core.String nextPageToken;
-
-  /** Not documented yet. */
-  core.List<Replica> resources;
-
-
-  ReplicasListResponse();
-
-  ReplicasListResponse.fromJson(core.Map _json) {
-    if (_json.containsKey("nextPageToken")) {
-      nextPageToken = _json["nextPageToken"];
-    }
-    if (_json.containsKey("resources")) {
-      resources = _json["resources"].map((value) => new Replica.fromJson(value)).toList();
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (nextPageToken != null) {
-      _json["nextPageToken"] = nextPageToken;
-    }
-    if (resources != null) {
-      _json["resources"] = resources.map((value) => (value).toJson()).toList();
-    }
-    return _json;
-  }
-}
-
-
-/**
- * A Compute Engine service account, identical to the Compute Engine resource.
- */
-class ServiceAccount {
-  /**
-   * The service account email address, for example:
-   * 123845678986@project.gserviceaccount.com
-   */
-  core.String email;
-
-  /**
-   * The list of OAuth2 scopes to obtain for the service account, for example:
-   * https://www.googleapis.com/auth/devstorage.full_control
-   */
-  core.List<core.String> scopes;
-
-
-  ServiceAccount();
-
-  ServiceAccount.fromJson(core.Map _json) {
-    if (_json.containsKey("email")) {
-      email = _json["email"];
-    }
-    if (_json.containsKey("scopes")) {
-      scopes = _json["scopes"];
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (email != null) {
-      _json["email"] = email;
-    }
-    if (scopes != null) {
-      _json["scopes"] = scopes;
-    }
-    return _json;
-  }
-}
-
-
-/**
- * A Compute Engine Instance tag, identical to the tags on the corresponding
- * Compute Engine Instance resource.
- */
-class Tag {
-  /** The fingerprint of the tag. Required for updating the list of tags. */
-  core.String fingerPrint;
-
-  /** Items contained in this tag. */
-  core.List<core.String> items;
-
-
-  Tag();
-
-  Tag.fromJson(core.Map _json) {
-    if (_json.containsKey("fingerPrint")) {
-      fingerPrint = _json["fingerPrint"];
-    }
-    if (_json.containsKey("items")) {
-      items = _json["items"];
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (fingerPrint != null) {
-      _json["fingerPrint"] = fingerPrint;
-    }
-    if (items != null) {
-      _json["items"] = items;
-    }
-    return _json;
-  }
-}
-
-
-/** The template used for creating replicas in the pool. */
-class Template {
-  /**
-   * An action to run during initialization of your replicas. An action is run
-   * as shell commands which are executed one after the other in the same bash
-   * shell, so any state established by one command is inherited by later
-   * commands.
-   */
-  Action action;
-
-  /**
-   * A list of HTTP Health Checks to configure for this replica pool and all
-   * virtual machines in this replica pool.
-   */
-  core.List<HealthCheck> healthChecks;
-
-  /**
-   * A free-form string describing the version of this template. You can provide
-   * any versioning string you would like. For example, version1 or template-v1.
-   */
-  core.String version;
-
-  /**
-   * The virtual machine parameters to use for creating replicas. You can define
-   * settings such as the machine type and the image of replicas in this pool.
-   * This is required if replica type is SMART_VM.
-   */
-  VmParams vmParams;
-
-
-  Template();
-
-  Template.fromJson(core.Map _json) {
-    if (_json.containsKey("action")) {
-      action = new Action.fromJson(_json["action"]);
-    }
-    if (_json.containsKey("healthChecks")) {
-      healthChecks = _json["healthChecks"].map((value) => new HealthCheck.fromJson(value)).toList();
-    }
-    if (_json.containsKey("version")) {
-      version = _json["version"];
-    }
-    if (_json.containsKey("vmParams")) {
-      vmParams = new VmParams.fromJson(_json["vmParams"]);
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (action != null) {
-      _json["action"] = (action).toJson();
-    }
-    if (healthChecks != null) {
-      _json["healthChecks"] = healthChecks.map((value) => (value).toJson()).toList();
-    }
-    if (version != null) {
-      _json["version"] = version;
-    }
-    if (vmParams != null) {
-      _json["vmParams"] = (vmParams).toJson();
-    }
-    return _json;
-  }
-}
-
-
-/**
- * Parameters for creating a Compute Engine Instance resource. Most fields are
- * identical to the corresponding Compute Engine resource.
- */
-class VmParams {
-  /** Deprecated. Please use baseInstanceName instead. */
-  core.String baseInstanceName;
-
-  /**
-   * Enables IP Forwarding, which allows this instance to receive packets
-   * destined for a different IP address, and send packets with a different
-   * source IP. See IP Forwarding for more information.
-   */
-  core.bool canIpForward;
-
-  /** An optional textual description of the instance. */
-  core.String description;
-
-  /**
-   * A list of existing Persistent Disk resources to attach to each replica in
-   * the pool. Each disk will be attached in read-only mode to every replica.
-   */
-  core.List<ExistingDisk> disksToAttach;
-
-  /**
-   * A list of Disk resources to create and attach to each Replica in the Pool.
-   * Currently, you can only define one disk and it must be a root persistent
-   * disk. Note that Replica Pool will create a root persistent disk for each
-   * replica.
-   */
-  core.List<NewDisk> disksToCreate;
-
-  /**
-   * The machine type for this instance. The resource name (e.g. n1-standard-1).
-   */
-  core.String machineType;
-
-  /** The metadata key/value pairs assigned to this instance. */
-  Metadata metadata;
-
-  /**
-   * A list of network interfaces for the instance. Currently only one interface
-   * is supported by Google Compute Engine, ONE_TO_ONE_NAT.
-   */
-  core.List<NetworkInterface> networkInterfaces;
-
-  /** Not documented yet. */
-  core.String onHostMaintenance;
-
-  /** A list of Service Accounts to enable for this instance. */
-  core.List<ServiceAccount> serviceAccounts;
-
-  /**
-   * A list of tags to apply to the Google Compute Engine instance to identify
-   * resources.
-   */
-  Tag tags;
-
-
-  VmParams();
-
-  VmParams.fromJson(core.Map _json) {
-    if (_json.containsKey("baseInstanceName")) {
-      baseInstanceName = _json["baseInstanceName"];
-    }
-    if (_json.containsKey("canIpForward")) {
-      canIpForward = _json["canIpForward"];
-    }
-    if (_json.containsKey("description")) {
-      description = _json["description"];
-    }
-    if (_json.containsKey("disksToAttach")) {
-      disksToAttach = _json["disksToAttach"].map((value) => new ExistingDisk.fromJson(value)).toList();
-    }
-    if (_json.containsKey("disksToCreate")) {
-      disksToCreate = _json["disksToCreate"].map((value) => new NewDisk.fromJson(value)).toList();
-    }
-    if (_json.containsKey("machineType")) {
-      machineType = _json["machineType"];
-    }
-    if (_json.containsKey("metadata")) {
-      metadata = new Metadata.fromJson(_json["metadata"]);
-    }
-    if (_json.containsKey("networkInterfaces")) {
-      networkInterfaces = _json["networkInterfaces"].map((value) => new NetworkInterface.fromJson(value)).toList();
-    }
-    if (_json.containsKey("onHostMaintenance")) {
-      onHostMaintenance = _json["onHostMaintenance"];
-    }
-    if (_json.containsKey("serviceAccounts")) {
-      serviceAccounts = _json["serviceAccounts"].map((value) => new ServiceAccount.fromJson(value)).toList();
-    }
-    if (_json.containsKey("tags")) {
-      tags = new Tag.fromJson(_json["tags"]);
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (baseInstanceName != null) {
-      _json["baseInstanceName"] = baseInstanceName;
-    }
-    if (canIpForward != null) {
-      _json["canIpForward"] = canIpForward;
-    }
-    if (description != null) {
-      _json["description"] = description;
-    }
-    if (disksToAttach != null) {
-      _json["disksToAttach"] = disksToAttach.map((value) => (value).toJson()).toList();
-    }
-    if (disksToCreate != null) {
-      _json["disksToCreate"] = disksToCreate.map((value) => (value).toJson()).toList();
-    }
-    if (machineType != null) {
-      _json["machineType"] = machineType;
-    }
-    if (metadata != null) {
-      _json["metadata"] = (metadata).toJson();
-    }
-    if (networkInterfaces != null) {
-      _json["networkInterfaces"] = networkInterfaces.map((value) => (value).toJson()).toList();
-    }
-    if (onHostMaintenance != null) {
-      _json["onHostMaintenance"] = onHostMaintenance;
-    }
-    if (serviceAccounts != null) {
-      _json["serviceAccounts"] = serviceAccounts.map((value) => (value).toJson()).toList();
-    }
-    if (tags != null) {
-      _json["tags"] = (tags).toJson();
-    }
-    return _json;
-  }
-}
-
-
diff --git a/generated/googleapis_beta/lib/replicapool/v1beta2.dart b/generated/googleapis_beta/lib/replicapool/v1beta2.dart
new file mode 100644
index 0000000..53fc3cb
--- /dev/null
+++ b/generated/googleapis_beta/lib/replicapool/v1beta2.dart
@@ -0,0 +1,1677 @@
+library googleapis_beta.replicapool.v1beta2;
+
+import "dart:core" as core;
+import "dart:collection" as collection;
+import "dart:async" as async;
+import "dart:convert" as convert;
+
+import "package:crypto/crypto.dart" as crypto;
+import 'package:http/http.dart' as http;
+import '../src/common_internal.dart' as common_internal;
+import '../common/common.dart' as common;
+
+export '../common/common.dart' show ApiRequestError;
+export '../common/common.dart' show DetailedApiRequestError;
+
+/**
+ * The Google Compute Engine Instance Group Manager API provides groups of
+ * homogenous Compute Engine Instances.
+ */
+class ReplicapoolApi {
+  /** View and manage your data across Google Cloud Platform services */
+  static const CloudPlatformScope = "https://www.googleapis.com/auth/cloud-platform";
+
+  /** View and manage your Google Compute Engine resources */
+  static const ComputeScope = "https://www.googleapis.com/auth/compute";
+
+  /** View your Google Compute Engine resources */
+  static const ComputeReadonlyScope = "https://www.googleapis.com/auth/compute.readonly";
+
+
+  final common_internal.ApiRequester _requester;
+
+  InstanceGroupManagersResourceApi get instanceGroupManagers => new InstanceGroupManagersResourceApi(_requester);
+  ZoneOperationsResourceApi get zoneOperations => new ZoneOperationsResourceApi(_requester);
+
+  ReplicapoolApi(http.Client client) : 
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "replicapool/v1beta2/projects/");
+}
+
+
+/** Not documented yet. */
+class InstanceGroupManagersResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  InstanceGroupManagersResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Removes the specified instances from the managed instance group, and from
+   * any target pools of which they were members, without deleting the
+   * instances.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [project] - The Google Developers Console project name.
+   * Value must have pattern
+   * "(?:(?:[-a-z0-9]{1,63}\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))".
+   *
+   * [zone] - The name of the zone in which the instance group manager resides.
+   * Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+   *
+   * [instanceGroupManager] - The name of the instance group manager.
+   * Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+   *
+   * Completes with a [Operation].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Operation> abandonInstances(InstanceGroupManagersAbandonInstancesRequest request, core.String project, core.String zone, core.String instanceGroupManager) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (project == null) {
+      throw new core.ArgumentError("Parameter project is required.");
+    }
+    if (zone == null) {
+      throw new core.ArgumentError("Parameter zone is required.");
+    }
+    if (instanceGroupManager == null) {
+      throw new core.ArgumentError("Parameter instanceGroupManager is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$project') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/instanceGroupManagers/' + common_internal.Escaper.ecapeVariable('$instanceGroupManager') + '/abandonInstances';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Operation.fromJson(data));
+  }
+
+  /**
+   * Deletes the instance group manager and all instances contained within. If
+   * you'd like to delete the manager without deleting the instances, you must
+   * first abandon the instances to remove them from the group.
+   *
+   * Request parameters:
+   *
+   * [project] - The Google Developers Console project name.
+   * Value must have pattern
+   * "(?:(?:[-a-z0-9]{1,63}\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))".
+   *
+   * [zone] - The name of the zone in which the instance group manager resides.
+   * Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+   *
+   * [instanceGroupManager] - Name of the Instance Group Manager resource to
+   * delete.
+   * Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+   *
+   * Completes with a [Operation].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Operation> delete(core.String project, core.String zone, core.String instanceGroupManager) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (project == null) {
+      throw new core.ArgumentError("Parameter project is required.");
+    }
+    if (zone == null) {
+      throw new core.ArgumentError("Parameter zone is required.");
+    }
+    if (instanceGroupManager == null) {
+      throw new core.ArgumentError("Parameter instanceGroupManager is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$project') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/instanceGroupManagers/' + common_internal.Escaper.ecapeVariable('$instanceGroupManager');
+
+    var _response = _requester.request(_url,
+                                       "DELETE",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Operation.fromJson(data));
+  }
+
+  /**
+   * Deletes the specified instances. The instances are removed from the
+   * instance group and any target pools of which they are a member, then
+   * deleted. The targetSize of the instance group manager is reduced by the
+   * number of instances deleted.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [project] - The Google Developers Console project name.
+   * Value must have pattern
+   * "(?:(?:[-a-z0-9]{1,63}\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))".
+   *
+   * [zone] - The name of the zone in which the instance group manager resides.
+   * Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+   *
+   * [instanceGroupManager] - The name of the instance group manager.
+   * Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+   *
+   * Completes with a [Operation].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Operation> deleteInstances(InstanceGroupManagersDeleteInstancesRequest request, core.String project, core.String zone, core.String instanceGroupManager) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (project == null) {
+      throw new core.ArgumentError("Parameter project is required.");
+    }
+    if (zone == null) {
+      throw new core.ArgumentError("Parameter zone is required.");
+    }
+    if (instanceGroupManager == null) {
+      throw new core.ArgumentError("Parameter instanceGroupManager is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$project') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/instanceGroupManagers/' + common_internal.Escaper.ecapeVariable('$instanceGroupManager') + '/deleteInstances';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Operation.fromJson(data));
+  }
+
+  /**
+   * Returns the specified Instance Group Manager resource.
+   *
+   * Request parameters:
+   *
+   * [project] - The Google Developers Console project name.
+   * Value must have pattern
+   * "(?:(?:[-a-z0-9]{1,63}\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))".
+   *
+   * [zone] - The name of the zone in which the instance group manager resides.
+   * Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+   *
+   * [instanceGroupManager] - Name of the instance resource to return.
+   * Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+   *
+   * Completes with a [InstanceGroupManager].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<InstanceGroupManager> get(core.String project, core.String zone, core.String instanceGroupManager) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (project == null) {
+      throw new core.ArgumentError("Parameter project is required.");
+    }
+    if (zone == null) {
+      throw new core.ArgumentError("Parameter zone is required.");
+    }
+    if (instanceGroupManager == null) {
+      throw new core.ArgumentError("Parameter instanceGroupManager is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$project') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/instanceGroupManagers/' + common_internal.Escaper.ecapeVariable('$instanceGroupManager');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new InstanceGroupManager.fromJson(data));
+  }
+
+  /**
+   * Creates an instance group manager, as well as the instance group and the
+   * specified number of instances.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [project] - The Google Developers Console project name.
+   * Value must have pattern
+   * "(?:(?:[-a-z0-9]{1,63}\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))".
+   *
+   * [zone] - The name of the zone in which the instance group manager resides.
+   * Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+   *
+   * [size] - Number of instances that should exist.
+   *
+   * Completes with a [Operation].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Operation> insert(InstanceGroupManager request, core.String project, core.String zone, core.int size) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (project == null) {
+      throw new core.ArgumentError("Parameter project is required.");
+    }
+    if (zone == null) {
+      throw new core.ArgumentError("Parameter zone is required.");
+    }
+    if (size == null) {
+      throw new core.ArgumentError("Parameter size is required.");
+    }
+    _queryParams["size"] = ["${size}"];
+
+
+    _url = common_internal.Escaper.ecapeVariable('$project') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/instanceGroupManagers';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Operation.fromJson(data));
+  }
+
+  /**
+   * Retrieves the list of Instance Group Manager resources contained within the
+   * specified zone.
+   *
+   * Request parameters:
+   *
+   * [project] - The Google Developers Console project name.
+   * Value must have pattern
+   * "(?:(?:[-a-z0-9]{1,63}\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))".
+   *
+   * [zone] - The name of the zone in which the instance group manager resides.
+   * Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+   *
+   * [filter] - Optional. Filter expression for filtering listed resources.
+   *
+   * [maxResults] - Optional. Maximum count of results to be returned. Maximum
+   * value is 500 and default value is 500.
+   * Value must be between "0" and "500".
+   *
+   * [pageToken] - Optional. Tag returned by a previous list request truncated
+   * by maxResults. Used to continue a previous list request.
+   *
+   * Completes with a [InstanceGroupManagerList].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<InstanceGroupManagerList> list(core.String project, core.String zone, {core.String filter, core.int maxResults, core.String pageToken}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (project == null) {
+      throw new core.ArgumentError("Parameter project is required.");
+    }
+    if (zone == null) {
+      throw new core.ArgumentError("Parameter zone is required.");
+    }
+    if (filter != null) {
+      _queryParams["filter"] = [filter];
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$project') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/instanceGroupManagers';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new InstanceGroupManagerList.fromJson(data));
+  }
+
+  /**
+   * Recreates the specified instances. The instances are deleted, then
+   * recreated using the instance group manager's current instance template.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [project] - The Google Developers Console project name.
+   * Value must have pattern
+   * "(?:(?:[-a-z0-9]{1,63}\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))".
+   *
+   * [zone] - The name of the zone in which the instance group manager resides.
+   * Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+   *
+   * [instanceGroupManager] - The name of the instance group manager.
+   * Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+   *
+   * Completes with a [Operation].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Operation> recreateInstances(InstanceGroupManagersRecreateInstancesRequest request, core.String project, core.String zone, core.String instanceGroupManager) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (project == null) {
+      throw new core.ArgumentError("Parameter project is required.");
+    }
+    if (zone == null) {
+      throw new core.ArgumentError("Parameter zone is required.");
+    }
+    if (instanceGroupManager == null) {
+      throw new core.ArgumentError("Parameter instanceGroupManager is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$project') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/instanceGroupManagers/' + common_internal.Escaper.ecapeVariable('$instanceGroupManager') + '/recreateInstances';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Operation.fromJson(data));
+  }
+
+  /**
+   * Resizes the managed instance group up or down. If resized up, new instances
+   * are created using the current instance template. If resized down, instances
+   * are removed in the order outlined in Resizing a managed instance group.
+   *
+   * Request parameters:
+   *
+   * [project] - The Google Developers Console project name.
+   * Value must have pattern
+   * "(?:(?:[-a-z0-9]{1,63}\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))".
+   *
+   * [zone] - The name of the zone in which the instance group manager resides.
+   * Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+   *
+   * [instanceGroupManager] - The name of the instance group manager.
+   * Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+   *
+   * [size] - Number of instances that should exist in this Instance Group
+   * Manager.
+   *
+   * Completes with a [Operation].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Operation> resize(core.String project, core.String zone, core.String instanceGroupManager, core.int size) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (project == null) {
+      throw new core.ArgumentError("Parameter project is required.");
+    }
+    if (zone == null) {
+      throw new core.ArgumentError("Parameter zone is required.");
+    }
+    if (instanceGroupManager == null) {
+      throw new core.ArgumentError("Parameter instanceGroupManager is required.");
+    }
+    if (size == null) {
+      throw new core.ArgumentError("Parameter size is required.");
+    }
+    _queryParams["size"] = ["${size}"];
+
+
+    _url = common_internal.Escaper.ecapeVariable('$project') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/instanceGroupManagers/' + common_internal.Escaper.ecapeVariable('$instanceGroupManager') + '/resize';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Operation.fromJson(data));
+  }
+
+  /**
+   * Sets the instance template to use when creating new instances in this
+   * group. Existing instances are not affected.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [project] - The Google Developers Console project name.
+   * Value must have pattern
+   * "(?:(?:[-a-z0-9]{1,63}\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))".
+   *
+   * [zone] - The name of the zone in which the instance group manager resides.
+   * Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+   *
+   * [instanceGroupManager] - The name of the instance group manager.
+   * Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+   *
+   * Completes with a [Operation].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Operation> setInstanceTemplate(InstanceGroupManagersSetInstanceTemplateRequest request, core.String project, core.String zone, core.String instanceGroupManager) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (project == null) {
+      throw new core.ArgumentError("Parameter project is required.");
+    }
+    if (zone == null) {
+      throw new core.ArgumentError("Parameter zone is required.");
+    }
+    if (instanceGroupManager == null) {
+      throw new core.ArgumentError("Parameter instanceGroupManager is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$project') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/instanceGroupManagers/' + common_internal.Escaper.ecapeVariable('$instanceGroupManager') + '/setInstanceTemplate';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Operation.fromJson(data));
+  }
+
+  /**
+   * Modifies the target pools to which all new instances in this group are
+   * assigned. Existing instances in the group are not affected.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [project] - The Google Developers Console project name.
+   * Value must have pattern
+   * "(?:(?:[-a-z0-9]{1,63}\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))".
+   *
+   * [zone] - The name of the zone in which the instance group manager resides.
+   * Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+   *
+   * [instanceGroupManager] - The name of the instance group manager.
+   * Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+   *
+   * Completes with a [Operation].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Operation> setTargetPools(InstanceGroupManagersSetTargetPoolsRequest request, core.String project, core.String zone, core.String instanceGroupManager) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (project == null) {
+      throw new core.ArgumentError("Parameter project is required.");
+    }
+    if (zone == null) {
+      throw new core.ArgumentError("Parameter zone is required.");
+    }
+    if (instanceGroupManager == null) {
+      throw new core.ArgumentError("Parameter instanceGroupManager is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$project') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/instanceGroupManagers/' + common_internal.Escaper.ecapeVariable('$instanceGroupManager') + '/setTargetPools';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Operation.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
+class ZoneOperationsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  ZoneOperationsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Retrieves the specified zone-specific operation resource.
+   *
+   * Request parameters:
+   *
+   * [project] - Name of the project scoping this request.
+   * Value must have pattern
+   * "(?:(?:[-a-z0-9]{1,63}\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))".
+   *
+   * [zone] - Name of the zone scoping this request.
+   * Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+   *
+   * [operation] - Name of the operation resource to return.
+   * Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+   *
+   * Completes with a [Operation].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Operation> get(core.String project, core.String zone, core.String operation) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (project == null) {
+      throw new core.ArgumentError("Parameter project is required.");
+    }
+    if (zone == null) {
+      throw new core.ArgumentError("Parameter zone is required.");
+    }
+    if (operation == null) {
+      throw new core.ArgumentError("Parameter operation is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$project') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/operations/' + common_internal.Escaper.ecapeVariable('$operation');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Operation.fromJson(data));
+  }
+
+  /**
+   * Retrieves the list of operation resources contained within the specified
+   * zone.
+   *
+   * Request parameters:
+   *
+   * [project] - Name of the project scoping this request.
+   * Value must have pattern
+   * "(?:(?:[-a-z0-9]{1,63}\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))".
+   *
+   * [zone] - Name of the zone scoping this request.
+   * Value must have pattern "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?".
+   *
+   * [filter] - Optional. Filter expression for filtering listed resources.
+   *
+   * [maxResults] - Optional. Maximum count of results to be returned. Maximum
+   * value is 500 and default value is 500.
+   * Value must be between "0" and "500".
+   *
+   * [pageToken] - Optional. Tag returned by a previous list request truncated
+   * by maxResults. Used to continue a previous list request.
+   *
+   * Completes with a [OperationList].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<OperationList> list(core.String project, core.String zone, {core.String filter, core.int maxResults, core.String pageToken}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (project == null) {
+      throw new core.ArgumentError("Parameter project is required.");
+    }
+    if (zone == null) {
+      throw new core.ArgumentError("Parameter zone is required.");
+    }
+    if (filter != null) {
+      _queryParams["filter"] = [filter];
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$project') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/operations';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new OperationList.fromJson(data));
+  }
+
+}
+
+
+
+/** An Instance Group Manager resource. */
+class InstanceGroupManager {
+  /**
+   * The base instance name to use for instances in this group. The value must
+   * be a valid RFC1035 name. Supported characters are lowercase letters,
+   * numbers, and hyphens (-). Instances are named by appending a hyphen and a
+   * random four-character string to the base instance name.
+   */
+  core.String baseInstanceName;
+
+  /**
+   * [Output only] The time the instance group manager was created, in RFC3339
+   * text format.
+   */
+  core.String creationTimestamp;
+
+  /**
+   * [Output only] The number of instances that currently exist and are a part
+   * of this group. This includes instances that are starting but are not yet
+   * RUNNING, and instances that are in the process of being deleted or
+   * abandoned.
+   */
+  core.int currentSize;
+
+  /** An optional textual description of the instance group manager. */
+  core.String description;
+
+  /**
+   * [Output only] Fingerprint of the instance group manager. This field is used
+   * for optimistic locking. An up-to-date fingerprint must be provided in order
+   * to modify the Instance Group Manager resource.
+   */
+  core.String fingerprint;
+
+  core.List<core.int> get fingerprintAsBytes {
+    return crypto.CryptoUtils.base64StringToBytes(fingerprint);
+  }
+
+  void set fingerprintAsBytes(core.List<core.int> _bytes) {
+    fingerprint = crypto.CryptoUtils.bytesToBase64(_bytes, urlSafe: true);
+  }
+
+  /**
+   * [Output only] The full URL of the instance group created by the manager.
+   * This group contains all of the instances being managed, and cannot contain
+   * non-managed instances.
+   */
+  core.String group;
+
+  /** [Output only] A server-assigned unique identifier for the resource. */
+  core.String id;
+
+  /**
+   * The full URL to an instance template from which all new instances will be
+   * created.
+   */
+  core.String instanceTemplate;
+
+  /**
+   * [Output only] The resource type. Always replicapool#instanceGroupManager.
+   */
+  core.String kind;
+
+  /**
+   * The name of the instance group manager. Must be 1-63 characters long and
+   * comply with RFC1035. Supported characters include lowercase letters,
+   * numbers, and hyphens.
+   */
+  core.String name;
+
+  /** [Output only] The fully qualified URL for this resource. */
+  core.String selfLink;
+
+  /**
+   * The full URL of all target pools to which new instances in the group are
+   * added. Updating the target pool values does not affect existing instances.
+   */
+  core.List<core.String> targetPools;
+
+  /**
+   * [Output only] The number of instances that the manager is attempting to
+   * maintain. Deleting or abandoning instances affects this number, as does
+   * resizing the group.
+   */
+  core.int targetSize;
+
+
+  InstanceGroupManager();
+
+  InstanceGroupManager.fromJson(core.Map _json) {
+    if (_json.containsKey("baseInstanceName")) {
+      baseInstanceName = _json["baseInstanceName"];
+    }
+    if (_json.containsKey("creationTimestamp")) {
+      creationTimestamp = _json["creationTimestamp"];
+    }
+    if (_json.containsKey("currentSize")) {
+      currentSize = _json["currentSize"];
+    }
+    if (_json.containsKey("description")) {
+      description = _json["description"];
+    }
+    if (_json.containsKey("fingerprint")) {
+      fingerprint = _json["fingerprint"];
+    }
+    if (_json.containsKey("group")) {
+      group = _json["group"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("instanceTemplate")) {
+      instanceTemplate = _json["instanceTemplate"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("selfLink")) {
+      selfLink = _json["selfLink"];
+    }
+    if (_json.containsKey("targetPools")) {
+      targetPools = _json["targetPools"];
+    }
+    if (_json.containsKey("targetSize")) {
+      targetSize = _json["targetSize"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (baseInstanceName != null) {
+      _json["baseInstanceName"] = baseInstanceName;
+    }
+    if (creationTimestamp != null) {
+      _json["creationTimestamp"] = creationTimestamp;
+    }
+    if (currentSize != null) {
+      _json["currentSize"] = currentSize;
+    }
+    if (description != null) {
+      _json["description"] = description;
+    }
+    if (fingerprint != null) {
+      _json["fingerprint"] = fingerprint;
+    }
+    if (group != null) {
+      _json["group"] = group;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (instanceTemplate != null) {
+      _json["instanceTemplate"] = instanceTemplate;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (selfLink != null) {
+      _json["selfLink"] = selfLink;
+    }
+    if (targetPools != null) {
+      _json["targetPools"] = targetPools;
+    }
+    if (targetSize != null) {
+      _json["targetSize"] = targetSize;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class InstanceGroupManagerList {
+  /**
+   * Unique identifier for the resource; defined by the server (output only).
+   */
+  core.String id;
+
+  /** A list of instance resources. */
+  core.List<InstanceGroupManager> items;
+
+  /** Type of resource. */
+  core.String kind;
+
+  /** A token used to continue a truncated list request (output only). */
+  core.String nextPageToken;
+
+  /** Server defined URL for this resource (output only). */
+  core.String selfLink;
+
+
+  InstanceGroupManagerList();
+
+  InstanceGroupManagerList.fromJson(core.Map _json) {
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("items")) {
+      items = _json["items"].map((value) => new InstanceGroupManager.fromJson(value)).toList();
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("selfLink")) {
+      selfLink = _json["selfLink"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (items != null) {
+      _json["items"] = items.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (selfLink != null) {
+      _json["selfLink"] = selfLink;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class InstanceGroupManagersAbandonInstancesRequest {
+  /**
+   * The names of one or more instances to abandon. For example:
+   * { 'instances': [ 'instance-c3po', 'instance-r2d2' ] }
+   */
+  core.List<core.String> instances;
+
+
+  InstanceGroupManagersAbandonInstancesRequest();
+
+  InstanceGroupManagersAbandonInstancesRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("instances")) {
+      instances = _json["instances"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (instances != null) {
+      _json["instances"] = instances;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class InstanceGroupManagersDeleteInstancesRequest {
+  /**
+   * Names of instances to delete.
+   *
+   * Example: 'instance-foo', 'instance-bar'
+   */
+  core.List<core.String> instances;
+
+
+  InstanceGroupManagersDeleteInstancesRequest();
+
+  InstanceGroupManagersDeleteInstancesRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("instances")) {
+      instances = _json["instances"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (instances != null) {
+      _json["instances"] = instances;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class InstanceGroupManagersRecreateInstancesRequest {
+  /**
+   * The names of one or more instances to recreate. For example:
+   * { 'instances': [ 'instance-c3po', 'instance-r2d2' ] }
+   */
+  core.List<core.String> instances;
+
+
+  InstanceGroupManagersRecreateInstancesRequest();
+
+  InstanceGroupManagersRecreateInstancesRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("instances")) {
+      instances = _json["instances"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (instances != null) {
+      _json["instances"] = instances;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class InstanceGroupManagersSetInstanceTemplateRequest {
+  /**
+   * The full URL to an Instance Template from which all new instances will be
+   * created.
+   */
+  core.String instanceTemplate;
+
+
+  InstanceGroupManagersSetInstanceTemplateRequest();
+
+  InstanceGroupManagersSetInstanceTemplateRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("instanceTemplate")) {
+      instanceTemplate = _json["instanceTemplate"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (instanceTemplate != null) {
+      _json["instanceTemplate"] = instanceTemplate;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class InstanceGroupManagersSetTargetPoolsRequest {
+  /**
+   * The current fingerprint of the Instance Group Manager resource. If this
+   * does not match the server-side fingerprint of the resource, then the
+   * request will be rejected.
+   */
+  core.String fingerprint;
+
+  core.List<core.int> get fingerprintAsBytes {
+    return crypto.CryptoUtils.base64StringToBytes(fingerprint);
+  }
+
+  void set fingerprintAsBytes(core.List<core.int> _bytes) {
+    fingerprint = crypto.CryptoUtils.bytesToBase64(_bytes, urlSafe: true);
+  }
+
+  /**
+   * A list of fully-qualified URLs to existing Target Pool resources. New
+   * instances in the Instance Group Manager will be added to the specified
+   * target pools; existing instances are not affected.
+   */
+  core.List<core.String> targetPools;
+
+
+  InstanceGroupManagersSetTargetPoolsRequest();
+
+  InstanceGroupManagersSetTargetPoolsRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("fingerprint")) {
+      fingerprint = _json["fingerprint"];
+    }
+    if (_json.containsKey("targetPools")) {
+      targetPools = _json["targetPools"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (fingerprint != null) {
+      _json["fingerprint"] = fingerprint;
+    }
+    if (targetPools != null) {
+      _json["targetPools"] = targetPools;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class OperationErrorErrors {
+  /** [Output Only] The error type identifier for this error. */
+  core.String code;
+
+  /**
+   * [Output Only] Indicates the field in the request which caused the error.
+   * This property is optional.
+   */
+  core.String location;
+
+  /** [Output Only] An optional, human-readable error message. */
+  core.String message;
+
+
+  OperationErrorErrors();
+
+  OperationErrorErrors.fromJson(core.Map _json) {
+    if (_json.containsKey("code")) {
+      code = _json["code"];
+    }
+    if (_json.containsKey("location")) {
+      location = _json["location"];
+    }
+    if (_json.containsKey("message")) {
+      message = _json["message"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (code != null) {
+      _json["code"] = code;
+    }
+    if (location != null) {
+      _json["location"] = location;
+    }
+    if (message != null) {
+      _json["message"] = message;
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * [Output Only] If errors occurred during processing of this operation, this
+ * field will be populated.
+ */
+class OperationError {
+  /**
+   * [Output Only] The array of errors encountered while processing this
+   * operation.
+   */
+  core.List<OperationErrorErrors> errors;
+
+
+  OperationError();
+
+  OperationError.fromJson(core.Map _json) {
+    if (_json.containsKey("errors")) {
+      errors = _json["errors"].map((value) => new OperationErrorErrors.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (errors != null) {
+      _json["errors"] = errors.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class OperationWarningsData {
+  /** [Output Only] Metadata key for this warning. */
+  core.String key;
+
+  /** [Output Only] Metadata value for this warning. */
+  core.String value;
+
+
+  OperationWarningsData();
+
+  OperationWarningsData.fromJson(core.Map _json) {
+    if (_json.containsKey("key")) {
+      key = _json["key"];
+    }
+    if (_json.containsKey("value")) {
+      value = _json["value"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (key != null) {
+      _json["key"] = key;
+    }
+    if (value != null) {
+      _json["value"] = value;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class OperationWarnings {
+  /**
+   * [Output only] The warning type identifier for this warning.
+   * Possible string values are:
+   * - "DEPRECATED_RESOURCE_USED"
+   * - "DISK_SIZE_LARGER_THAN_IMAGE_SIZE"
+   * - "INJECTED_KERNELS_DEPRECATED"
+   * - "NEXT_HOP_ADDRESS_NOT_ASSIGNED"
+   * - "NEXT_HOP_CANNOT_IP_FORWARD"
+   * - "NEXT_HOP_INSTANCE_NOT_FOUND"
+   * - "NEXT_HOP_INSTANCE_NOT_ON_NETWORK"
+   * - "NEXT_HOP_NOT_RUNNING"
+   * - "NO_RESULTS_ON_PAGE"
+   * - "REQUIRED_TOS_AGREEMENT"
+   * - "RESOURCE_NOT_DELETED"
+   * - "UNREACHABLE"
+   */
+  core.String code;
+
+  /** [Output only] Metadata for this warning in key:value format. */
+  core.List<OperationWarningsData> data;
+
+  /** [Output only] Optional human-readable details for this warning. */
+  core.String message;
+
+
+  OperationWarnings();
+
+  OperationWarnings.fromJson(core.Map _json) {
+    if (_json.containsKey("code")) {
+      code = _json["code"];
+    }
+    if (_json.containsKey("data")) {
+      data = _json["data"].map((value) => new OperationWarningsData.fromJson(value)).toList();
+    }
+    if (_json.containsKey("message")) {
+      message = _json["message"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (code != null) {
+      _json["code"] = code;
+    }
+    if (data != null) {
+      _json["data"] = data.map((value) => (value).toJson()).toList();
+    }
+    if (message != null) {
+      _json["message"] = message;
+    }
+    return _json;
+  }
+}
+
+
+/** An operation resource, used to manage asynchronous API requests. */
+class Operation {
+  /**
+   * [Output only] An optional identifier specified by the client when the
+   * mutation was initiated. Must be unique for all operation resources in the
+   * project.
+   */
+  core.String clientOperationId;
+
+  /**
+   * [Output Only] The time that this operation was requested, in RFC3339 text
+   * format.
+   */
+  core.String creationTimestamp;
+
+  /**
+   * [Output Only] The time that this operation was completed, in RFC3339 text
+   * format.
+   */
+  core.String endTime;
+
+  /**
+   * [Output Only] If errors occurred during processing of this operation, this
+   * field will be populated.
+   */
+  OperationError error;
+
+  /** [Output only] If operation fails, the HTTP error message returned. */
+  core.String httpErrorMessage;
+
+  /** [Output only] If operation fails, the HTTP error status code returned. */
+  core.int httpErrorStatusCode;
+
+  /**
+   * [Output Only] Unique identifier for the resource, generated by the server.
+   */
+  core.String id;
+
+  /**
+   * [Output Only] The time that this operation was requested, in RFC3339 text
+   * format.
+   */
+  core.String insertTime;
+
+  /** [Output only] Type of the resource. */
+  core.String kind;
+
+  /** [Output Only] Name of the resource. */
+  core.String name;
+
+  /**
+   * [Output only] Type of the operation. Operations include insert, update, and
+   * delete.
+   */
+  core.String operationType;
+
+  /**
+   * [Output only] An optional progress indicator that ranges from 0 to 100.
+   * There is no requirement that this be linear or support any granularity of
+   * operations. This should not be used to guess at when the operation will be
+   * complete. This number should be monotonically increasing as the operation
+   * progresses.
+   */
+  core.int progress;
+
+  /**
+   * [Output Only] URL of the region where the operation resides. Only available
+   * when performing regional operations.
+   */
+  core.String region;
+
+  /** [Output Only] Server-defined fully-qualified URL for this resource. */
+  core.String selfLink;
+
+  /**
+   * [Output Only] The time that this operation was started by the server, in
+   * RFC3339 text format.
+   */
+  core.String startTime;
+
+  /**
+   * [Output Only] Status of the operation.
+   * Possible string values are:
+   * - "DONE"
+   * - "PENDING"
+   * - "RUNNING"
+   */
+  core.String status;
+
+  /**
+   * [Output Only] An optional textual description of the current status of the
+   * operation.
+   */
+  core.String statusMessage;
+
+  /**
+   * [Output Only] Unique target ID which identifies a particular incarnation of
+   * the target.
+   */
+  core.String targetId;
+
+  /** [Output only] URL of the resource the operation is mutating. */
+  core.String targetLink;
+
+  /**
+   * [Output Only] User who requested the operation, for example:
+   * user@example.com.
+   */
+  core.String user;
+
+  /**
+   * [Output Only] If there are issues with this operation, a warning is
+   * returned.
+   */
+  core.List<OperationWarnings> warnings;
+
+  /**
+   * [Output Only] URL of the zone where the operation resides. Only available
+   * when performing per-zone operations.
+   */
+  core.String zone;
+
+
+  Operation();
+
+  Operation.fromJson(core.Map _json) {
+    if (_json.containsKey("clientOperationId")) {
+      clientOperationId = _json["clientOperationId"];
+    }
+    if (_json.containsKey("creationTimestamp")) {
+      creationTimestamp = _json["creationTimestamp"];
+    }
+    if (_json.containsKey("endTime")) {
+      endTime = _json["endTime"];
+    }
+    if (_json.containsKey("error")) {
+      error = new OperationError.fromJson(_json["error"]);
+    }
+    if (_json.containsKey("httpErrorMessage")) {
+      httpErrorMessage = _json["httpErrorMessage"];
+    }
+    if (_json.containsKey("httpErrorStatusCode")) {
+      httpErrorStatusCode = _json["httpErrorStatusCode"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("insertTime")) {
+      insertTime = _json["insertTime"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("operationType")) {
+      operationType = _json["operationType"];
+    }
+    if (_json.containsKey("progress")) {
+      progress = _json["progress"];
+    }
+    if (_json.containsKey("region")) {
+      region = _json["region"];
+    }
+    if (_json.containsKey("selfLink")) {
+      selfLink = _json["selfLink"];
+    }
+    if (_json.containsKey("startTime")) {
+      startTime = _json["startTime"];
+    }
+    if (_json.containsKey("status")) {
+      status = _json["status"];
+    }
+    if (_json.containsKey("statusMessage")) {
+      statusMessage = _json["statusMessage"];
+    }
+    if (_json.containsKey("targetId")) {
+      targetId = _json["targetId"];
+    }
+    if (_json.containsKey("targetLink")) {
+      targetLink = _json["targetLink"];
+    }
+    if (_json.containsKey("user")) {
+      user = _json["user"];
+    }
+    if (_json.containsKey("warnings")) {
+      warnings = _json["warnings"].map((value) => new OperationWarnings.fromJson(value)).toList();
+    }
+    if (_json.containsKey("zone")) {
+      zone = _json["zone"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (clientOperationId != null) {
+      _json["clientOperationId"] = clientOperationId;
+    }
+    if (creationTimestamp != null) {
+      _json["creationTimestamp"] = creationTimestamp;
+    }
+    if (endTime != null) {
+      _json["endTime"] = endTime;
+    }
+    if (error != null) {
+      _json["error"] = (error).toJson();
+    }
+    if (httpErrorMessage != null) {
+      _json["httpErrorMessage"] = httpErrorMessage;
+    }
+    if (httpErrorStatusCode != null) {
+      _json["httpErrorStatusCode"] = httpErrorStatusCode;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (insertTime != null) {
+      _json["insertTime"] = insertTime;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (operationType != null) {
+      _json["operationType"] = operationType;
+    }
+    if (progress != null) {
+      _json["progress"] = progress;
+    }
+    if (region != null) {
+      _json["region"] = region;
+    }
+    if (selfLink != null) {
+      _json["selfLink"] = selfLink;
+    }
+    if (startTime != null) {
+      _json["startTime"] = startTime;
+    }
+    if (status != null) {
+      _json["status"] = status;
+    }
+    if (statusMessage != null) {
+      _json["statusMessage"] = statusMessage;
+    }
+    if (targetId != null) {
+      _json["targetId"] = targetId;
+    }
+    if (targetLink != null) {
+      _json["targetLink"] = targetLink;
+    }
+    if (user != null) {
+      _json["user"] = user;
+    }
+    if (warnings != null) {
+      _json["warnings"] = warnings.map((value) => (value).toJson()).toList();
+    }
+    if (zone != null) {
+      _json["zone"] = zone;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class OperationList {
+  /**
+   * Unique identifier for the resource; defined by the server (output only).
+   */
+  core.String id;
+
+  /** The operation resources. */
+  core.List<Operation> items;
+
+  /** Type of resource. */
+  core.String kind;
+
+  /** A token used to continue a truncated list request (output only). */
+  core.String nextPageToken;
+
+  /** Server defined URL for this resource (output only). */
+  core.String selfLink;
+
+
+  OperationList();
+
+  OperationList.fromJson(core.Map _json) {
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("items")) {
+      items = _json["items"].map((value) => new Operation.fromJson(value)).toList();
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("selfLink")) {
+      selfLink = _json["selfLink"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (items != null) {
+      _json["items"] = items.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (selfLink != null) {
+      _json["selfLink"] = selfLink;
+    }
+    return _json;
+  }
+}
+
+
diff --git a/generated/googleapis_beta/lib/replicapoolupdater/v1beta1.dart b/generated/googleapis_beta/lib/replicapoolupdater/v1beta1.dart
new file mode 100644
index 0000000..8674700
--- /dev/null
+++ b/generated/googleapis_beta/lib/replicapoolupdater/v1beta1.dart
@@ -0,0 +1,734 @@
+library googleapis_beta.replicapoolupdater.v1beta1;
+
+import "dart:core" as core;
+import "dart:collection" as collection;
+import "dart:async" as async;
+import "dart:convert" as convert;
+
+import "package:crypto/crypto.dart" as crypto;
+import 'package:http/http.dart' as http;
+import '../src/common_internal.dart' as common_internal;
+import '../common/common.dart' as common;
+
+export '../common/common.dart' show ApiRequestError;
+export '../common/common.dart' show DetailedApiRequestError;
+
+/**
+ * The Google Compute Engine Instance Group Updater API provides services for
+ * updating groups of Compute Engine Instances.
+ */
+class ReplicapoolupdaterApi {
+  /** View and manage your data across Google Cloud Platform services */
+  static const CloudPlatformScope = "https://www.googleapis.com/auth/cloud-platform";
+
+  /** View and manage replica pools */
+  static const ReplicapoolScope = "https://www.googleapis.com/auth/replicapool";
+
+  /** View replica pools */
+  static const ReplicapoolReadonlyScope = "https://www.googleapis.com/auth/replicapool.readonly";
+
+
+  final common_internal.ApiRequester _requester;
+
+  UpdatesResourceApi get updates => new UpdatesResourceApi(_requester);
+
+  ReplicapoolupdaterApi(http.Client client) : 
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "replicapoolupdater/v1beta1/projects/");
+}
+
+
+/** Not documented yet. */
+class UpdatesResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  UpdatesResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Called on the particular Update endpoint. Cancels the update in state
+   * PAUSED. No-op if invoked in state CANCELLED.
+   *
+   * Request parameters:
+   *
+   * [project] - Project ID for this request.
+   *
+   * [zone] - Zone for the instance group manager.
+   *
+   * [instanceGroupManager] - Name of the instance group manager for this
+   * request.
+   *
+   * [update] - Unique (in the context of a group) handle of an update.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future cancel(core.String project, core.String zone, core.String instanceGroupManager, core.String update) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (project == null) {
+      throw new core.ArgumentError("Parameter project is required.");
+    }
+    if (zone == null) {
+      throw new core.ArgumentError("Parameter zone is required.");
+    }
+    if (instanceGroupManager == null) {
+      throw new core.ArgumentError("Parameter instanceGroupManager is required.");
+    }
+    if (update == null) {
+      throw new core.ArgumentError("Parameter update is required.");
+    }
+
+    _downloadOptions = null;
+
+    _url = common_internal.Escaper.ecapeVariable('$project') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/instanceGroupManagers/' + common_internal.Escaper.ecapeVariable('$instanceGroupManager') + '/updates/' + common_internal.Escaper.ecapeVariable('$update') + '/cancel';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Called on the particular Update endpoint. Returns the Update resource.
+   *
+   * Request parameters:
+   *
+   * [project] - Project ID for this request.
+   *
+   * [zone] - Zone for the instance group manager.
+   *
+   * [instanceGroupManager] - Name of the instance group manager for this
+   * request.
+   *
+   * [update] - Unique (in the context of a group) handle of an update.
+   *
+   * Completes with a [Update].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Update> get(core.String project, core.String zone, core.String instanceGroupManager, core.String update) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (project == null) {
+      throw new core.ArgumentError("Parameter project is required.");
+    }
+    if (zone == null) {
+      throw new core.ArgumentError("Parameter zone is required.");
+    }
+    if (instanceGroupManager == null) {
+      throw new core.ArgumentError("Parameter instanceGroupManager is required.");
+    }
+    if (update == null) {
+      throw new core.ArgumentError("Parameter update is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$project') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/instanceGroupManagers/' + common_internal.Escaper.ecapeVariable('$instanceGroupManager') + '/updates/' + common_internal.Escaper.ecapeVariable('$update');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Update.fromJson(data));
+  }
+
+  /**
+   * Called on the collection endpoint. Inserts the new Update resource and
+   * starts the update.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [project] - Project ID for this request.
+   *
+   * [zone] - Zone for the instance group manager.
+   *
+   * [instanceGroupManager] - Name of the instance group manager for this
+   * request.
+   *
+   * Completes with a [InsertResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<InsertResponse> insert(Update request, core.String project, core.String zone, core.String instanceGroupManager) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (project == null) {
+      throw new core.ArgumentError("Parameter project is required.");
+    }
+    if (zone == null) {
+      throw new core.ArgumentError("Parameter zone is required.");
+    }
+    if (instanceGroupManager == null) {
+      throw new core.ArgumentError("Parameter instanceGroupManager is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$project') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/instanceGroupManagers/' + common_internal.Escaper.ecapeVariable('$instanceGroupManager') + '/updates';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new InsertResponse.fromJson(data));
+  }
+
+  /**
+   * Called on the collection endpoint. Lists updates for a given instance
+   * group, in reverse chronological order. Pagination is supported, see
+   * ListRequestHeader.
+   *
+   * Request parameters:
+   *
+   * [project] - Project ID for this request.
+   *
+   * [zone] - Zone for the instance group manager.
+   *
+   * [instanceGroupManager] - Name of the instance group manager for this
+   * request.
+   *
+   * [maxResults] - Maximum count of results to be returned. Acceptable values
+   * are 1 to 100, inclusive. (Default: 50)
+   * Value must be between "1" and "100".
+   *
+   * [pageToken] - Set this to the nextPageToken value returned by a previous
+   * list request to obtain the next page of results from the previous list
+   * request.
+   *
+   * Completes with a [UpdateList].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<UpdateList> list(core.String project, core.String zone, core.String instanceGroupManager, {core.int maxResults, core.String pageToken}) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (project == null) {
+      throw new core.ArgumentError("Parameter project is required.");
+    }
+    if (zone == null) {
+      throw new core.ArgumentError("Parameter zone is required.");
+    }
+    if (instanceGroupManager == null) {
+      throw new core.ArgumentError("Parameter instanceGroupManager is required.");
+    }
+    if (maxResults != null) {
+      _queryParams["maxResults"] = ["${maxResults}"];
+    }
+    if (pageToken != null) {
+      _queryParams["pageToken"] = [pageToken];
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$project') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/instanceGroupManagers/' + common_internal.Escaper.ecapeVariable('$instanceGroupManager') + '/updates';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new UpdateList.fromJson(data));
+  }
+
+  /**
+   * Called on the particular Update endpoint. Pauses the update in state from {
+   * ROLLING_FORWARD, ROLLING_BACK, PAUSED }. No-op if invoked in state PAUSED.
+   *
+   * Request parameters:
+   *
+   * [project] - Project ID for this request.
+   *
+   * [zone] - Zone for the instance group manager.
+   *
+   * [instanceGroupManager] - Name of the instance group manager for this
+   * request.
+   *
+   * [update] - Unique (in the context of a group) handle of an update.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future pause(core.String project, core.String zone, core.String instanceGroupManager, core.String update) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (project == null) {
+      throw new core.ArgumentError("Parameter project is required.");
+    }
+    if (zone == null) {
+      throw new core.ArgumentError("Parameter zone is required.");
+    }
+    if (instanceGroupManager == null) {
+      throw new core.ArgumentError("Parameter instanceGroupManager is required.");
+    }
+    if (update == null) {
+      throw new core.ArgumentError("Parameter update is required.");
+    }
+
+    _downloadOptions = null;
+
+    _url = common_internal.Escaper.ecapeVariable('$project') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/instanceGroupManagers/' + common_internal.Escaper.ecapeVariable('$instanceGroupManager') + '/updates/' + common_internal.Escaper.ecapeVariable('$update') + '/pause';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Called on the particular Update endpoint. Rolls back the update in state
+   * from { ROLLING_FORWARD, ROLLING_BACK, PAUSED }. No-op if invoked in state
+   * ROLLED_BACK.
+   *
+   * Request parameters:
+   *
+   * [project] - Project ID for this request.
+   *
+   * [zone] - Zone for the instance group manager.
+   *
+   * [instanceGroupManager] - Name of the instance group manager for this
+   * request.
+   *
+   * [update] - Unique (in the context of a group) handle of an update.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future rollback(core.String project, core.String zone, core.String instanceGroupManager, core.String update) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (project == null) {
+      throw new core.ArgumentError("Parameter project is required.");
+    }
+    if (zone == null) {
+      throw new core.ArgumentError("Parameter zone is required.");
+    }
+    if (instanceGroupManager == null) {
+      throw new core.ArgumentError("Parameter instanceGroupManager is required.");
+    }
+    if (update == null) {
+      throw new core.ArgumentError("Parameter update is required.");
+    }
+
+    _downloadOptions = null;
+
+    _url = common_internal.Escaper.ecapeVariable('$project') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/instanceGroupManagers/' + common_internal.Escaper.ecapeVariable('$instanceGroupManager') + '/updates/' + common_internal.Escaper.ecapeVariable('$update') + '/rollback';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Called on the particular Update endpoint. Rolls forward the update in state
+   * from { ROLLING_FORWARD, ROLLING_BACK, PAUSED }. No-op if invoked in state
+   * ROLLED_OUT.
+   *
+   * Request parameters:
+   *
+   * [project] - Project ID for this request.
+   *
+   * [zone] - Zone for the instance group manager.
+   *
+   * [instanceGroupManager] - Name of the instance group manager for this
+   * request.
+   *
+   * [update] - Unique (in the context of a group) handle of an update.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future rollforward(core.String project, core.String zone, core.String instanceGroupManager, core.String update) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (project == null) {
+      throw new core.ArgumentError("Parameter project is required.");
+    }
+    if (zone == null) {
+      throw new core.ArgumentError("Parameter zone is required.");
+    }
+    if (instanceGroupManager == null) {
+      throw new core.ArgumentError("Parameter instanceGroupManager is required.");
+    }
+    if (update == null) {
+      throw new core.ArgumentError("Parameter update is required.");
+    }
+
+    _downloadOptions = null;
+
+    _url = common_internal.Escaper.ecapeVariable('$project') + '/zones/' + common_internal.Escaper.ecapeVariable('$zone') + '/instanceGroupManagers/' + common_internal.Escaper.ecapeVariable('$instanceGroupManager') + '/updates/' + common_internal.Escaper.ecapeVariable('$update') + '/rollforward';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+}
+
+
+
+/** Response returned by Insert method. */
+class InsertResponse {
+  /** Unique (in the context of a group) handle of an update. */
+  core.String update;
+
+
+  InsertResponse();
+
+  InsertResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("update")) {
+      update = _json["update"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (update != null) {
+      _json["update"] = update;
+    }
+    return _json;
+  }
+}
+
+
+/** Update of a single instance. */
+class InstanceUpdate {
+  /** Name of an instance. */
+  core.String instanceName;
+
+  /** State of an instance update. */
+  core.String state;
+
+
+  InstanceUpdate();
+
+  InstanceUpdate.fromJson(core.Map _json) {
+    if (_json.containsKey("instanceName")) {
+      instanceName = _json["instanceName"];
+    }
+    if (_json.containsKey("state")) {
+      state = _json["state"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (instanceName != null) {
+      _json["instanceName"] = instanceName;
+    }
+    if (state != null) {
+      _json["state"] = state;
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * Resource describing a single update (rollout) of an instance group to the
+ * given template.
+ */
+class Update {
+  /** [Output Only] Human-readable description of an update progress. */
+  core.String details;
+
+  /**
+   * [Output Only] Unique (in the context of a group) handle assigned to this
+   * update.
+   */
+  core.String handle;
+
+  /** Url of an instance template to be applied. */
+  core.String instanceTemplate;
+
+  /** [Output Only] Collection of instance updates. */
+  core.List<InstanceUpdate> instanceUpdates;
+
+  /** [Output only] The resource type. Always replicapoolupdater#update. */
+  core.String kind;
+
+  /** Parameters of an update process. */
+  UpdatePolicy policy;
+
+  /** [Output only] The fully qualified URL for this resource. */
+  core.String selfLink;
+
+  /** [Output Only] Current state of an update. */
+  core.String state;
+
+  /**
+   * [Output Only] Requested state of an update. This is the state that the
+   * updater is moving towards. Acceptable values are:
+   * - "ROLLED_OUT": The user has requested the update to go forward.
+   * - "ROLLED_BACK": The user has requested the update to be rolled back.
+   * - "PAUSED": The user has requested the update to be paused.
+   *
+   * - "CANCELLED": The user has requested the update to be cancelled. The
+   * updater service is in the process of canceling the update.
+   */
+  core.String targetState;
+
+
+  Update();
+
+  Update.fromJson(core.Map _json) {
+    if (_json.containsKey("details")) {
+      details = _json["details"];
+    }
+    if (_json.containsKey("handle")) {
+      handle = _json["handle"];
+    }
+    if (_json.containsKey("instanceTemplate")) {
+      instanceTemplate = _json["instanceTemplate"];
+    }
+    if (_json.containsKey("instanceUpdates")) {
+      instanceUpdates = _json["instanceUpdates"].map((value) => new InstanceUpdate.fromJson(value)).toList();
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("policy")) {
+      policy = new UpdatePolicy.fromJson(_json["policy"]);
+    }
+    if (_json.containsKey("selfLink")) {
+      selfLink = _json["selfLink"];
+    }
+    if (_json.containsKey("state")) {
+      state = _json["state"];
+    }
+    if (_json.containsKey("targetState")) {
+      targetState = _json["targetState"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (details != null) {
+      _json["details"] = details;
+    }
+    if (handle != null) {
+      _json["handle"] = handle;
+    }
+    if (instanceTemplate != null) {
+      _json["instanceTemplate"] = instanceTemplate;
+    }
+    if (instanceUpdates != null) {
+      _json["instanceUpdates"] = instanceUpdates.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (policy != null) {
+      _json["policy"] = (policy).toJson();
+    }
+    if (selfLink != null) {
+      _json["selfLink"] = selfLink;
+    }
+    if (state != null) {
+      _json["state"] = state;
+    }
+    if (targetState != null) {
+      _json["targetState"] = targetState;
+    }
+    return _json;
+  }
+}
+
+
+/** Response returned by List method. */
+class UpdateList {
+  /** Collection of requested updates. */
+  core.List<Update> items;
+
+  /** A token used to continue a truncated list request. */
+  core.String nextPageToken;
+
+
+  UpdateList();
+
+  UpdateList.fromJson(core.Map _json) {
+    if (_json.containsKey("items")) {
+      items = _json["items"].map((value) => new Update.fromJson(value)).toList();
+    }
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (items != null) {
+      _json["items"] = items.map((value) => (value).toJson()).toList();
+    }
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    return _json;
+  }
+}
+
+
+/** Parameters of an update process. */
+class UpdatePolicy {
+  /** Parameters of a canary phase. If absent, canary will NOT be performed. */
+  UpdatePolicyCanary canary;
+
+  /**
+   * Maximum number of instances that can be updated simultaneously
+   * (concurrently). An update of an instance starts when the instance is about
+   * to be restarted and finishes after the instance has been restarted and the
+   * sleep period (defined by sleep_after_instance_restart_sec) has passed.
+   */
+  core.int maxNumConcurrentInstances;
+
+  /**
+   * Time period after the instance has been restarted but before marking the
+   * update of this instance as done.
+   */
+  core.int sleepAfterInstanceRestartSec;
+
+
+  UpdatePolicy();
+
+  UpdatePolicy.fromJson(core.Map _json) {
+    if (_json.containsKey("canary")) {
+      canary = new UpdatePolicyCanary.fromJson(_json["canary"]);
+    }
+    if (_json.containsKey("maxNumConcurrentInstances")) {
+      maxNumConcurrentInstances = _json["maxNumConcurrentInstances"];
+    }
+    if (_json.containsKey("sleepAfterInstanceRestartSec")) {
+      sleepAfterInstanceRestartSec = _json["sleepAfterInstanceRestartSec"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (canary != null) {
+      _json["canary"] = (canary).toJson();
+    }
+    if (maxNumConcurrentInstances != null) {
+      _json["maxNumConcurrentInstances"] = maxNumConcurrentInstances;
+    }
+    if (sleepAfterInstanceRestartSec != null) {
+      _json["sleepAfterInstanceRestartSec"] = sleepAfterInstanceRestartSec;
+    }
+    return _json;
+  }
+}
+
+
+/** Parameters of a canary phase. */
+class UpdatePolicyCanary {
+  /**
+   * Number of instances updated as a part of canary phase. If absent, the
+   * default number of instances will be used.
+   */
+  core.int numInstances;
+
+
+  UpdatePolicyCanary();
+
+  UpdatePolicyCanary.fromJson(core.Map _json) {
+    if (_json.containsKey("numInstances")) {
+      numInstances = _json["numInstances"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (numInstances != null) {
+      _json["numInstances"] = numInstances;
+    }
+    return _json;
+  }
+}
+
+
diff --git a/generated/googleapis_beta/lib/sqladmin/v1beta3.dart b/generated/googleapis_beta/lib/sqladmin/v1beta3.dart
index a8d005f..c2a9a0f 100644
--- a/generated/googleapis_beta/lib/sqladmin/v1beta3.dart
+++ b/generated/googleapis_beta/lib/sqladmin/v1beta3.dart
@@ -56,8 +56,9 @@
    * [backupConfiguration] - Identifier for the backup configuration. This gets
    * generated automatically when a backup configuration is created.
    *
-   * [dueTime] - The time when this run is due to start in RFC 3339 format, for
-   * example 2012-11-15T16:19:00.094Z.
+   * [dueTime] - The start time of the four-hour backup window. The backup can
+   * occur any time in the window. The time is in RFC 3339 format, for example
+   * 2012-11-15T16:19:00.094Z.
    *
    * Completes with a [BackupRun].
    *
@@ -759,8 +760,9 @@
    * [backupConfiguration] - The identifier of the backup configuration. This
    * gets generated automatically when a backup configuration is created.
    *
-   * [dueTime] - The time when this run is due to start in RFC 3339 format, for
-   * example 2012-11-15T16:19:00.094Z.
+   * [dueTime] - The start time of the four-hour backup window. The backup can
+   * occur any time in the window. The time is in RFC 3339 format, for example
+   * 2012-11-15T16:19:00.094Z.
    *
    * Completes with a [InstancesRestoreBackupResponse].
    *
@@ -1690,6 +1692,9 @@
   /** The assigned IP addresses for the instance. */
   core.List<IpMapping> ipAddresses;
 
+  /** The IPv6 address assigned to the instance. */
+  core.String ipv6Address;
+
   /** This is always sql#instance. */
   core.String kind;
 
@@ -1757,6 +1762,9 @@
     if (_json.containsKey("ipAddresses")) {
       ipAddresses = _json["ipAddresses"].map((value) => new IpMapping.fromJson(value)).toList();
     }
+    if (_json.containsKey("ipv6Address")) {
+      ipv6Address = _json["ipv6Address"];
+    }
     if (_json.containsKey("kind")) {
       kind = _json["kind"];
     }
@@ -1806,6 +1814,9 @@
     if (ipAddresses != null) {
       _json["ipAddresses"] = ipAddresses.map((value) => (value).toJson()).toList();
     }
+    if (ipv6Address != null) {
+      _json["ipv6Address"] = ipv6Address;
+    }
     if (kind != null) {
       _json["kind"] = kind;
     }
@@ -2782,6 +2793,9 @@
   /** Whether the instance should be assigned an IP address or not. */
   core.bool enabled;
 
+  /** This is always sql#ipConfiguration. */
+  core.String kind;
+
   /**
    * Whether the mysqld should default to 'REQUIRE X509' for users connecting
    * over IP.
@@ -2798,6 +2812,9 @@
     if (_json.containsKey("enabled")) {
       enabled = _json["enabled"];
     }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
     if (_json.containsKey("requireSsl")) {
       requireSsl = _json["requireSsl"];
     }
@@ -2811,6 +2828,9 @@
     if (enabled != null) {
       _json["enabled"] = enabled;
     }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
     if (requireSsl != null) {
       _json["requireSsl"] = requireSsl;
     }
diff --git a/generated/googleapis_beta/lib/src/common_internal.dart b/generated/googleapis_beta/lib/src/common_internal.dart
index 180b38e..f5872c5 100644
--- a/generated/googleapis_beta/lib/src/common_internal.dart
+++ b/generated/googleapis_beta/lib/src/common_internal.dart
@@ -9,7 +9,7 @@
 import "package:http/http.dart" as http;
 
 const String USER_AGENT_STRING =
-    'google-api-dart-client googleapis_beta/0.4.0';
+    'google-api-dart-client googleapis_beta/0.5.0';
 
 const CONTENT_TYPE_JSON_UTF8 = 'application/json; charset=utf-8';
 
@@ -482,8 +482,8 @@
                   'Received less bytes than indicated by [Media.length].'));
               return;
             } else if (end > _uploadMedia.length) {
-              completer.completeError(
-                  'Received more bytes than indicated by [Media.length].');
+              completer.completeError(new common_external.ApiRequestError(
+                  'Received more bytes than indicated by [Media.length].'));
               return;
             }
           }
diff --git a/generated/googleapis_beta/pubspec.yaml b/generated/googleapis_beta/pubspec.yaml
index 311f4b2..ad31864 100644
--- a/generated/googleapis_beta/pubspec.yaml
+++ b/generated/googleapis_beta/pubspec.yaml
@@ -1,7 +1,7 @@
 name: googleapis_beta
-version: 0.4.0
+version: 0.5.0
 author: Dart Team <misc@dartlang.org>
-description: "Auto-generated client libraries for accessing the following APIs:autoscaler:v1beta2, cloudmonitoring:v2beta1, datastore:v1beta2, dns:v1beta1, genomics:v1beta, manager:v1beta2, pubsub:v1beta1, replicapool:v1beta1, resourceviews:v1beta1, resourceviews:v1beta2, sqladmin:v1beta3, taskqueue:v1beta2"
+description: "Auto-generated client libraries for accessing the following APIs:autoscaler:v1beta2, cloudmonitoring:v2beta1, container:v1beta1, datastore:v1beta2, dns:v1beta1, genomics:v1beta, genomics:v1beta2, manager:v1beta2, pubsub:v1beta1, replicapool:v1beta2, replicapoolupdater:v1beta1, resourceviews:v1beta1, resourceviews:v1beta2, sqladmin:v1beta3, taskqueue:v1beta2"
 homepage: http://www.dartlang.org/googleapis/
 environment:
   sdk: '>=1.0.0 <2.0.0'
diff --git a/generated/googleapis_beta/test/autoscaler/v1beta2_test.dart b/generated/googleapis_beta/test/autoscaler/v1beta2_test.dart
index 9dd1245..956a442 100644
--- a/generated/googleapis_beta/test/autoscaler/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/autoscaler/v1beta2_test.dart
@@ -49,14 +49,14 @@
   buildCounterAutoscaler--;
 }
 
-buildUnnamed1207() {
+buildUnnamed1162() {
   var o = new core.List<api.Autoscaler>();
   o.add(buildAutoscaler());
   o.add(buildAutoscaler());
   return o;
 }
 
-checkUnnamed1207(core.List<api.Autoscaler> o) {
+checkUnnamed1162(core.List<api.Autoscaler> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAutoscaler(o[0]);
   checkAutoscaler(o[1]);
@@ -67,7 +67,7 @@
   var o = new api.AutoscalerListResponse();
   buildCounterAutoscalerListResponse++;
   if (buildCounterAutoscalerListResponse < 3) {
-    o.items = buildUnnamed1207();
+    o.items = buildUnnamed1162();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -78,21 +78,21 @@
 checkAutoscalerListResponse(api.AutoscalerListResponse o) {
   buildCounterAutoscalerListResponse++;
   if (buildCounterAutoscalerListResponse < 3) {
-    checkUnnamed1207(o.items);
+    checkUnnamed1162(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterAutoscalerListResponse--;
 }
 
-buildUnnamed1208() {
+buildUnnamed1163() {
   var o = new core.List<api.AutoscalingPolicyCustomMetricUtilization>();
   o.add(buildAutoscalingPolicyCustomMetricUtilization());
   o.add(buildAutoscalingPolicyCustomMetricUtilization());
   return o;
 }
 
-checkUnnamed1208(core.List<api.AutoscalingPolicyCustomMetricUtilization> o) {
+checkUnnamed1163(core.List<api.AutoscalingPolicyCustomMetricUtilization> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAutoscalingPolicyCustomMetricUtilization(o[0]);
   checkAutoscalingPolicyCustomMetricUtilization(o[1]);
@@ -105,7 +105,7 @@
   if (buildCounterAutoscalingPolicy < 3) {
     o.coolDownPeriodSec = 42;
     o.cpuUtilization = buildAutoscalingPolicyCpuUtilization();
-    o.customMetricUtilizations = buildUnnamed1208();
+    o.customMetricUtilizations = buildUnnamed1163();
     o.loadBalancingUtilization = buildAutoscalingPolicyLoadBalancingUtilization();
     o.maxNumReplicas = 42;
     o.minNumReplicas = 42;
@@ -119,7 +119,7 @@
   if (buildCounterAutoscalingPolicy < 3) {
     unittest.expect(o.coolDownPeriodSec, unittest.equals(42));
     checkAutoscalingPolicyCpuUtilization(o.cpuUtilization);
-    checkUnnamed1208(o.customMetricUtilizations);
+    checkUnnamed1163(o.customMetricUtilizations);
     checkAutoscalingPolicyLoadBalancingUtilization(o.loadBalancingUtilization);
     unittest.expect(o.maxNumReplicas, unittest.equals(42));
     unittest.expect(o.minNumReplicas, unittest.equals(42));
@@ -188,6 +188,33 @@
   buildCounterAutoscalingPolicyLoadBalancingUtilization--;
 }
 
+core.int buildCounterDeprecationStatus = 0;
+buildDeprecationStatus() {
+  var o = new api.DeprecationStatus();
+  buildCounterDeprecationStatus++;
+  if (buildCounterDeprecationStatus < 3) {
+    o.deleted = "foo";
+    o.deprecated = "foo";
+    o.obsolete = "foo";
+    o.replacement = "foo";
+    o.state = "foo";
+  }
+  buildCounterDeprecationStatus--;
+  return o;
+}
+
+checkDeprecationStatus(api.DeprecationStatus o) {
+  buildCounterDeprecationStatus++;
+  if (buildCounterDeprecationStatus < 3) {
+    unittest.expect(o.deleted, unittest.equals('foo'));
+    unittest.expect(o.deprecated, unittest.equals('foo'));
+    unittest.expect(o.obsolete, unittest.equals('foo'));
+    unittest.expect(o.replacement, unittest.equals('foo'));
+    unittest.expect(o.state, unittest.equals('foo'));
+  }
+  buildCounterDeprecationStatus--;
+}
+
 core.int buildCounterOperationErrorErrors = 0;
 buildOperationErrorErrors() {
   var o = new api.OperationErrorErrors();
@@ -211,14 +238,14 @@
   buildCounterOperationErrorErrors--;
 }
 
-buildUnnamed1209() {
+buildUnnamed1164() {
   var o = new core.List<api.OperationErrorErrors>();
   o.add(buildOperationErrorErrors());
   o.add(buildOperationErrorErrors());
   return o;
 }
 
-checkUnnamed1209(core.List<api.OperationErrorErrors> o) {
+checkUnnamed1164(core.List<api.OperationErrorErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationErrorErrors(o[0]);
   checkOperationErrorErrors(o[1]);
@@ -229,7 +256,7 @@
   var o = new api.OperationError();
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    o.errors = buildUnnamed1209();
+    o.errors = buildUnnamed1164();
   }
   buildCounterOperationError--;
   return o;
@@ -238,7 +265,7 @@
 checkOperationError(api.OperationError o) {
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    checkUnnamed1209(o.errors);
+    checkUnnamed1164(o.errors);
   }
   buildCounterOperationError--;
 }
@@ -264,14 +291,14 @@
   buildCounterOperationWarningsData--;
 }
 
-buildUnnamed1210() {
+buildUnnamed1165() {
   var o = new core.List<api.OperationWarningsData>();
   o.add(buildOperationWarningsData());
   o.add(buildOperationWarningsData());
   return o;
 }
 
-checkUnnamed1210(core.List<api.OperationWarningsData> o) {
+checkUnnamed1165(core.List<api.OperationWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarningsData(o[0]);
   checkOperationWarningsData(o[1]);
@@ -283,7 +310,7 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed1210();
+    o.data = buildUnnamed1165();
     o.message = "foo";
   }
   buildCounterOperationWarnings--;
@@ -294,20 +321,20 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed1210(o.data);
+    checkUnnamed1165(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterOperationWarnings--;
 }
 
-buildUnnamed1211() {
+buildUnnamed1166() {
   var o = new core.List<api.OperationWarnings>();
   o.add(buildOperationWarnings());
   o.add(buildOperationWarnings());
   return o;
 }
 
-checkUnnamed1211(core.List<api.OperationWarnings> o) {
+checkUnnamed1166(core.List<api.OperationWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarnings(o[0]);
   checkOperationWarnings(o[1]);
@@ -338,7 +365,7 @@
     o.targetId = "foo";
     o.targetLink = "foo";
     o.user = "foo";
-    o.warnings = buildUnnamed1211();
+    o.warnings = buildUnnamed1166();
     o.zone = "foo";
   }
   buildCounterOperation--;
@@ -368,20 +395,20 @@
     unittest.expect(o.targetId, unittest.equals('foo'));
     unittest.expect(o.targetLink, unittest.equals('foo'));
     unittest.expect(o.user, unittest.equals('foo'));
-    checkUnnamed1211(o.warnings);
+    checkUnnamed1166(o.warnings);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterOperation--;
 }
 
-buildUnnamed1212() {
+buildUnnamed1167() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed1212(core.List<api.Operation> o) {
+checkUnnamed1167(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -393,7 +420,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed1212();
+    o.items = buildUnnamed1167();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -406,7 +433,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1212(o.items);
+    checkUnnamed1167(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -414,6 +441,121 @@
   buildCounterOperationList--;
 }
 
+core.int buildCounterZoneMaintenanceWindows = 0;
+buildZoneMaintenanceWindows() {
+  var o = new api.ZoneMaintenanceWindows();
+  buildCounterZoneMaintenanceWindows++;
+  if (buildCounterZoneMaintenanceWindows < 3) {
+    o.beginTime = "foo";
+    o.description = "foo";
+    o.endTime = "foo";
+    o.name = "foo";
+  }
+  buildCounterZoneMaintenanceWindows--;
+  return o;
+}
+
+checkZoneMaintenanceWindows(api.ZoneMaintenanceWindows o) {
+  buildCounterZoneMaintenanceWindows++;
+  if (buildCounterZoneMaintenanceWindows < 3) {
+    unittest.expect(o.beginTime, unittest.equals('foo'));
+    unittest.expect(o.description, unittest.equals('foo'));
+    unittest.expect(o.endTime, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+  }
+  buildCounterZoneMaintenanceWindows--;
+}
+
+buildUnnamed1168() {
+  var o = new core.List<api.ZoneMaintenanceWindows>();
+  o.add(buildZoneMaintenanceWindows());
+  o.add(buildZoneMaintenanceWindows());
+  return o;
+}
+
+checkUnnamed1168(core.List<api.ZoneMaintenanceWindows> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkZoneMaintenanceWindows(o[0]);
+  checkZoneMaintenanceWindows(o[1]);
+}
+
+core.int buildCounterZone = 0;
+buildZone() {
+  var o = new api.Zone();
+  buildCounterZone++;
+  if (buildCounterZone < 3) {
+    o.creationTimestamp = "foo";
+    o.deprecated = buildDeprecationStatus();
+    o.description = "foo";
+    o.id = "foo";
+    o.kind = "foo";
+    o.maintenanceWindows = buildUnnamed1168();
+    o.name = "foo";
+    o.region = "foo";
+    o.selfLink = "foo";
+    o.status = "foo";
+  }
+  buildCounterZone--;
+  return o;
+}
+
+checkZone(api.Zone o) {
+  buildCounterZone++;
+  if (buildCounterZone < 3) {
+    unittest.expect(o.creationTimestamp, unittest.equals('foo'));
+    checkDeprecationStatus(o.deprecated);
+    unittest.expect(o.description, unittest.equals('foo'));
+    unittest.expect(o.id, unittest.equals('foo'));
+    unittest.expect(o.kind, unittest.equals('foo'));
+    checkUnnamed1168(o.maintenanceWindows);
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.region, unittest.equals('foo'));
+    unittest.expect(o.selfLink, unittest.equals('foo'));
+    unittest.expect(o.status, unittest.equals('foo'));
+  }
+  buildCounterZone--;
+}
+
+buildUnnamed1169() {
+  var o = new core.List<api.Zone>();
+  o.add(buildZone());
+  o.add(buildZone());
+  return o;
+}
+
+checkUnnamed1169(core.List<api.Zone> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkZone(o[0]);
+  checkZone(o[1]);
+}
+
+core.int buildCounterZoneList = 0;
+buildZoneList() {
+  var o = new api.ZoneList();
+  buildCounterZoneList++;
+  if (buildCounterZoneList < 3) {
+    o.id = "foo";
+    o.items = buildUnnamed1169();
+    o.kind = "foo";
+    o.nextPageToken = "foo";
+    o.selfLink = "foo";
+  }
+  buildCounterZoneList--;
+  return o;
+}
+
+checkZoneList(api.ZoneList o) {
+  buildCounterZoneList++;
+  if (buildCounterZoneList < 3) {
+    unittest.expect(o.id, unittest.equals('foo'));
+    checkUnnamed1169(o.items);
+    unittest.expect(o.kind, unittest.equals('foo'));
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+    unittest.expect(o.selfLink, unittest.equals('foo'));
+  }
+  buildCounterZoneList--;
+}
+
 
 main() {
   unittest.group("obj-schema-Autoscaler", () {
@@ -470,6 +612,15 @@
   });
 
 
+  unittest.group("obj-schema-DeprecationStatus", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildDeprecationStatus();
+      var od = new api.DeprecationStatus.fromJson(o.toJson());
+      checkDeprecationStatus(od);
+    });
+  });
+
+
   unittest.group("obj-schema-OperationErrorErrors", () {
     unittest.test("to-json--from-json", () {
       var o = buildOperationErrorErrors();
@@ -524,6 +675,33 @@
   });
 
 
+  unittest.group("obj-schema-ZoneMaintenanceWindows", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildZoneMaintenanceWindows();
+      var od = new api.ZoneMaintenanceWindows.fromJson(o.toJson());
+      checkZoneMaintenanceWindows(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-Zone", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildZone();
+      var od = new api.Zone.fromJson(o.toJson());
+      checkZone(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ZoneList", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildZoneList();
+      var od = new api.ZoneList.fromJson(o.toJson());
+      checkZoneList(od);
+    });
+  });
+
+
   unittest.group("resource-AutoscalersResourceApi", () {
     unittest.test("method--delete", () {
 
@@ -1067,5 +1245,57 @@
   });
 
 
+  unittest.group("resource-ZonesResourceApi", () {
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ZonesResourceApi res = new api.AutoscalerApi(mock).zones;
+      var arg_project = "foo";
+      var arg_filter = "foo";
+      var arg_maxResults = 42;
+      var arg_pageToken = "foo";
+      mock.register(unittest.expectAsync((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;
+
+        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["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));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildZoneList());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_project, filter: arg_filter, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync(((api.ZoneList response) {
+        checkZoneList(response);
+      })));
+    });
+
+  });
+
+
 }
 
diff --git a/generated/googleapis_beta/test/cloudmonitoring/v2beta1_test.dart b/generated/googleapis_beta/test/cloudmonitoring/v2beta1_test.dart
index 67ba0ee..47fd5bc 100644
--- a/generated/googleapis_beta/test/cloudmonitoring/v2beta1_test.dart
+++ b/generated/googleapis_beta/test/cloudmonitoring/v2beta1_test.dart
@@ -35,14 +35,14 @@
   buildCounterListMetricDescriptorsRequest--;
 }
 
-buildUnnamed1270() {
+buildUnnamed1170() {
   var o = new core.List<api.MetricDescriptor>();
   o.add(buildMetricDescriptor());
   o.add(buildMetricDescriptor());
   return o;
 }
 
-checkUnnamed1270(core.List<api.MetricDescriptor> o) {
+checkUnnamed1170(core.List<api.MetricDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricDescriptor(o[0]);
   checkMetricDescriptor(o[1]);
@@ -54,7 +54,7 @@
   buildCounterListMetricDescriptorsResponse++;
   if (buildCounterListMetricDescriptorsResponse < 3) {
     o.kind = "foo";
-    o.metrics = buildUnnamed1270();
+    o.metrics = buildUnnamed1170();
     o.nextPageToken = "foo";
   }
   buildCounterListMetricDescriptorsResponse--;
@@ -65,7 +65,7 @@
   buildCounterListMetricDescriptorsResponse++;
   if (buildCounterListMetricDescriptorsResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1270(o.metrics);
+    checkUnnamed1170(o.metrics);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListMetricDescriptorsResponse--;
@@ -90,14 +90,14 @@
   buildCounterListTimeseriesDescriptorsRequest--;
 }
 
-buildUnnamed1271() {
+buildUnnamed1171() {
   var o = new core.List<api.TimeseriesDescriptor>();
   o.add(buildTimeseriesDescriptor());
   o.add(buildTimeseriesDescriptor());
   return o;
 }
 
-checkUnnamed1271(core.List<api.TimeseriesDescriptor> o) {
+checkUnnamed1171(core.List<api.TimeseriesDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTimeseriesDescriptor(o[0]);
   checkTimeseriesDescriptor(o[1]);
@@ -111,7 +111,7 @@
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.oldest = core.DateTime.parse("2002-02-27T14:01:02");
-    o.timeseries = buildUnnamed1271();
+    o.timeseries = buildUnnamed1171();
     o.youngest = core.DateTime.parse("2002-02-27T14:01:02");
   }
   buildCounterListTimeseriesDescriptorsResponse--;
@@ -124,7 +124,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.oldest, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed1271(o.timeseries);
+    checkUnnamed1171(o.timeseries);
     unittest.expect(o.youngest, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterListTimeseriesDescriptorsResponse--;
@@ -149,14 +149,14 @@
   buildCounterListTimeseriesRequest--;
 }
 
-buildUnnamed1272() {
+buildUnnamed1172() {
   var o = new core.List<api.Timeseries>();
   o.add(buildTimeseries());
   o.add(buildTimeseries());
   return o;
 }
 
-checkUnnamed1272(core.List<api.Timeseries> o) {
+checkUnnamed1172(core.List<api.Timeseries> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTimeseries(o[0]);
   checkTimeseries(o[1]);
@@ -170,7 +170,7 @@
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.oldest = core.DateTime.parse("2002-02-27T14:01:02");
-    o.timeseries = buildUnnamed1272();
+    o.timeseries = buildUnnamed1172();
     o.youngest = core.DateTime.parse("2002-02-27T14:01:02");
   }
   buildCounterListTimeseriesResponse--;
@@ -183,20 +183,20 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.oldest, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed1272(o.timeseries);
+    checkUnnamed1172(o.timeseries);
     unittest.expect(o.youngest, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterListTimeseriesResponse--;
 }
 
-buildUnnamed1273() {
+buildUnnamed1173() {
   var o = new core.List<api.MetricDescriptorLabelDescriptor>();
   o.add(buildMetricDescriptorLabelDescriptor());
   o.add(buildMetricDescriptorLabelDescriptor());
   return o;
 }
 
-checkUnnamed1273(core.List<api.MetricDescriptorLabelDescriptor> o) {
+checkUnnamed1173(core.List<api.MetricDescriptorLabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricDescriptorLabelDescriptor(o[0]);
   checkMetricDescriptorLabelDescriptor(o[1]);
@@ -208,7 +208,7 @@
   buildCounterMetricDescriptor++;
   if (buildCounterMetricDescriptor < 3) {
     o.description = "foo";
-    o.labels = buildUnnamed1273();
+    o.labels = buildUnnamed1173();
     o.name = "foo";
     o.project = "foo";
     o.typeDescriptor = buildMetricDescriptorTypeDescriptor();
@@ -221,7 +221,7 @@
   buildCounterMetricDescriptor++;
   if (buildCounterMetricDescriptor < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1273(o.labels);
+    checkUnnamed1173(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.project, unittest.equals('foo'));
     checkMetricDescriptorTypeDescriptor(o.typeDescriptor);
@@ -302,14 +302,14 @@
   buildCounterPoint--;
 }
 
-buildUnnamed1274() {
+buildUnnamed1174() {
   var o = new core.List<api.PointDistributionBucket>();
   o.add(buildPointDistributionBucket());
   o.add(buildPointDistributionBucket());
   return o;
 }
 
-checkUnnamed1274(core.List<api.PointDistributionBucket> o) {
+checkUnnamed1174(core.List<api.PointDistributionBucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPointDistributionBucket(o[0]);
   checkPointDistributionBucket(o[1]);
@@ -320,7 +320,7 @@
   var o = new api.PointDistribution();
   buildCounterPointDistribution++;
   if (buildCounterPointDistribution < 3) {
-    o.buckets = buildUnnamed1274();
+    o.buckets = buildUnnamed1174();
     o.overflowBucket = buildPointDistributionOverflowBucket();
     o.underflowBucket = buildPointDistributionUnderflowBucket();
   }
@@ -331,7 +331,7 @@
 checkPointDistribution(api.PointDistribution o) {
   buildCounterPointDistribution++;
   if (buildCounterPointDistribution < 3) {
-    checkUnnamed1274(o.buckets);
+    checkUnnamed1174(o.buckets);
     checkPointDistributionOverflowBucket(o.overflowBucket);
     checkPointDistributionUnderflowBucket(o.underflowBucket);
   }
@@ -403,14 +403,14 @@
   buildCounterPointDistributionUnderflowBucket--;
 }
 
-buildUnnamed1275() {
+buildUnnamed1175() {
   var o = new core.List<api.Point>();
   o.add(buildPoint());
   o.add(buildPoint());
   return o;
 }
 
-checkUnnamed1275(core.List<api.Point> o) {
+checkUnnamed1175(core.List<api.Point> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPoint(o[0]);
   checkPoint(o[1]);
@@ -421,7 +421,7 @@
   var o = new api.Timeseries();
   buildCounterTimeseries++;
   if (buildCounterTimeseries < 3) {
-    o.points = buildUnnamed1275();
+    o.points = buildUnnamed1175();
     o.timeseriesDesc = buildTimeseriesDescriptor();
   }
   buildCounterTimeseries--;
@@ -431,20 +431,20 @@
 checkTimeseries(api.Timeseries o) {
   buildCounterTimeseries++;
   if (buildCounterTimeseries < 3) {
-    checkUnnamed1275(o.points);
+    checkUnnamed1175(o.points);
     checkTimeseriesDescriptor(o.timeseriesDesc);
   }
   buildCounterTimeseries--;
 }
 
-buildUnnamed1276() {
+buildUnnamed1176() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1276(core.Map<core.String, core.String> o) {
+checkUnnamed1176(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'));
@@ -455,7 +455,7 @@
   var o = new api.TimeseriesDescriptor();
   buildCounterTimeseriesDescriptor++;
   if (buildCounterTimeseriesDescriptor < 3) {
-    o.labels = buildUnnamed1276();
+    o.labels = buildUnnamed1176();
     o.metric = "foo";
     o.project = "foo";
   }
@@ -466,7 +466,7 @@
 checkTimeseriesDescriptor(api.TimeseriesDescriptor o) {
   buildCounterTimeseriesDescriptor++;
   if (buildCounterTimeseriesDescriptor < 3) {
-    checkUnnamed1276(o.labels);
+    checkUnnamed1176(o.labels);
     unittest.expect(o.metric, unittest.equals('foo'));
     unittest.expect(o.project, unittest.equals('foo'));
   }
@@ -494,27 +494,27 @@
   buildCounterTimeseriesDescriptorLabel--;
 }
 
-buildUnnamed1277() {
+buildUnnamed1177() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1277(core.List<core.String> o) {
+checkUnnamed1177(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1278() {
+buildUnnamed1178() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1278(core.List<core.String> o) {
+checkUnnamed1178(core.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,7 +741,7 @@
       var arg_metric = "foo";
       var arg_youngest = "foo";
       var arg_count = 42;
-      var arg_labels = buildUnnamed1277();
+      var arg_labels = buildUnnamed1177();
       var arg_oldest = "foo";
       var arg_pageToken = "foo";
       var arg_timespan = "foo";
@@ -804,7 +804,7 @@
       var arg_metric = "foo";
       var arg_youngest = "foo";
       var arg_count = 42;
-      var arg_labels = buildUnnamed1278();
+      var arg_labels = buildUnnamed1178();
       var arg_oldest = "foo";
       var arg_pageToken = "foo";
       var arg_timespan = "foo";
diff --git a/generated/googleapis_beta/test/container/v1beta1_test.dart b/generated/googleapis_beta/test/container/v1beta1_test.dart
new file mode 100644
index 0000000..741b723
--- /dev/null
+++ b/generated/googleapis_beta/test/container/v1beta1_test.dart
@@ -0,0 +1,731 @@
+library googleapis_beta.container.v1beta1.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:unittest/unittest.dart' as unittest;
+import 'package:googleapis_beta/common/common.dart' as common;
+import 'package:googleapis_beta/src/common_internal.dart' as common_internal;
+import '../common/common_internal_test.dart' as common_test;
+
+import 'package:googleapis_beta/container/v1beta1.dart' as api;
+
+
+
+core.int buildCounterCluster = 0;
+buildCluster() {
+  var o = new api.Cluster();
+  buildCounterCluster++;
+  if (buildCounterCluster < 3) {
+    o.clusterApiVersion = "foo";
+    o.containerIpv4Cidr = "foo";
+    o.creationTimestamp = "foo";
+    o.description = "foo";
+    o.endpoint = "foo";
+    o.masterAuth = buildMasterAuth();
+    o.name = "foo";
+    o.nodeConfig = buildNodeConfig();
+    o.nodeRoutingPrefixSize = 42;
+    o.numNodes = 42;
+    o.servicesIpv4Cidr = "foo";
+    o.status = "foo";
+    o.statusMessage = "foo";
+    o.zone = "foo";
+  }
+  buildCounterCluster--;
+  return o;
+}
+
+checkCluster(api.Cluster o) {
+  buildCounterCluster++;
+  if (buildCounterCluster < 3) {
+    unittest.expect(o.clusterApiVersion, unittest.equals('foo'));
+    unittest.expect(o.containerIpv4Cidr, unittest.equals('foo'));
+    unittest.expect(o.creationTimestamp, unittest.equals('foo'));
+    unittest.expect(o.description, unittest.equals('foo'));
+    unittest.expect(o.endpoint, unittest.equals('foo'));
+    checkMasterAuth(o.masterAuth);
+    unittest.expect(o.name, unittest.equals('foo'));
+    checkNodeConfig(o.nodeConfig);
+    unittest.expect(o.nodeRoutingPrefixSize, unittest.equals(42));
+    unittest.expect(o.numNodes, unittest.equals(42));
+    unittest.expect(o.servicesIpv4Cidr, unittest.equals('foo'));
+    unittest.expect(o.status, unittest.equals('foo'));
+    unittest.expect(o.statusMessage, unittest.equals('foo'));
+    unittest.expect(o.zone, unittest.equals('foo'));
+  }
+  buildCounterCluster--;
+}
+
+core.int buildCounterCreateClusterRequest = 0;
+buildCreateClusterRequest() {
+  var o = new api.CreateClusterRequest();
+  buildCounterCreateClusterRequest++;
+  if (buildCounterCreateClusterRequest < 3) {
+    o.cluster = buildCluster();
+  }
+  buildCounterCreateClusterRequest--;
+  return o;
+}
+
+checkCreateClusterRequest(api.CreateClusterRequest o) {
+  buildCounterCreateClusterRequest++;
+  if (buildCounterCreateClusterRequest < 3) {
+    checkCluster(o.cluster);
+  }
+  buildCounterCreateClusterRequest--;
+}
+
+buildUnnamed1179() {
+  var o = new core.List<api.Cluster>();
+  o.add(buildCluster());
+  o.add(buildCluster());
+  return o;
+}
+
+checkUnnamed1179(core.List<api.Cluster> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkCluster(o[0]);
+  checkCluster(o[1]);
+}
+
+core.int buildCounterListAggregatedClustersResponse = 0;
+buildListAggregatedClustersResponse() {
+  var o = new api.ListAggregatedClustersResponse();
+  buildCounterListAggregatedClustersResponse++;
+  if (buildCounterListAggregatedClustersResponse < 3) {
+    o.clusters = buildUnnamed1179();
+  }
+  buildCounterListAggregatedClustersResponse--;
+  return o;
+}
+
+checkListAggregatedClustersResponse(api.ListAggregatedClustersResponse o) {
+  buildCounterListAggregatedClustersResponse++;
+  if (buildCounterListAggregatedClustersResponse < 3) {
+    checkUnnamed1179(o.clusters);
+  }
+  buildCounterListAggregatedClustersResponse--;
+}
+
+buildUnnamed1180() {
+  var o = new core.List<api.Operation>();
+  o.add(buildOperation());
+  o.add(buildOperation());
+  return o;
+}
+
+checkUnnamed1180(core.List<api.Operation> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkOperation(o[0]);
+  checkOperation(o[1]);
+}
+
+core.int buildCounterListAggregatedOperationsResponse = 0;
+buildListAggregatedOperationsResponse() {
+  var o = new api.ListAggregatedOperationsResponse();
+  buildCounterListAggregatedOperationsResponse++;
+  if (buildCounterListAggregatedOperationsResponse < 3) {
+    o.operations = buildUnnamed1180();
+  }
+  buildCounterListAggregatedOperationsResponse--;
+  return o;
+}
+
+checkListAggregatedOperationsResponse(api.ListAggregatedOperationsResponse o) {
+  buildCounterListAggregatedOperationsResponse++;
+  if (buildCounterListAggregatedOperationsResponse < 3) {
+    checkUnnamed1180(o.operations);
+  }
+  buildCounterListAggregatedOperationsResponse--;
+}
+
+buildUnnamed1181() {
+  var o = new core.List<api.Cluster>();
+  o.add(buildCluster());
+  o.add(buildCluster());
+  return o;
+}
+
+checkUnnamed1181(core.List<api.Cluster> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkCluster(o[0]);
+  checkCluster(o[1]);
+}
+
+core.int buildCounterListClustersResponse = 0;
+buildListClustersResponse() {
+  var o = new api.ListClustersResponse();
+  buildCounterListClustersResponse++;
+  if (buildCounterListClustersResponse < 3) {
+    o.clusters = buildUnnamed1181();
+  }
+  buildCounterListClustersResponse--;
+  return o;
+}
+
+checkListClustersResponse(api.ListClustersResponse o) {
+  buildCounterListClustersResponse++;
+  if (buildCounterListClustersResponse < 3) {
+    checkUnnamed1181(o.clusters);
+  }
+  buildCounterListClustersResponse--;
+}
+
+buildUnnamed1182() {
+  var o = new core.List<api.Operation>();
+  o.add(buildOperation());
+  o.add(buildOperation());
+  return o;
+}
+
+checkUnnamed1182(core.List<api.Operation> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkOperation(o[0]);
+  checkOperation(o[1]);
+}
+
+core.int buildCounterListOperationsResponse = 0;
+buildListOperationsResponse() {
+  var o = new api.ListOperationsResponse();
+  buildCounterListOperationsResponse++;
+  if (buildCounterListOperationsResponse < 3) {
+    o.operations = buildUnnamed1182();
+  }
+  buildCounterListOperationsResponse--;
+  return o;
+}
+
+checkListOperationsResponse(api.ListOperationsResponse o) {
+  buildCounterListOperationsResponse++;
+  if (buildCounterListOperationsResponse < 3) {
+    checkUnnamed1182(o.operations);
+  }
+  buildCounterListOperationsResponse--;
+}
+
+core.int buildCounterMasterAuth = 0;
+buildMasterAuth() {
+  var o = new api.MasterAuth();
+  buildCounterMasterAuth++;
+  if (buildCounterMasterAuth < 3) {
+    o.password = "foo";
+    o.user = "foo";
+  }
+  buildCounterMasterAuth--;
+  return o;
+}
+
+checkMasterAuth(api.MasterAuth o) {
+  buildCounterMasterAuth++;
+  if (buildCounterMasterAuth < 3) {
+    unittest.expect(o.password, unittest.equals('foo'));
+    unittest.expect(o.user, unittest.equals('foo'));
+  }
+  buildCounterMasterAuth--;
+}
+
+core.int buildCounterNodeConfig = 0;
+buildNodeConfig() {
+  var o = new api.NodeConfig();
+  buildCounterNodeConfig++;
+  if (buildCounterNodeConfig < 3) {
+    o.machineType = "foo";
+    o.sourceImage = "foo";
+  }
+  buildCounterNodeConfig--;
+  return o;
+}
+
+checkNodeConfig(api.NodeConfig o) {
+  buildCounterNodeConfig++;
+  if (buildCounterNodeConfig < 3) {
+    unittest.expect(o.machineType, unittest.equals('foo'));
+    unittest.expect(o.sourceImage, unittest.equals('foo'));
+  }
+  buildCounterNodeConfig--;
+}
+
+core.int buildCounterOperation = 0;
+buildOperation() {
+  var o = new api.Operation();
+  buildCounterOperation++;
+  if (buildCounterOperation < 3) {
+    o.errorMessage = "foo";
+    o.name = "foo";
+    o.operationType = "foo";
+    o.status = "foo";
+    o.target = "foo";
+    o.zone = "foo";
+  }
+  buildCounterOperation--;
+  return o;
+}
+
+checkOperation(api.Operation o) {
+  buildCounterOperation++;
+  if (buildCounterOperation < 3) {
+    unittest.expect(o.errorMessage, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.operationType, unittest.equals('foo'));
+    unittest.expect(o.status, unittest.equals('foo'));
+    unittest.expect(o.target, unittest.equals('foo'));
+    unittest.expect(o.zone, unittest.equals('foo'));
+  }
+  buildCounterOperation--;
+}
+
+
+main() {
+  unittest.group("obj-schema-Cluster", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildCluster();
+      var od = new api.Cluster.fromJson(o.toJson());
+      checkCluster(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-CreateClusterRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildCreateClusterRequest();
+      var od = new api.CreateClusterRequest.fromJson(o.toJson());
+      checkCreateClusterRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ListAggregatedClustersResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListAggregatedClustersResponse();
+      var od = new api.ListAggregatedClustersResponse.fromJson(o.toJson());
+      checkListAggregatedClustersResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ListAggregatedOperationsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListAggregatedOperationsResponse();
+      var od = new api.ListAggregatedOperationsResponse.fromJson(o.toJson());
+      checkListAggregatedOperationsResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ListClustersResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListClustersResponse();
+      var od = new api.ListClustersResponse.fromJson(o.toJson());
+      checkListClustersResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ListOperationsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListOperationsResponse();
+      var od = new api.ListOperationsResponse.fromJson(o.toJson());
+      checkListOperationsResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-MasterAuth", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildMasterAuth();
+      var od = new api.MasterAuth.fromJson(o.toJson());
+      checkMasterAuth(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-NodeConfig", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildNodeConfig();
+      var od = new api.NodeConfig.fromJson(o.toJson());
+      checkNodeConfig(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-Operation", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildOperation();
+      var od = new api.Operation.fromJson(o.toJson());
+      checkOperation(od);
+    });
+  });
+
+
+  unittest.group("resource-ProjectsClustersResourceApi", () {
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ProjectsClustersResourceApi res = new api.ContainerApi(mock).projects.clusters;
+      var arg_projectId = "foo";
+      mock.register(unittest.expectAsync((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;
+
+        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(buildListAggregatedClustersResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_projectId).then(unittest.expectAsync(((api.ListAggregatedClustersResponse response) {
+        checkListAggregatedClustersResponse(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-ProjectsOperationsResourceApi", () {
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ProjectsOperationsResourceApi res = new api.ContainerApi(mock).projects.operations;
+      var arg_projectId = "foo";
+      mock.register(unittest.expectAsync((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;
+
+        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(buildListAggregatedOperationsResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_projectId).then(unittest.expectAsync(((api.ListAggregatedOperationsResponse response) {
+        checkListAggregatedOperationsResponse(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-ProjectsZonesClustersResourceApi", () {
+    unittest.test("method--create", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ProjectsZonesClustersResourceApi res = new api.ContainerApi(mock).projects.zones.clusters;
+      var arg_request = buildCreateClusterRequest();
+      var arg_projectId = "foo";
+      var arg_zoneId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.CreateClusterRequest.fromJson(json);
+        checkCreateClusterRequest(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+
+        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(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.create(arg_request, arg_projectId, arg_zoneId).then(unittest.expectAsync(((api.Operation response) {
+        checkOperation(response);
+      })));
+    });
+
+    unittest.test("method--delete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ProjectsZonesClustersResourceApi res = new api.ContainerApi(mock).projects.zones.clusters;
+      var arg_projectId = "foo";
+      var arg_zoneId = "foo";
+      var arg_clusterId = "foo";
+      mock.register(unittest.expectAsync((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;
+
+        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(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.delete(arg_projectId, arg_zoneId, arg_clusterId).then(unittest.expectAsync(((api.Operation response) {
+        checkOperation(response);
+      })));
+    });
+
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ProjectsZonesClustersResourceApi res = new api.ContainerApi(mock).projects.zones.clusters;
+      var arg_projectId = "foo";
+      var arg_zoneId = "foo";
+      var arg_clusterId = "foo";
+      mock.register(unittest.expectAsync((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;
+
+        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(buildCluster());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_projectId, arg_zoneId, arg_clusterId).then(unittest.expectAsync(((api.Cluster response) {
+        checkCluster(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ProjectsZonesClustersResourceApi res = new api.ContainerApi(mock).projects.zones.clusters;
+      var arg_projectId = "foo";
+      var arg_zoneId = "foo";
+      mock.register(unittest.expectAsync((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;
+
+        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(buildListClustersResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_projectId, arg_zoneId).then(unittest.expectAsync(((api.ListClustersResponse response) {
+        checkListClustersResponse(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-ProjectsZonesOperationsResourceApi", () {
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ProjectsZonesOperationsResourceApi res = new api.ContainerApi(mock).projects.zones.operations;
+      var arg_projectId = "foo";
+      var arg_zoneId = "foo";
+      var arg_operationId = "foo";
+      mock.register(unittest.expectAsync((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;
+
+        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(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_projectId, arg_zoneId, arg_operationId).then(unittest.expectAsync(((api.Operation response) {
+        checkOperation(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ProjectsZonesOperationsResourceApi res = new api.ContainerApi(mock).projects.zones.operations;
+      var arg_projectId = "foo";
+      var arg_zoneId = "foo";
+      mock.register(unittest.expectAsync((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;
+
+        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(buildListOperationsResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_projectId, arg_zoneId).then(unittest.expectAsync(((api.ListOperationsResponse response) {
+        checkListOperationsResponse(response);
+      })));
+    });
+
+  });
+
+
+}
+
diff --git a/generated/googleapis_beta/test/datastore/v1beta2_test.dart b/generated/googleapis_beta/test/datastore/v1beta2_test.dart
index 78e80f8..2024a84 100644
--- a/generated/googleapis_beta/test/datastore/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/datastore/v1beta2_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed1279() {
+buildUnnamed1183() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed1279(core.List<api.Key> o) {
+checkUnnamed1183(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
@@ -34,7 +34,7 @@
   var o = new api.AllocateIdsRequest();
   buildCounterAllocateIdsRequest++;
   if (buildCounterAllocateIdsRequest < 3) {
-    o.keys = buildUnnamed1279();
+    o.keys = buildUnnamed1183();
   }
   buildCounterAllocateIdsRequest--;
   return o;
@@ -43,19 +43,19 @@
 checkAllocateIdsRequest(api.AllocateIdsRequest o) {
   buildCounterAllocateIdsRequest++;
   if (buildCounterAllocateIdsRequest < 3) {
-    checkUnnamed1279(o.keys);
+    checkUnnamed1183(o.keys);
   }
   buildCounterAllocateIdsRequest--;
 }
 
-buildUnnamed1280() {
+buildUnnamed1184() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed1280(core.List<api.Key> o) {
+checkUnnamed1184(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
@@ -67,7 +67,7 @@
   buildCounterAllocateIdsResponse++;
   if (buildCounterAllocateIdsResponse < 3) {
     o.header = buildResponseHeader();
-    o.keys = buildUnnamed1280();
+    o.keys = buildUnnamed1184();
   }
   buildCounterAllocateIdsResponse--;
   return o;
@@ -77,7 +77,7 @@
   buildCounterAllocateIdsResponse++;
   if (buildCounterAllocateIdsResponse < 3) {
     checkResponseHeader(o.header);
-    checkUnnamed1280(o.keys);
+    checkUnnamed1184(o.keys);
   }
   buildCounterAllocateIdsResponse--;
 }
@@ -168,14 +168,14 @@
   buildCounterCommitResponse--;
 }
 
-buildUnnamed1281() {
+buildUnnamed1185() {
   var o = new core.List<api.Filter>();
   o.add(buildFilter());
   o.add(buildFilter());
   return o;
 }
 
-checkUnnamed1281(core.List<api.Filter> o) {
+checkUnnamed1185(core.List<api.Filter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilter(o[0]);
   checkFilter(o[1]);
@@ -186,7 +186,7 @@
   var o = new api.CompositeFilter();
   buildCounterCompositeFilter++;
   if (buildCounterCompositeFilter < 3) {
-    o.filters = buildUnnamed1281();
+    o.filters = buildUnnamed1185();
     o.operator = "foo";
   }
   buildCounterCompositeFilter--;
@@ -196,20 +196,20 @@
 checkCompositeFilter(api.CompositeFilter o) {
   buildCounterCompositeFilter++;
   if (buildCounterCompositeFilter < 3) {
-    checkUnnamed1281(o.filters);
+    checkUnnamed1185(o.filters);
     unittest.expect(o.operator, unittest.equals('foo'));
   }
   buildCounterCompositeFilter--;
 }
 
-buildUnnamed1282() {
+buildUnnamed1186() {
   var o = new core.Map<core.String, api.Property>();
   o["x"] = buildProperty();
   o["y"] = buildProperty();
   return o;
 }
 
-checkUnnamed1282(core.Map<core.String, api.Property> o) {
+checkUnnamed1186(core.Map<core.String, api.Property> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProperty(o["x"]);
   checkProperty(o["y"]);
@@ -221,7 +221,7 @@
   buildCounterEntity++;
   if (buildCounterEntity < 3) {
     o.key = buildKey();
-    o.properties = buildUnnamed1282();
+    o.properties = buildUnnamed1186();
   }
   buildCounterEntity--;
   return o;
@@ -231,7 +231,7 @@
   buildCounterEntity++;
   if (buildCounterEntity < 3) {
     checkKey(o.key);
-    checkUnnamed1282(o.properties);
+    checkUnnamed1186(o.properties);
   }
   buildCounterEntity--;
 }
@@ -276,27 +276,27 @@
   buildCounterFilter--;
 }
 
-buildUnnamed1283() {
+buildUnnamed1187() {
   var o = new core.List<api.GqlQueryArg>();
   o.add(buildGqlQueryArg());
   o.add(buildGqlQueryArg());
   return o;
 }
 
-checkUnnamed1283(core.List<api.GqlQueryArg> o) {
+checkUnnamed1187(core.List<api.GqlQueryArg> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGqlQueryArg(o[0]);
   checkGqlQueryArg(o[1]);
 }
 
-buildUnnamed1284() {
+buildUnnamed1188() {
   var o = new core.List<api.GqlQueryArg>();
   o.add(buildGqlQueryArg());
   o.add(buildGqlQueryArg());
   return o;
 }
 
-checkUnnamed1284(core.List<api.GqlQueryArg> o) {
+checkUnnamed1188(core.List<api.GqlQueryArg> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGqlQueryArg(o[0]);
   checkGqlQueryArg(o[1]);
@@ -308,8 +308,8 @@
   buildCounterGqlQuery++;
   if (buildCounterGqlQuery < 3) {
     o.allowLiteral = true;
-    o.nameArgs = buildUnnamed1283();
-    o.numberArgs = buildUnnamed1284();
+    o.nameArgs = buildUnnamed1187();
+    o.numberArgs = buildUnnamed1188();
     o.queryString = "foo";
   }
   buildCounterGqlQuery--;
@@ -320,8 +320,8 @@
   buildCounterGqlQuery++;
   if (buildCounterGqlQuery < 3) {
     unittest.expect(o.allowLiteral, unittest.isTrue);
-    checkUnnamed1283(o.nameArgs);
-    checkUnnamed1284(o.numberArgs);
+    checkUnnamed1187(o.nameArgs);
+    checkUnnamed1188(o.numberArgs);
     unittest.expect(o.queryString, unittest.equals('foo'));
   }
   buildCounterGqlQuery--;
@@ -350,14 +350,14 @@
   buildCounterGqlQueryArg--;
 }
 
-buildUnnamed1285() {
+buildUnnamed1189() {
   var o = new core.List<api.KeyPathElement>();
   o.add(buildKeyPathElement());
   o.add(buildKeyPathElement());
   return o;
 }
 
-checkUnnamed1285(core.List<api.KeyPathElement> o) {
+checkUnnamed1189(core.List<api.KeyPathElement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKeyPathElement(o[0]);
   checkKeyPathElement(o[1]);
@@ -369,7 +369,7 @@
   buildCounterKey++;
   if (buildCounterKey < 3) {
     o.partitionId = buildPartitionId();
-    o.path = buildUnnamed1285();
+    o.path = buildUnnamed1189();
   }
   buildCounterKey--;
   return o;
@@ -379,7 +379,7 @@
   buildCounterKey++;
   if (buildCounterKey < 3) {
     checkPartitionId(o.partitionId);
-    checkUnnamed1285(o.path);
+    checkUnnamed1189(o.path);
   }
   buildCounterKey--;
 }
@@ -426,14 +426,14 @@
   buildCounterKindExpression--;
 }
 
-buildUnnamed1286() {
+buildUnnamed1190() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed1286(core.List<api.Key> o) {
+checkUnnamed1190(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
@@ -444,7 +444,7 @@
   var o = new api.LookupRequest();
   buildCounterLookupRequest++;
   if (buildCounterLookupRequest < 3) {
-    o.keys = buildUnnamed1286();
+    o.keys = buildUnnamed1190();
     o.readOptions = buildReadOptions();
   }
   buildCounterLookupRequest--;
@@ -454,46 +454,46 @@
 checkLookupRequest(api.LookupRequest o) {
   buildCounterLookupRequest++;
   if (buildCounterLookupRequest < 3) {
-    checkUnnamed1286(o.keys);
+    checkUnnamed1190(o.keys);
     checkReadOptions(o.readOptions);
   }
   buildCounterLookupRequest--;
 }
 
-buildUnnamed1287() {
+buildUnnamed1191() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed1287(core.List<api.Key> o) {
+checkUnnamed1191(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
 }
 
-buildUnnamed1288() {
+buildUnnamed1192() {
   var o = new core.List<api.EntityResult>();
   o.add(buildEntityResult());
   o.add(buildEntityResult());
   return o;
 }
 
-checkUnnamed1288(core.List<api.EntityResult> o) {
+checkUnnamed1192(core.List<api.EntityResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityResult(o[0]);
   checkEntityResult(o[1]);
 }
 
-buildUnnamed1289() {
+buildUnnamed1193() {
   var o = new core.List<api.EntityResult>();
   o.add(buildEntityResult());
   o.add(buildEntityResult());
   return o;
 }
 
-checkUnnamed1289(core.List<api.EntityResult> o) {
+checkUnnamed1193(core.List<api.EntityResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityResult(o[0]);
   checkEntityResult(o[1]);
@@ -504,10 +504,10 @@
   var o = new api.LookupResponse();
   buildCounterLookupResponse++;
   if (buildCounterLookupResponse < 3) {
-    o.deferred = buildUnnamed1287();
-    o.found = buildUnnamed1288();
+    o.deferred = buildUnnamed1191();
+    o.found = buildUnnamed1192();
     o.header = buildResponseHeader();
-    o.missing = buildUnnamed1289();
+    o.missing = buildUnnamed1193();
   }
   buildCounterLookupResponse--;
   return o;
@@ -516,74 +516,74 @@
 checkLookupResponse(api.LookupResponse o) {
   buildCounterLookupResponse++;
   if (buildCounterLookupResponse < 3) {
-    checkUnnamed1287(o.deferred);
-    checkUnnamed1288(o.found);
+    checkUnnamed1191(o.deferred);
+    checkUnnamed1192(o.found);
     checkResponseHeader(o.header);
-    checkUnnamed1289(o.missing);
+    checkUnnamed1193(o.missing);
   }
   buildCounterLookupResponse--;
 }
 
-buildUnnamed1290() {
+buildUnnamed1194() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed1290(core.List<api.Key> o) {
+checkUnnamed1194(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
 }
 
-buildUnnamed1291() {
+buildUnnamed1195() {
   var o = new core.List<api.Entity>();
   o.add(buildEntity());
   o.add(buildEntity());
   return o;
 }
 
-checkUnnamed1291(core.List<api.Entity> o) {
+checkUnnamed1195(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntity(o[0]);
   checkEntity(o[1]);
 }
 
-buildUnnamed1292() {
+buildUnnamed1196() {
   var o = new core.List<api.Entity>();
   o.add(buildEntity());
   o.add(buildEntity());
   return o;
 }
 
-checkUnnamed1292(core.List<api.Entity> o) {
+checkUnnamed1196(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntity(o[0]);
   checkEntity(o[1]);
 }
 
-buildUnnamed1293() {
+buildUnnamed1197() {
   var o = new core.List<api.Entity>();
   o.add(buildEntity());
   o.add(buildEntity());
   return o;
 }
 
-checkUnnamed1293(core.List<api.Entity> o) {
+checkUnnamed1197(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntity(o[0]);
   checkEntity(o[1]);
 }
 
-buildUnnamed1294() {
+buildUnnamed1198() {
   var o = new core.List<api.Entity>();
   o.add(buildEntity());
   o.add(buildEntity());
   return o;
 }
 
-checkUnnamed1294(core.List<api.Entity> o) {
+checkUnnamed1198(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntity(o[0]);
   checkEntity(o[1]);
@@ -594,12 +594,12 @@
   var o = new api.Mutation();
   buildCounterMutation++;
   if (buildCounterMutation < 3) {
-    o.delete = buildUnnamed1290();
+    o.delete = buildUnnamed1194();
     o.force = true;
-    o.insert = buildUnnamed1291();
-    o.insertAutoId = buildUnnamed1292();
-    o.update = buildUnnamed1293();
-    o.upsert = buildUnnamed1294();
+    o.insert = buildUnnamed1195();
+    o.insertAutoId = buildUnnamed1196();
+    o.update = buildUnnamed1197();
+    o.upsert = buildUnnamed1198();
   }
   buildCounterMutation--;
   return o;
@@ -608,24 +608,24 @@
 checkMutation(api.Mutation o) {
   buildCounterMutation++;
   if (buildCounterMutation < 3) {
-    checkUnnamed1290(o.delete);
+    checkUnnamed1194(o.delete);
     unittest.expect(o.force, unittest.isTrue);
-    checkUnnamed1291(o.insert);
-    checkUnnamed1292(o.insertAutoId);
-    checkUnnamed1293(o.update);
-    checkUnnamed1294(o.upsert);
+    checkUnnamed1195(o.insert);
+    checkUnnamed1196(o.insertAutoId);
+    checkUnnamed1197(o.update);
+    checkUnnamed1198(o.upsert);
   }
   buildCounterMutation--;
 }
 
-buildUnnamed1295() {
+buildUnnamed1199() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed1295(core.List<api.Key> o) {
+checkUnnamed1199(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
@@ -637,7 +637,7 @@
   buildCounterMutationResult++;
   if (buildCounterMutationResult < 3) {
     o.indexUpdates = 42;
-    o.insertAutoIdKeys = buildUnnamed1295();
+    o.insertAutoIdKeys = buildUnnamed1199();
   }
   buildCounterMutationResult--;
   return o;
@@ -647,7 +647,7 @@
   buildCounterMutationResult++;
   if (buildCounterMutationResult < 3) {
     unittest.expect(o.indexUpdates, unittest.equals(42));
-    checkUnnamed1295(o.insertAutoIdKeys);
+    checkUnnamed1199(o.insertAutoIdKeys);
   }
   buildCounterMutationResult--;
 }
@@ -673,14 +673,14 @@
   buildCounterPartitionId--;
 }
 
-buildUnnamed1296() {
+buildUnnamed1200() {
   var o = new core.List<api.Value>();
   o.add(buildValue());
   o.add(buildValue());
   return o;
 }
 
-checkUnnamed1296(core.List<api.Value> o) {
+checkUnnamed1200(core.List<api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkValue(o[0]);
   checkValue(o[1]);
@@ -700,7 +700,7 @@
     o.indexed = true;
     o.integerValue = "foo";
     o.keyValue = buildKey();
-    o.listValue = buildUnnamed1296();
+    o.listValue = buildUnnamed1200();
     o.meaning = 42;
     o.stringValue = "foo";
   }
@@ -720,7 +720,7 @@
     unittest.expect(o.indexed, unittest.isTrue);
     unittest.expect(o.integerValue, unittest.equals('foo'));
     checkKey(o.keyValue);
-    checkUnnamed1296(o.listValue);
+    checkUnnamed1200(o.listValue);
     unittest.expect(o.meaning, unittest.equals(42));
     unittest.expect(o.stringValue, unittest.equals('foo'));
   }
@@ -811,53 +811,53 @@
   buildCounterPropertyReference--;
 }
 
-buildUnnamed1297() {
+buildUnnamed1201() {
   var o = new core.List<api.PropertyReference>();
   o.add(buildPropertyReference());
   o.add(buildPropertyReference());
   return o;
 }
 
-checkUnnamed1297(core.List<api.PropertyReference> o) {
+checkUnnamed1201(core.List<api.PropertyReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPropertyReference(o[0]);
   checkPropertyReference(o[1]);
 }
 
-buildUnnamed1298() {
+buildUnnamed1202() {
   var o = new core.List<api.KindExpression>();
   o.add(buildKindExpression());
   o.add(buildKindExpression());
   return o;
 }
 
-checkUnnamed1298(core.List<api.KindExpression> o) {
+checkUnnamed1202(core.List<api.KindExpression> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKindExpression(o[0]);
   checkKindExpression(o[1]);
 }
 
-buildUnnamed1299() {
+buildUnnamed1203() {
   var o = new core.List<api.PropertyOrder>();
   o.add(buildPropertyOrder());
   o.add(buildPropertyOrder());
   return o;
 }
 
-checkUnnamed1299(core.List<api.PropertyOrder> o) {
+checkUnnamed1203(core.List<api.PropertyOrder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPropertyOrder(o[0]);
   checkPropertyOrder(o[1]);
 }
 
-buildUnnamed1300() {
+buildUnnamed1204() {
   var o = new core.List<api.PropertyExpression>();
   o.add(buildPropertyExpression());
   o.add(buildPropertyExpression());
   return o;
 }
 
-checkUnnamed1300(core.List<api.PropertyExpression> o) {
+checkUnnamed1204(core.List<api.PropertyExpression> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPropertyExpression(o[0]);
   checkPropertyExpression(o[1]);
@@ -870,12 +870,12 @@
   if (buildCounterQuery < 3) {
     o.endCursor = "foo";
     o.filter = buildFilter();
-    o.groupBy = buildUnnamed1297();
-    o.kinds = buildUnnamed1298();
+    o.groupBy = buildUnnamed1201();
+    o.kinds = buildUnnamed1202();
     o.limit = 42;
     o.offset = 42;
-    o.order = buildUnnamed1299();
-    o.projection = buildUnnamed1300();
+    o.order = buildUnnamed1203();
+    o.projection = buildUnnamed1204();
     o.startCursor = "foo";
   }
   buildCounterQuery--;
@@ -887,25 +887,25 @@
   if (buildCounterQuery < 3) {
     unittest.expect(o.endCursor, unittest.equals('foo'));
     checkFilter(o.filter);
-    checkUnnamed1297(o.groupBy);
-    checkUnnamed1298(o.kinds);
+    checkUnnamed1201(o.groupBy);
+    checkUnnamed1202(o.kinds);
     unittest.expect(o.limit, unittest.equals(42));
     unittest.expect(o.offset, unittest.equals(42));
-    checkUnnamed1299(o.order);
-    checkUnnamed1300(o.projection);
+    checkUnnamed1203(o.order);
+    checkUnnamed1204(o.projection);
     unittest.expect(o.startCursor, unittest.equals('foo'));
   }
   buildCounterQuery--;
 }
 
-buildUnnamed1301() {
+buildUnnamed1205() {
   var o = new core.List<api.EntityResult>();
   o.add(buildEntityResult());
   o.add(buildEntityResult());
   return o;
 }
 
-checkUnnamed1301(core.List<api.EntityResult> o) {
+checkUnnamed1205(core.List<api.EntityResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityResult(o[0]);
   checkEntityResult(o[1]);
@@ -918,7 +918,7 @@
   if (buildCounterQueryResultBatch < 3) {
     o.endCursor = "foo";
     o.entityResultType = "foo";
-    o.entityResults = buildUnnamed1301();
+    o.entityResults = buildUnnamed1205();
     o.moreResults = "foo";
     o.skippedResults = 42;
   }
@@ -931,7 +931,7 @@
   if (buildCounterQueryResultBatch < 3) {
     unittest.expect(o.endCursor, unittest.equals('foo'));
     unittest.expect(o.entityResultType, unittest.equals('foo'));
-    checkUnnamed1301(o.entityResults);
+    checkUnnamed1205(o.entityResults);
     unittest.expect(o.moreResults, unittest.equals('foo'));
     unittest.expect(o.skippedResults, unittest.equals(42));
   }
@@ -1062,14 +1062,14 @@
   buildCounterRunQueryResponse--;
 }
 
-buildUnnamed1302() {
+buildUnnamed1206() {
   var o = new core.List<api.Value>();
   o.add(buildValue());
   o.add(buildValue());
   return o;
 }
 
-checkUnnamed1302(core.List<api.Value> o) {
+checkUnnamed1206(core.List<api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkValue(o[0]);
   checkValue(o[1]);
@@ -1089,7 +1089,7 @@
     o.indexed = true;
     o.integerValue = "foo";
     o.keyValue = buildKey();
-    o.listValue = buildUnnamed1302();
+    o.listValue = buildUnnamed1206();
     o.meaning = 42;
     o.stringValue = "foo";
   }
@@ -1109,7 +1109,7 @@
     unittest.expect(o.indexed, unittest.isTrue);
     unittest.expect(o.integerValue, unittest.equals('foo'));
     checkKey(o.keyValue);
-    checkUnnamed1302(o.listValue);
+    checkUnnamed1206(o.listValue);
     unittest.expect(o.meaning, unittest.equals(42));
     unittest.expect(o.stringValue, unittest.equals('foo'));
   }
diff --git a/generated/googleapis_beta/test/dns/v1beta1_test.dart b/generated/googleapis_beta/test/dns/v1beta1_test.dart
index 984767e..b8533b8 100644
--- a/generated/googleapis_beta/test/dns/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/dns/v1beta1_test.dart
@@ -16,27 +16,27 @@
 
 
 
-buildUnnamed1128() {
+buildUnnamed1207() {
   var o = new core.List<api.ResourceRecordSet>();
   o.add(buildResourceRecordSet());
   o.add(buildResourceRecordSet());
   return o;
 }
 
-checkUnnamed1128(core.List<api.ResourceRecordSet> o) {
+checkUnnamed1207(core.List<api.ResourceRecordSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceRecordSet(o[0]);
   checkResourceRecordSet(o[1]);
 }
 
-buildUnnamed1129() {
+buildUnnamed1208() {
   var o = new core.List<api.ResourceRecordSet>();
   o.add(buildResourceRecordSet());
   o.add(buildResourceRecordSet());
   return o;
 }
 
-checkUnnamed1129(core.List<api.ResourceRecordSet> o) {
+checkUnnamed1208(core.List<api.ResourceRecordSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceRecordSet(o[0]);
   checkResourceRecordSet(o[1]);
@@ -47,8 +47,8 @@
   var o = new api.Change();
   buildCounterChange++;
   if (buildCounterChange < 3) {
-    o.additions = buildUnnamed1128();
-    o.deletions = buildUnnamed1129();
+    o.additions = buildUnnamed1207();
+    o.deletions = buildUnnamed1208();
     o.id = "foo";
     o.kind = "foo";
     o.startTime = "foo";
@@ -61,8 +61,8 @@
 checkChange(api.Change o) {
   buildCounterChange++;
   if (buildCounterChange < 3) {
-    checkUnnamed1128(o.additions);
-    checkUnnamed1129(o.deletions);
+    checkUnnamed1207(o.additions);
+    checkUnnamed1208(o.deletions);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.startTime, unittest.equals('foo'));
@@ -71,14 +71,14 @@
   buildCounterChange--;
 }
 
-buildUnnamed1130() {
+buildUnnamed1209() {
   var o = new core.List<api.Change>();
   o.add(buildChange());
   o.add(buildChange());
   return o;
 }
 
-checkUnnamed1130(core.List<api.Change> o) {
+checkUnnamed1209(core.List<api.Change> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChange(o[0]);
   checkChange(o[1]);
@@ -89,7 +89,7 @@
   var o = new api.ChangesListResponse();
   buildCounterChangesListResponse++;
   if (buildCounterChangesListResponse < 3) {
-    o.changes = buildUnnamed1130();
+    o.changes = buildUnnamed1209();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -100,21 +100,21 @@
 checkChangesListResponse(api.ChangesListResponse o) {
   buildCounterChangesListResponse++;
   if (buildCounterChangesListResponse < 3) {
-    checkUnnamed1130(o.changes);
+    checkUnnamed1209(o.changes);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterChangesListResponse--;
 }
 
-buildUnnamed1131() {
+buildUnnamed1210() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1131(core.List<core.String> o) {
+checkUnnamed1210(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -131,7 +131,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.nameServers = buildUnnamed1131();
+    o.nameServers = buildUnnamed1210();
   }
   buildCounterManagedZone--;
   return o;
@@ -146,19 +146,19 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1131(o.nameServers);
+    checkUnnamed1210(o.nameServers);
   }
   buildCounterManagedZone--;
 }
 
-buildUnnamed1132() {
+buildUnnamed1211() {
   var o = new core.List<api.ManagedZone>();
   o.add(buildManagedZone());
   o.add(buildManagedZone());
   return o;
 }
 
-checkUnnamed1132(core.List<api.ManagedZone> o) {
+checkUnnamed1211(core.List<api.ManagedZone> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedZone(o[0]);
   checkManagedZone(o[1]);
@@ -170,7 +170,7 @@
   buildCounterManagedZonesListResponse++;
   if (buildCounterManagedZonesListResponse < 3) {
     o.kind = "foo";
-    o.managedZones = buildUnnamed1132();
+    o.managedZones = buildUnnamed1211();
     o.nextPageToken = "foo";
   }
   buildCounterManagedZonesListResponse--;
@@ -181,7 +181,7 @@
   buildCounterManagedZonesListResponse++;
   if (buildCounterManagedZonesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1132(o.managedZones);
+    checkUnnamed1211(o.managedZones);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterManagedZonesListResponse--;
@@ -243,14 +243,14 @@
   buildCounterQuota--;
 }
 
-buildUnnamed1133() {
+buildUnnamed1212() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1133(core.List<core.String> o) {
+checkUnnamed1212(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -263,7 +263,7 @@
   if (buildCounterResourceRecordSet < 3) {
     o.kind = "foo";
     o.name = "foo";
-    o.rrdatas = buildUnnamed1133();
+    o.rrdatas = buildUnnamed1212();
     o.ttl = 42;
     o.type = "foo";
   }
@@ -276,21 +276,21 @@
   if (buildCounterResourceRecordSet < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1133(o.rrdatas);
+    checkUnnamed1212(o.rrdatas);
     unittest.expect(o.ttl, unittest.equals(42));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterResourceRecordSet--;
 }
 
-buildUnnamed1134() {
+buildUnnamed1213() {
   var o = new core.List<api.ResourceRecordSet>();
   o.add(buildResourceRecordSet());
   o.add(buildResourceRecordSet());
   return o;
 }
 
-checkUnnamed1134(core.List<api.ResourceRecordSet> o) {
+checkUnnamed1213(core.List<api.ResourceRecordSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceRecordSet(o[0]);
   checkResourceRecordSet(o[1]);
@@ -303,7 +303,7 @@
   if (buildCounterResourceRecordSetsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.rrsets = buildUnnamed1134();
+    o.rrsets = buildUnnamed1213();
   }
   buildCounterResourceRecordSetsListResponse--;
   return o;
@@ -314,7 +314,7 @@
   if (buildCounterResourceRecordSetsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1134(o.rrsets);
+    checkUnnamed1213(o.rrsets);
   }
   buildCounterResourceRecordSetsListResponse--;
 }
diff --git a/generated/googleapis_beta/test/genomics/v1beta2_test.dart b/generated/googleapis_beta/test/genomics/v1beta2_test.dart
new file mode 100644
index 0000000..f28083b
--- /dev/null
+++ b/generated/googleapis_beta/test/genomics/v1beta2_test.dart
@@ -0,0 +1,5300 @@
+library googleapis_beta.genomics.v1beta2.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:unittest/unittest.dart' as unittest;
+import 'package:googleapis_beta/common/common.dart' as common;
+import 'package:googleapis_beta/src/common_internal.dart' as common_internal;
+import '../common/common_internal_test.dart' as common_test;
+
+import 'package:googleapis_beta/genomics/v1beta2.dart' as api;
+
+
+
+buildUnnamed1267() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
+}
+
+buildUnnamed1268() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1268(core.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 buildCounterAlignReadGroupSetsRequest = 0;
+buildAlignReadGroupSetsRequest() {
+  var o = new api.AlignReadGroupSetsRequest();
+  buildCounterAlignReadGroupSetsRequest++;
+  if (buildCounterAlignReadGroupSetsRequest < 3) {
+    o.bamSourceUris = buildUnnamed1267();
+    o.datasetId = "foo";
+    o.interleavedFastqSource = buildInterleavedFastqSource();
+    o.pairedFastqSource = buildPairedFastqSource();
+    o.readGroupSetIds = buildUnnamed1268();
+  }
+  buildCounterAlignReadGroupSetsRequest--;
+  return o;
+}
+
+checkAlignReadGroupSetsRequest(api.AlignReadGroupSetsRequest o) {
+  buildCounterAlignReadGroupSetsRequest++;
+  if (buildCounterAlignReadGroupSetsRequest < 3) {
+    checkUnnamed1267(o.bamSourceUris);
+    unittest.expect(o.datasetId, unittest.equals('foo'));
+    checkInterleavedFastqSource(o.interleavedFastqSource);
+    checkPairedFastqSource(o.pairedFastqSource);
+    checkUnnamed1268(o.readGroupSetIds);
+  }
+  buildCounterAlignReadGroupSetsRequest--;
+}
+
+core.int buildCounterAlignReadGroupSetsResponse = 0;
+buildAlignReadGroupSetsResponse() {
+  var o = new api.AlignReadGroupSetsResponse();
+  buildCounterAlignReadGroupSetsResponse++;
+  if (buildCounterAlignReadGroupSetsResponse < 3) {
+    o.jobId = "foo";
+  }
+  buildCounterAlignReadGroupSetsResponse--;
+  return o;
+}
+
+checkAlignReadGroupSetsResponse(api.AlignReadGroupSetsResponse o) {
+  buildCounterAlignReadGroupSetsResponse++;
+  if (buildCounterAlignReadGroupSetsResponse < 3) {
+    unittest.expect(o.jobId, unittest.equals('foo'));
+  }
+  buildCounterAlignReadGroupSetsResponse--;
+}
+
+buildUnnamed1269() {
+  var o = new core.List<core.int>();
+  o.add(42);
+  o.add(42);
+  return o;
+}
+
+checkUnnamed1269(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));
+}
+
+buildUnnamed1270() {
+  var o = new core.List<core.double>();
+  o.add(42.0);
+  o.add(42.0);
+  return o;
+}
+
+checkUnnamed1270(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));
+}
+
+buildUnnamed1271() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1271(core.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() {
+  var o = new core.Map<core.String, core.List<core.String>>();
+  o["x"] = buildUnnamed1271();
+  o["y"] = buildUnnamed1271();
+  return o;
+}
+
+checkUnnamed1272(core.Map<core.String, core.List<core.String>> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkUnnamed1271(o["x"]);
+  checkUnnamed1271(o["y"]);
+}
+
+core.int buildCounterCall = 0;
+buildCall() {
+  var o = new api.Call();
+  buildCounterCall++;
+  if (buildCounterCall < 3) {
+    o.callSetId = "foo";
+    o.callSetName = "foo";
+    o.genotype = buildUnnamed1269();
+    o.genotypeLikelihood = buildUnnamed1270();
+    o.info = buildUnnamed1272();
+    o.phaseset = "foo";
+  }
+  buildCounterCall--;
+  return o;
+}
+
+checkCall(api.Call o) {
+  buildCounterCall++;
+  if (buildCounterCall < 3) {
+    unittest.expect(o.callSetId, unittest.equals('foo'));
+    unittest.expect(o.callSetName, unittest.equals('foo'));
+    checkUnnamed1269(o.genotype);
+    checkUnnamed1270(o.genotypeLikelihood);
+    checkUnnamed1272(o.info);
+    unittest.expect(o.phaseset, unittest.equals('foo'));
+  }
+  buildCounterCall--;
+}
+
+buildUnnamed1273() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1273(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1274() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1274(core.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 buildCounterCallReadGroupSetsRequest = 0;
+buildCallReadGroupSetsRequest() {
+  var o = new api.CallReadGroupSetsRequest();
+  buildCounterCallReadGroupSetsRequest++;
+  if (buildCounterCallReadGroupSetsRequest < 3) {
+    o.datasetId = "foo";
+    o.readGroupSetIds = buildUnnamed1273();
+    o.sourceUris = buildUnnamed1274();
+  }
+  buildCounterCallReadGroupSetsRequest--;
+  return o;
+}
+
+checkCallReadGroupSetsRequest(api.CallReadGroupSetsRequest o) {
+  buildCounterCallReadGroupSetsRequest++;
+  if (buildCounterCallReadGroupSetsRequest < 3) {
+    unittest.expect(o.datasetId, unittest.equals('foo'));
+    checkUnnamed1273(o.readGroupSetIds);
+    checkUnnamed1274(o.sourceUris);
+  }
+  buildCounterCallReadGroupSetsRequest--;
+}
+
+core.int buildCounterCallReadGroupSetsResponse = 0;
+buildCallReadGroupSetsResponse() {
+  var o = new api.CallReadGroupSetsResponse();
+  buildCounterCallReadGroupSetsResponse++;
+  if (buildCounterCallReadGroupSetsResponse < 3) {
+    o.jobId = "foo";
+  }
+  buildCounterCallReadGroupSetsResponse--;
+  return o;
+}
+
+checkCallReadGroupSetsResponse(api.CallReadGroupSetsResponse o) {
+  buildCounterCallReadGroupSetsResponse++;
+  if (buildCounterCallReadGroupSetsResponse < 3) {
+    unittest.expect(o.jobId, unittest.equals('foo'));
+  }
+  buildCounterCallReadGroupSetsResponse--;
+}
+
+buildUnnamed1275() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1275(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1276() {
+  var o = new core.Map<core.String, core.List<core.String>>();
+  o["x"] = buildUnnamed1275();
+  o["y"] = buildUnnamed1275();
+  return o;
+}
+
+checkUnnamed1276(core.Map<core.String, core.List<core.String>> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkUnnamed1275(o["x"]);
+  checkUnnamed1275(o["y"]);
+}
+
+buildUnnamed1277() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
+}
+
+core.int buildCounterCallSet = 0;
+buildCallSet() {
+  var o = new api.CallSet();
+  buildCounterCallSet++;
+  if (buildCounterCallSet < 3) {
+    o.created = "foo";
+    o.id = "foo";
+    o.info = buildUnnamed1276();
+    o.name = "foo";
+    o.sampleId = "foo";
+    o.variantSetIds = buildUnnamed1277();
+  }
+  buildCounterCallSet--;
+  return o;
+}
+
+checkCallSet(api.CallSet o) {
+  buildCounterCallSet++;
+  if (buildCounterCallSet < 3) {
+    unittest.expect(o.created, unittest.equals('foo'));
+    unittest.expect(o.id, unittest.equals('foo'));
+    checkUnnamed1276(o.info);
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.sampleId, unittest.equals('foo'));
+    checkUnnamed1277(o.variantSetIds);
+  }
+  buildCounterCallSet--;
+}
+
+core.int buildCounterCigarUnit = 0;
+buildCigarUnit() {
+  var o = new api.CigarUnit();
+  buildCounterCigarUnit++;
+  if (buildCounterCigarUnit < 3) {
+    o.operation = "foo";
+    o.operationLength = "foo";
+    o.referenceSequence = "foo";
+  }
+  buildCounterCigarUnit--;
+  return o;
+}
+
+checkCigarUnit(api.CigarUnit o) {
+  buildCounterCigarUnit++;
+  if (buildCounterCigarUnit < 3) {
+    unittest.expect(o.operation, unittest.equals('foo'));
+    unittest.expect(o.operationLength, unittest.equals('foo'));
+    unittest.expect(o.referenceSequence, unittest.equals('foo'));
+  }
+  buildCounterCigarUnit--;
+}
+
+core.int buildCounterCoverageBucket = 0;
+buildCoverageBucket() {
+  var o = new api.CoverageBucket();
+  buildCounterCoverageBucket++;
+  if (buildCounterCoverageBucket < 3) {
+    o.meanCoverage = 42.0;
+    o.range = buildRange();
+  }
+  buildCounterCoverageBucket--;
+  return o;
+}
+
+checkCoverageBucket(api.CoverageBucket o) {
+  buildCounterCoverageBucket++;
+  if (buildCounterCoverageBucket < 3) {
+    unittest.expect(o.meanCoverage, unittest.equals(42.0));
+    checkRange(o.range);
+  }
+  buildCounterCoverageBucket--;
+}
+
+core.int buildCounterDataset = 0;
+buildDataset() {
+  var o = new api.Dataset();
+  buildCounterDataset++;
+  if (buildCounterDataset < 3) {
+    o.id = "foo";
+    o.isPublic = true;
+    o.name = "foo";
+    o.projectNumber = "foo";
+  }
+  buildCounterDataset--;
+  return o;
+}
+
+checkDataset(api.Dataset o) {
+  buildCounterDataset++;
+  if (buildCounterDataset < 3) {
+    unittest.expect(o.id, unittest.equals('foo'));
+    unittest.expect(o.isPublic, unittest.isTrue);
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.projectNumber, unittest.equals('foo'));
+  }
+  buildCounterDataset--;
+}
+
+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'));
+}
+
+buildUnnamed1279() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1279(core.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 buildCounterExperimentalCreateJobRequest = 0;
+buildExperimentalCreateJobRequest() {
+  var o = new api.ExperimentalCreateJobRequest();
+  buildCounterExperimentalCreateJobRequest++;
+  if (buildCounterExperimentalCreateJobRequest < 3) {
+    o.align = true;
+    o.callVariants = true;
+    o.gcsOutputPath = "foo";
+    o.pairedSourceUris = buildUnnamed1278();
+    o.projectNumber = "foo";
+    o.sourceUris = buildUnnamed1279();
+  }
+  buildCounterExperimentalCreateJobRequest--;
+  return o;
+}
+
+checkExperimentalCreateJobRequest(api.ExperimentalCreateJobRequest o) {
+  buildCounterExperimentalCreateJobRequest++;
+  if (buildCounterExperimentalCreateJobRequest < 3) {
+    unittest.expect(o.align, unittest.isTrue);
+    unittest.expect(o.callVariants, unittest.isTrue);
+    unittest.expect(o.gcsOutputPath, unittest.equals('foo'));
+    checkUnnamed1278(o.pairedSourceUris);
+    unittest.expect(o.projectNumber, unittest.equals('foo'));
+    checkUnnamed1279(o.sourceUris);
+  }
+  buildCounterExperimentalCreateJobRequest--;
+}
+
+core.int buildCounterExperimentalCreateJobResponse = 0;
+buildExperimentalCreateJobResponse() {
+  var o = new api.ExperimentalCreateJobResponse();
+  buildCounterExperimentalCreateJobResponse++;
+  if (buildCounterExperimentalCreateJobResponse < 3) {
+    o.jobId = "foo";
+  }
+  buildCounterExperimentalCreateJobResponse--;
+  return o;
+}
+
+checkExperimentalCreateJobResponse(api.ExperimentalCreateJobResponse o) {
+  buildCounterExperimentalCreateJobResponse++;
+  if (buildCounterExperimentalCreateJobResponse < 3) {
+    unittest.expect(o.jobId, unittest.equals('foo'));
+  }
+  buildCounterExperimentalCreateJobResponse--;
+}
+
+buildUnnamed1280() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1280(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1281() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
+}
+
+core.int buildCounterExportReadGroupSetsRequest = 0;
+buildExportReadGroupSetsRequest() {
+  var o = new api.ExportReadGroupSetsRequest();
+  buildCounterExportReadGroupSetsRequest++;
+  if (buildCounterExportReadGroupSetsRequest < 3) {
+    o.exportUri = "foo";
+    o.projectNumber = "foo";
+    o.readGroupSetIds = buildUnnamed1280();
+    o.referenceNames = buildUnnamed1281();
+  }
+  buildCounterExportReadGroupSetsRequest--;
+  return o;
+}
+
+checkExportReadGroupSetsRequest(api.ExportReadGroupSetsRequest o) {
+  buildCounterExportReadGroupSetsRequest++;
+  if (buildCounterExportReadGroupSetsRequest < 3) {
+    unittest.expect(o.exportUri, unittest.equals('foo'));
+    unittest.expect(o.projectNumber, unittest.equals('foo'));
+    checkUnnamed1280(o.readGroupSetIds);
+    checkUnnamed1281(o.referenceNames);
+  }
+  buildCounterExportReadGroupSetsRequest--;
+}
+
+core.int buildCounterExportReadGroupSetsResponse = 0;
+buildExportReadGroupSetsResponse() {
+  var o = new api.ExportReadGroupSetsResponse();
+  buildCounterExportReadGroupSetsResponse++;
+  if (buildCounterExportReadGroupSetsResponse < 3) {
+    o.jobId = "foo";
+  }
+  buildCounterExportReadGroupSetsResponse--;
+  return o;
+}
+
+checkExportReadGroupSetsResponse(api.ExportReadGroupSetsResponse o) {
+  buildCounterExportReadGroupSetsResponse++;
+  if (buildCounterExportReadGroupSetsResponse < 3) {
+    unittest.expect(o.jobId, unittest.equals('foo'));
+  }
+  buildCounterExportReadGroupSetsResponse--;
+}
+
+buildUnnamed1282() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
+}
+
+core.int buildCounterExportVariantSetRequest = 0;
+buildExportVariantSetRequest() {
+  var o = new api.ExportVariantSetRequest();
+  buildCounterExportVariantSetRequest++;
+  if (buildCounterExportVariantSetRequest < 3) {
+    o.bigqueryDataset = "foo";
+    o.bigqueryTable = "foo";
+    o.callSetIds = buildUnnamed1282();
+    o.format = "foo";
+    o.projectNumber = "foo";
+  }
+  buildCounterExportVariantSetRequest--;
+  return o;
+}
+
+checkExportVariantSetRequest(api.ExportVariantSetRequest o) {
+  buildCounterExportVariantSetRequest++;
+  if (buildCounterExportVariantSetRequest < 3) {
+    unittest.expect(o.bigqueryDataset, unittest.equals('foo'));
+    unittest.expect(o.bigqueryTable, unittest.equals('foo'));
+    checkUnnamed1282(o.callSetIds);
+    unittest.expect(o.format, unittest.equals('foo'));
+    unittest.expect(o.projectNumber, unittest.equals('foo'));
+  }
+  buildCounterExportVariantSetRequest--;
+}
+
+core.int buildCounterExportVariantSetResponse = 0;
+buildExportVariantSetResponse() {
+  var o = new api.ExportVariantSetResponse();
+  buildCounterExportVariantSetResponse++;
+  if (buildCounterExportVariantSetResponse < 3) {
+    o.jobId = "foo";
+  }
+  buildCounterExportVariantSetResponse--;
+  return o;
+}
+
+checkExportVariantSetResponse(api.ExportVariantSetResponse o) {
+  buildCounterExportVariantSetResponse++;
+  if (buildCounterExportVariantSetResponse < 3) {
+    unittest.expect(o.jobId, unittest.equals('foo'));
+  }
+  buildCounterExportVariantSetResponse--;
+}
+
+core.int buildCounterFastqMetadata = 0;
+buildFastqMetadata() {
+  var o = new api.FastqMetadata();
+  buildCounterFastqMetadata++;
+  if (buildCounterFastqMetadata < 3) {
+    o.libraryName = "foo";
+    o.platformName = "foo";
+    o.platformUnit = "foo";
+    o.readGroupName = "foo";
+    o.sampleName = "foo";
+  }
+  buildCounterFastqMetadata--;
+  return o;
+}
+
+checkFastqMetadata(api.FastqMetadata o) {
+  buildCounterFastqMetadata++;
+  if (buildCounterFastqMetadata < 3) {
+    unittest.expect(o.libraryName, unittest.equals('foo'));
+    unittest.expect(o.platformName, unittest.equals('foo'));
+    unittest.expect(o.platformUnit, unittest.equals('foo'));
+    unittest.expect(o.readGroupName, unittest.equals('foo'));
+    unittest.expect(o.sampleName, unittest.equals('foo'));
+  }
+  buildCounterFastqMetadata--;
+}
+
+buildUnnamed1283() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1283(core.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 buildCounterImportReadGroupSetsRequest = 0;
+buildImportReadGroupSetsRequest() {
+  var o = new api.ImportReadGroupSetsRequest();
+  buildCounterImportReadGroupSetsRequest++;
+  if (buildCounterImportReadGroupSetsRequest < 3) {
+    o.datasetId = "foo";
+    o.referenceSetId = "foo";
+    o.sourceUris = buildUnnamed1283();
+  }
+  buildCounterImportReadGroupSetsRequest--;
+  return o;
+}
+
+checkImportReadGroupSetsRequest(api.ImportReadGroupSetsRequest o) {
+  buildCounterImportReadGroupSetsRequest++;
+  if (buildCounterImportReadGroupSetsRequest < 3) {
+    unittest.expect(o.datasetId, unittest.equals('foo'));
+    unittest.expect(o.referenceSetId, unittest.equals('foo'));
+    checkUnnamed1283(o.sourceUris);
+  }
+  buildCounterImportReadGroupSetsRequest--;
+}
+
+core.int buildCounterImportReadGroupSetsResponse = 0;
+buildImportReadGroupSetsResponse() {
+  var o = new api.ImportReadGroupSetsResponse();
+  buildCounterImportReadGroupSetsResponse++;
+  if (buildCounterImportReadGroupSetsResponse < 3) {
+    o.jobId = "foo";
+  }
+  buildCounterImportReadGroupSetsResponse--;
+  return o;
+}
+
+checkImportReadGroupSetsResponse(api.ImportReadGroupSetsResponse o) {
+  buildCounterImportReadGroupSetsResponse++;
+  if (buildCounterImportReadGroupSetsResponse < 3) {
+    unittest.expect(o.jobId, unittest.equals('foo'));
+  }
+  buildCounterImportReadGroupSetsResponse--;
+}
+
+buildUnnamed1284() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1284(core.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 buildCounterImportVariantsRequest = 0;
+buildImportVariantsRequest() {
+  var o = new api.ImportVariantsRequest();
+  buildCounterImportVariantsRequest++;
+  if (buildCounterImportVariantsRequest < 3) {
+    o.format = "foo";
+    o.sourceUris = buildUnnamed1284();
+  }
+  buildCounterImportVariantsRequest--;
+  return o;
+}
+
+checkImportVariantsRequest(api.ImportVariantsRequest o) {
+  buildCounterImportVariantsRequest++;
+  if (buildCounterImportVariantsRequest < 3) {
+    unittest.expect(o.format, unittest.equals('foo'));
+    checkUnnamed1284(o.sourceUris);
+  }
+  buildCounterImportVariantsRequest--;
+}
+
+core.int buildCounterImportVariantsResponse = 0;
+buildImportVariantsResponse() {
+  var o = new api.ImportVariantsResponse();
+  buildCounterImportVariantsResponse++;
+  if (buildCounterImportVariantsResponse < 3) {
+    o.jobId = "foo";
+  }
+  buildCounterImportVariantsResponse--;
+  return o;
+}
+
+checkImportVariantsResponse(api.ImportVariantsResponse o) {
+  buildCounterImportVariantsResponse++;
+  if (buildCounterImportVariantsResponse < 3) {
+    unittest.expect(o.jobId, unittest.equals('foo'));
+  }
+  buildCounterImportVariantsResponse--;
+}
+
+buildUnnamed1285() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1285(core.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 buildCounterInterleavedFastqSource = 0;
+buildInterleavedFastqSource() {
+  var o = new api.InterleavedFastqSource();
+  buildCounterInterleavedFastqSource++;
+  if (buildCounterInterleavedFastqSource < 3) {
+    o.metadata = buildFastqMetadata();
+    o.sourceUris = buildUnnamed1285();
+  }
+  buildCounterInterleavedFastqSource--;
+  return o;
+}
+
+checkInterleavedFastqSource(api.InterleavedFastqSource o) {
+  buildCounterInterleavedFastqSource++;
+  if (buildCounterInterleavedFastqSource < 3) {
+    checkFastqMetadata(o.metadata);
+    checkUnnamed1285(o.sourceUris);
+  }
+  buildCounterInterleavedFastqSource--;
+}
+
+buildUnnamed1286() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1286(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1287() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1287(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1288() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1288(core.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 buildCounterJob = 0;
+buildJob() {
+  var o = new api.Job();
+  buildCounterJob++;
+  if (buildCounterJob < 3) {
+    o.created = "foo";
+    o.detailedStatus = "foo";
+    o.errors = buildUnnamed1286();
+    o.id = "foo";
+    o.importedIds = buildUnnamed1287();
+    o.projectNumber = "foo";
+    o.request = buildJobRequest();
+    o.status = "foo";
+    o.warnings = buildUnnamed1288();
+  }
+  buildCounterJob--;
+  return o;
+}
+
+checkJob(api.Job o) {
+  buildCounterJob++;
+  if (buildCounterJob < 3) {
+    unittest.expect(o.created, unittest.equals('foo'));
+    unittest.expect(o.detailedStatus, unittest.equals('foo'));
+    checkUnnamed1286(o.errors);
+    unittest.expect(o.id, unittest.equals('foo'));
+    checkUnnamed1287(o.importedIds);
+    unittest.expect(o.projectNumber, unittest.equals('foo'));
+    checkJobRequest(o.request);
+    unittest.expect(o.status, unittest.equals('foo'));
+    checkUnnamed1288(o.warnings);
+  }
+  buildCounterJob--;
+}
+
+buildUnnamed1289() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1289(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1290() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1290(core.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 buildCounterJobRequest = 0;
+buildJobRequest() {
+  var o = new api.JobRequest();
+  buildCounterJobRequest++;
+  if (buildCounterJobRequest < 3) {
+    o.destination = buildUnnamed1289();
+    o.source = buildUnnamed1290();
+    o.type = "foo";
+  }
+  buildCounterJobRequest--;
+  return o;
+}
+
+checkJobRequest(api.JobRequest o) {
+  buildCounterJobRequest++;
+  if (buildCounterJobRequest < 3) {
+    checkUnnamed1289(o.destination);
+    checkUnnamed1290(o.source);
+    unittest.expect(o.type, unittest.equals('foo'));
+  }
+  buildCounterJobRequest--;
+}
+
+buildUnnamed1291() {
+  var o = new core.List<api.CigarUnit>();
+  o.add(buildCigarUnit());
+  o.add(buildCigarUnit());
+  return o;
+}
+
+checkUnnamed1291(core.List<api.CigarUnit> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkCigarUnit(o[0]);
+  checkCigarUnit(o[1]);
+}
+
+core.int buildCounterLinearAlignment = 0;
+buildLinearAlignment() {
+  var o = new api.LinearAlignment();
+  buildCounterLinearAlignment++;
+  if (buildCounterLinearAlignment < 3) {
+    o.cigar = buildUnnamed1291();
+    o.mappingQuality = 42;
+    o.position = buildPosition();
+  }
+  buildCounterLinearAlignment--;
+  return o;
+}
+
+checkLinearAlignment(api.LinearAlignment o) {
+  buildCounterLinearAlignment++;
+  if (buildCounterLinearAlignment < 3) {
+    checkUnnamed1291(o.cigar);
+    unittest.expect(o.mappingQuality, unittest.equals(42));
+    checkPosition(o.position);
+  }
+  buildCounterLinearAlignment--;
+}
+
+core.int buildCounterListBasesResponse = 0;
+buildListBasesResponse() {
+  var o = new api.ListBasesResponse();
+  buildCounterListBasesResponse++;
+  if (buildCounterListBasesResponse < 3) {
+    o.nextPageToken = "foo";
+    o.offset = "foo";
+    o.sequence = "foo";
+  }
+  buildCounterListBasesResponse--;
+  return o;
+}
+
+checkListBasesResponse(api.ListBasesResponse o) {
+  buildCounterListBasesResponse++;
+  if (buildCounterListBasesResponse < 3) {
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+    unittest.expect(o.offset, unittest.equals('foo'));
+    unittest.expect(o.sequence, unittest.equals('foo'));
+  }
+  buildCounterListBasesResponse--;
+}
+
+buildUnnamed1292() {
+  var o = new core.List<api.CoverageBucket>();
+  o.add(buildCoverageBucket());
+  o.add(buildCoverageBucket());
+  return o;
+}
+
+checkUnnamed1292(core.List<api.CoverageBucket> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkCoverageBucket(o[0]);
+  checkCoverageBucket(o[1]);
+}
+
+core.int buildCounterListCoverageBucketsResponse = 0;
+buildListCoverageBucketsResponse() {
+  var o = new api.ListCoverageBucketsResponse();
+  buildCounterListCoverageBucketsResponse++;
+  if (buildCounterListCoverageBucketsResponse < 3) {
+    o.bucketWidth = "foo";
+    o.coverageBuckets = buildUnnamed1292();
+    o.nextPageToken = "foo";
+  }
+  buildCounterListCoverageBucketsResponse--;
+  return o;
+}
+
+checkListCoverageBucketsResponse(api.ListCoverageBucketsResponse o) {
+  buildCounterListCoverageBucketsResponse++;
+  if (buildCounterListCoverageBucketsResponse < 3) {
+    unittest.expect(o.bucketWidth, unittest.equals('foo'));
+    checkUnnamed1292(o.coverageBuckets);
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+  }
+  buildCounterListCoverageBucketsResponse--;
+}
+
+buildUnnamed1293() {
+  var o = new core.List<api.Dataset>();
+  o.add(buildDataset());
+  o.add(buildDataset());
+  return o;
+}
+
+checkUnnamed1293(core.List<api.Dataset> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkDataset(o[0]);
+  checkDataset(o[1]);
+}
+
+core.int buildCounterListDatasetsResponse = 0;
+buildListDatasetsResponse() {
+  var o = new api.ListDatasetsResponse();
+  buildCounterListDatasetsResponse++;
+  if (buildCounterListDatasetsResponse < 3) {
+    o.datasets = buildUnnamed1293();
+    o.nextPageToken = "foo";
+  }
+  buildCounterListDatasetsResponse--;
+  return o;
+}
+
+checkListDatasetsResponse(api.ListDatasetsResponse o) {
+  buildCounterListDatasetsResponse++;
+  if (buildCounterListDatasetsResponse < 3) {
+    checkUnnamed1293(o.datasets);
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+  }
+  buildCounterListDatasetsResponse--;
+}
+
+buildUnnamed1294() {
+  var o = new core.List<api.Variant>();
+  o.add(buildVariant());
+  o.add(buildVariant());
+  return o;
+}
+
+checkUnnamed1294(core.List<api.Variant> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkVariant(o[0]);
+  checkVariant(o[1]);
+}
+
+core.int buildCounterMergeVariantsRequest = 0;
+buildMergeVariantsRequest() {
+  var o = new api.MergeVariantsRequest();
+  buildCounterMergeVariantsRequest++;
+  if (buildCounterMergeVariantsRequest < 3) {
+    o.variants = buildUnnamed1294();
+  }
+  buildCounterMergeVariantsRequest--;
+  return o;
+}
+
+checkMergeVariantsRequest(api.MergeVariantsRequest o) {
+  buildCounterMergeVariantsRequest++;
+  if (buildCounterMergeVariantsRequest < 3) {
+    checkUnnamed1294(o.variants);
+  }
+  buildCounterMergeVariantsRequest--;
+}
+
+buildUnnamed1295() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1295(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1296() {
+  var o = new core.Map<core.String, core.List<core.String>>();
+  o["x"] = buildUnnamed1295();
+  o["y"] = buildUnnamed1295();
+  return o;
+}
+
+checkUnnamed1296(core.Map<core.String, core.List<core.String>> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkUnnamed1295(o["x"]);
+  checkUnnamed1295(o["y"]);
+}
+
+core.int buildCounterMetadata = 0;
+buildMetadata() {
+  var o = new api.Metadata();
+  buildCounterMetadata++;
+  if (buildCounterMetadata < 3) {
+    o.description = "foo";
+    o.id = "foo";
+    o.info = buildUnnamed1296();
+    o.key = "foo";
+    o.number = "foo";
+    o.type = "foo";
+    o.value = "foo";
+  }
+  buildCounterMetadata--;
+  return o;
+}
+
+checkMetadata(api.Metadata o) {
+  buildCounterMetadata++;
+  if (buildCounterMetadata < 3) {
+    unittest.expect(o.description, unittest.equals('foo'));
+    unittest.expect(o.id, unittest.equals('foo'));
+    checkUnnamed1296(o.info);
+    unittest.expect(o.key, unittest.equals('foo'));
+    unittest.expect(o.number, unittest.equals('foo'));
+    unittest.expect(o.type, unittest.equals('foo'));
+    unittest.expect(o.value, unittest.equals('foo'));
+  }
+  buildCounterMetadata--;
+}
+
+buildUnnamed1297() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1297(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1298() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1298(core.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 buildCounterPairedFastqSource = 0;
+buildPairedFastqSource() {
+  var o = new api.PairedFastqSource();
+  buildCounterPairedFastqSource++;
+  if (buildCounterPairedFastqSource < 3) {
+    o.firstSourceUris = buildUnnamed1297();
+    o.metadata = buildFastqMetadata();
+    o.secondSourceUris = buildUnnamed1298();
+  }
+  buildCounterPairedFastqSource--;
+  return o;
+}
+
+checkPairedFastqSource(api.PairedFastqSource o) {
+  buildCounterPairedFastqSource++;
+  if (buildCounterPairedFastqSource < 3) {
+    checkUnnamed1297(o.firstSourceUris);
+    checkFastqMetadata(o.metadata);
+    checkUnnamed1298(o.secondSourceUris);
+  }
+  buildCounterPairedFastqSource--;
+}
+
+core.int buildCounterPosition = 0;
+buildPosition() {
+  var o = new api.Position();
+  buildCounterPosition++;
+  if (buildCounterPosition < 3) {
+    o.position = "foo";
+    o.referenceName = "foo";
+    o.reverseStrand = true;
+  }
+  buildCounterPosition--;
+  return o;
+}
+
+checkPosition(api.Position o) {
+  buildCounterPosition++;
+  if (buildCounterPosition < 3) {
+    unittest.expect(o.position, unittest.equals('foo'));
+    unittest.expect(o.referenceName, unittest.equals('foo'));
+    unittest.expect(o.reverseStrand, unittest.isTrue);
+  }
+  buildCounterPosition--;
+}
+
+core.int buildCounterRange = 0;
+buildRange() {
+  var o = new api.Range();
+  buildCounterRange++;
+  if (buildCounterRange < 3) {
+    o.end = "foo";
+    o.referenceName = "foo";
+    o.start = "foo";
+  }
+  buildCounterRange--;
+  return o;
+}
+
+checkRange(api.Range o) {
+  buildCounterRange++;
+  if (buildCounterRange < 3) {
+    unittest.expect(o.end, unittest.equals('foo'));
+    unittest.expect(o.referenceName, unittest.equals('foo'));
+    unittest.expect(o.start, unittest.equals('foo'));
+  }
+  buildCounterRange--;
+}
+
+buildUnnamed1299() {
+  var o = new core.List<core.int>();
+  o.add(42);
+  o.add(42);
+  return o;
+}
+
+checkUnnamed1299(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));
+}
+
+buildUnnamed1300() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1300(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1301() {
+  var o = new core.Map<core.String, core.List<core.String>>();
+  o["x"] = buildUnnamed1300();
+  o["y"] = buildUnnamed1300();
+  return o;
+}
+
+checkUnnamed1301(core.Map<core.String, core.List<core.String>> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkUnnamed1300(o["x"]);
+  checkUnnamed1300(o["y"]);
+}
+
+core.int buildCounterRead = 0;
+buildRead() {
+  var o = new api.Read();
+  buildCounterRead++;
+  if (buildCounterRead < 3) {
+    o.alignedQuality = buildUnnamed1299();
+    o.alignedSequence = "foo";
+    o.alignment = buildLinearAlignment();
+    o.duplicateFragment = true;
+    o.failedVendorQualityChecks = true;
+    o.fragmentLength = 42;
+    o.fragmentName = "foo";
+    o.id = "foo";
+    o.info = buildUnnamed1301();
+    o.nextMatePosition = buildPosition();
+    o.numberReads = 42;
+    o.properPlacement = true;
+    o.readGroupId = "foo";
+    o.readGroupSetId = "foo";
+    o.readNumber = 42;
+    o.secondaryAlignment = true;
+    o.supplementaryAlignment = true;
+  }
+  buildCounterRead--;
+  return o;
+}
+
+checkRead(api.Read o) {
+  buildCounterRead++;
+  if (buildCounterRead < 3) {
+    checkUnnamed1299(o.alignedQuality);
+    unittest.expect(o.alignedSequence, unittest.equals('foo'));
+    checkLinearAlignment(o.alignment);
+    unittest.expect(o.duplicateFragment, unittest.isTrue);
+    unittest.expect(o.failedVendorQualityChecks, unittest.isTrue);
+    unittest.expect(o.fragmentLength, unittest.equals(42));
+    unittest.expect(o.fragmentName, unittest.equals('foo'));
+    unittest.expect(o.id, unittest.equals('foo'));
+    checkUnnamed1301(o.info);
+    checkPosition(o.nextMatePosition);
+    unittest.expect(o.numberReads, unittest.equals(42));
+    unittest.expect(o.properPlacement, unittest.isTrue);
+    unittest.expect(o.readGroupId, unittest.equals('foo'));
+    unittest.expect(o.readGroupSetId, unittest.equals('foo'));
+    unittest.expect(o.readNumber, unittest.equals(42));
+    unittest.expect(o.secondaryAlignment, unittest.isTrue);
+    unittest.expect(o.supplementaryAlignment, unittest.isTrue);
+  }
+  buildCounterRead--;
+}
+
+buildUnnamed1302() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1302(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1303() {
+  var o = new core.Map<core.String, core.List<core.String>>();
+  o["x"] = buildUnnamed1302();
+  o["y"] = buildUnnamed1302();
+  return o;
+}
+
+checkUnnamed1303(core.Map<core.String, core.List<core.String>> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkUnnamed1302(o["x"]);
+  checkUnnamed1302(o["y"]);
+}
+
+buildUnnamed1304() {
+  var o = new core.List<api.ReadGroupProgram>();
+  o.add(buildReadGroupProgram());
+  o.add(buildReadGroupProgram());
+  return o;
+}
+
+checkUnnamed1304(core.List<api.ReadGroupProgram> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkReadGroupProgram(o[0]);
+  checkReadGroupProgram(o[1]);
+}
+
+core.int buildCounterReadGroup = 0;
+buildReadGroup() {
+  var o = new api.ReadGroup();
+  buildCounterReadGroup++;
+  if (buildCounterReadGroup < 3) {
+    o.datasetId = "foo";
+    o.description = "foo";
+    o.experiment = buildReadGroupExperiment();
+    o.id = "foo";
+    o.info = buildUnnamed1303();
+    o.name = "foo";
+    o.predictedInsertSize = 42;
+    o.programs = buildUnnamed1304();
+    o.referenceSetId = "foo";
+    o.sampleId = "foo";
+  }
+  buildCounterReadGroup--;
+  return o;
+}
+
+checkReadGroup(api.ReadGroup o) {
+  buildCounterReadGroup++;
+  if (buildCounterReadGroup < 3) {
+    unittest.expect(o.datasetId, unittest.equals('foo'));
+    unittest.expect(o.description, unittest.equals('foo'));
+    checkReadGroupExperiment(o.experiment);
+    unittest.expect(o.id, unittest.equals('foo'));
+    checkUnnamed1303(o.info);
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.predictedInsertSize, unittest.equals(42));
+    checkUnnamed1304(o.programs);
+    unittest.expect(o.referenceSetId, unittest.equals('foo'));
+    unittest.expect(o.sampleId, unittest.equals('foo'));
+  }
+  buildCounterReadGroup--;
+}
+
+core.int buildCounterReadGroupExperiment = 0;
+buildReadGroupExperiment() {
+  var o = new api.ReadGroupExperiment();
+  buildCounterReadGroupExperiment++;
+  if (buildCounterReadGroupExperiment < 3) {
+    o.instrumentModel = "foo";
+    o.libraryId = "foo";
+    o.platformUnit = "foo";
+    o.sequencingCenter = "foo";
+  }
+  buildCounterReadGroupExperiment--;
+  return o;
+}
+
+checkReadGroupExperiment(api.ReadGroupExperiment o) {
+  buildCounterReadGroupExperiment++;
+  if (buildCounterReadGroupExperiment < 3) {
+    unittest.expect(o.instrumentModel, unittest.equals('foo'));
+    unittest.expect(o.libraryId, unittest.equals('foo'));
+    unittest.expect(o.platformUnit, unittest.equals('foo'));
+    unittest.expect(o.sequencingCenter, unittest.equals('foo'));
+  }
+  buildCounterReadGroupExperiment--;
+}
+
+core.int buildCounterReadGroupProgram = 0;
+buildReadGroupProgram() {
+  var o = new api.ReadGroupProgram();
+  buildCounterReadGroupProgram++;
+  if (buildCounterReadGroupProgram < 3) {
+    o.commandLine = "foo";
+    o.id = "foo";
+    o.name = "foo";
+    o.prevProgramId = "foo";
+    o.version = "foo";
+  }
+  buildCounterReadGroupProgram--;
+  return o;
+}
+
+checkReadGroupProgram(api.ReadGroupProgram o) {
+  buildCounterReadGroupProgram++;
+  if (buildCounterReadGroupProgram < 3) {
+    unittest.expect(o.commandLine, unittest.equals('foo'));
+    unittest.expect(o.id, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.prevProgramId, unittest.equals('foo'));
+    unittest.expect(o.version, unittest.equals('foo'));
+  }
+  buildCounterReadGroupProgram--;
+}
+
+buildUnnamed1305() {
+  var o = new core.List<api.ReadGroup>();
+  o.add(buildReadGroup());
+  o.add(buildReadGroup());
+  return o;
+}
+
+checkUnnamed1305(core.List<api.ReadGroup> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkReadGroup(o[0]);
+  checkReadGroup(o[1]);
+}
+
+core.int buildCounterReadGroupSet = 0;
+buildReadGroupSet() {
+  var o = new api.ReadGroupSet();
+  buildCounterReadGroupSet++;
+  if (buildCounterReadGroupSet < 3) {
+    o.datasetId = "foo";
+    o.filename = "foo";
+    o.id = "foo";
+    o.name = "foo";
+    o.readGroups = buildUnnamed1305();
+    o.referenceSetId = "foo";
+  }
+  buildCounterReadGroupSet--;
+  return o;
+}
+
+checkReadGroupSet(api.ReadGroupSet o) {
+  buildCounterReadGroupSet++;
+  if (buildCounterReadGroupSet < 3) {
+    unittest.expect(o.datasetId, unittest.equals('foo'));
+    unittest.expect(o.filename, unittest.equals('foo'));
+    unittest.expect(o.id, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+    checkUnnamed1305(o.readGroups);
+    unittest.expect(o.referenceSetId, unittest.equals('foo'));
+  }
+  buildCounterReadGroupSet--;
+}
+
+buildUnnamed1306() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1306(core.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 buildCounterReference = 0;
+buildReference() {
+  var o = new api.Reference();
+  buildCounterReference++;
+  if (buildCounterReference < 3) {
+    o.id = "foo";
+    o.length = "foo";
+    o.md5checksum = "foo";
+    o.name = "foo";
+    o.ncbiTaxonId = 42;
+    o.sourceAccessions = buildUnnamed1306();
+    o.sourceURI = "foo";
+  }
+  buildCounterReference--;
+  return o;
+}
+
+checkReference(api.Reference o) {
+  buildCounterReference++;
+  if (buildCounterReference < 3) {
+    unittest.expect(o.id, unittest.equals('foo'));
+    unittest.expect(o.length, unittest.equals('foo'));
+    unittest.expect(o.md5checksum, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.ncbiTaxonId, unittest.equals(42));
+    checkUnnamed1306(o.sourceAccessions);
+    unittest.expect(o.sourceURI, unittest.equals('foo'));
+  }
+  buildCounterReference--;
+}
+
+core.int buildCounterReferenceBound = 0;
+buildReferenceBound() {
+  var o = new api.ReferenceBound();
+  buildCounterReferenceBound++;
+  if (buildCounterReferenceBound < 3) {
+    o.referenceName = "foo";
+    o.upperBound = "foo";
+  }
+  buildCounterReferenceBound--;
+  return o;
+}
+
+checkReferenceBound(api.ReferenceBound o) {
+  buildCounterReferenceBound++;
+  if (buildCounterReferenceBound < 3) {
+    unittest.expect(o.referenceName, unittest.equals('foo'));
+    unittest.expect(o.upperBound, unittest.equals('foo'));
+  }
+  buildCounterReferenceBound--;
+}
+
+buildUnnamed1307() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1307(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1308() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1308(core.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 buildCounterReferenceSet = 0;
+buildReferenceSet() {
+  var o = new api.ReferenceSet();
+  buildCounterReferenceSet++;
+  if (buildCounterReferenceSet < 3) {
+    o.assemblyId = "foo";
+    o.description = "foo";
+    o.id = "foo";
+    o.md5checksum = "foo";
+    o.ncbiTaxonId = 42;
+    o.referenceIds = buildUnnamed1307();
+    o.sourceAccessions = buildUnnamed1308();
+    o.sourceURI = "foo";
+  }
+  buildCounterReferenceSet--;
+  return o;
+}
+
+checkReferenceSet(api.ReferenceSet o) {
+  buildCounterReferenceSet++;
+  if (buildCounterReferenceSet < 3) {
+    unittest.expect(o.assemblyId, unittest.equals('foo'));
+    unittest.expect(o.description, unittest.equals('foo'));
+    unittest.expect(o.id, unittest.equals('foo'));
+    unittest.expect(o.md5checksum, unittest.equals('foo'));
+    unittest.expect(o.ncbiTaxonId, unittest.equals(42));
+    checkUnnamed1307(o.referenceIds);
+    checkUnnamed1308(o.sourceAccessions);
+    unittest.expect(o.sourceURI, unittest.equals('foo'));
+  }
+  buildCounterReferenceSet--;
+}
+
+buildUnnamed1309() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1309(core.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 = buildUnnamed1309();
+  }
+  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'));
+    checkUnnamed1309(o.variantSetIds);
+  }
+  buildCounterSearchCallSetsRequest--;
+}
+
+buildUnnamed1310() {
+  var o = new core.List<api.CallSet>();
+  o.add(buildCallSet());
+  o.add(buildCallSet());
+  return o;
+}
+
+checkUnnamed1310(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 = buildUnnamed1310();
+    o.nextPageToken = "foo";
+  }
+  buildCounterSearchCallSetsResponse--;
+  return o;
+}
+
+checkSearchCallSetsResponse(api.SearchCallSetsResponse o) {
+  buildCounterSearchCallSetsResponse++;
+  if (buildCounterSearchCallSetsResponse < 3) {
+    checkUnnamed1310(o.callSets);
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+  }
+  buildCounterSearchCallSetsResponse--;
+}
+
+buildUnnamed1311() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1311(core.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 buildCounterSearchJobsRequest = 0;
+buildSearchJobsRequest() {
+  var o = new api.SearchJobsRequest();
+  buildCounterSearchJobsRequest++;
+  if (buildCounterSearchJobsRequest < 3) {
+    o.createdAfter = "foo";
+    o.createdBefore = "foo";
+    o.pageSize = 42;
+    o.pageToken = "foo";
+    o.projectNumber = "foo";
+    o.status = buildUnnamed1311();
+  }
+  buildCounterSearchJobsRequest--;
+  return o;
+}
+
+checkSearchJobsRequest(api.SearchJobsRequest o) {
+  buildCounterSearchJobsRequest++;
+  if (buildCounterSearchJobsRequest < 3) {
+    unittest.expect(o.createdAfter, unittest.equals('foo'));
+    unittest.expect(o.createdBefore, unittest.equals('foo'));
+    unittest.expect(o.pageSize, unittest.equals(42));
+    unittest.expect(o.pageToken, unittest.equals('foo'));
+    unittest.expect(o.projectNumber, unittest.equals('foo'));
+    checkUnnamed1311(o.status);
+  }
+  buildCounterSearchJobsRequest--;
+}
+
+buildUnnamed1312() {
+  var o = new core.List<api.Job>();
+  o.add(buildJob());
+  o.add(buildJob());
+  return o;
+}
+
+checkUnnamed1312(core.List<api.Job> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkJob(o[0]);
+  checkJob(o[1]);
+}
+
+core.int buildCounterSearchJobsResponse = 0;
+buildSearchJobsResponse() {
+  var o = new api.SearchJobsResponse();
+  buildCounterSearchJobsResponse++;
+  if (buildCounterSearchJobsResponse < 3) {
+    o.jobs = buildUnnamed1312();
+    o.nextPageToken = "foo";
+  }
+  buildCounterSearchJobsResponse--;
+  return o;
+}
+
+checkSearchJobsResponse(api.SearchJobsResponse o) {
+  buildCounterSearchJobsResponse++;
+  if (buildCounterSearchJobsResponse < 3) {
+    checkUnnamed1312(o.jobs);
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+  }
+  buildCounterSearchJobsResponse--;
+}
+
+buildUnnamed1313() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1313(core.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 = buildUnnamed1313();
+    o.name = "foo";
+    o.pageSize = 42;
+    o.pageToken = "foo";
+  }
+  buildCounterSearchReadGroupSetsRequest--;
+  return o;
+}
+
+checkSearchReadGroupSetsRequest(api.SearchReadGroupSetsRequest o) {
+  buildCounterSearchReadGroupSetsRequest++;
+  if (buildCounterSearchReadGroupSetsRequest < 3) {
+    checkUnnamed1313(o.datasetIds);
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.pageSize, unittest.equals(42));
+    unittest.expect(o.pageToken, unittest.equals('foo'));
+  }
+  buildCounterSearchReadGroupSetsRequest--;
+}
+
+buildUnnamed1314() {
+  var o = new core.List<api.ReadGroupSet>();
+  o.add(buildReadGroupSet());
+  o.add(buildReadGroupSet());
+  return o;
+}
+
+checkUnnamed1314(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 = buildUnnamed1314();
+  }
+  buildCounterSearchReadGroupSetsResponse--;
+  return o;
+}
+
+checkSearchReadGroupSetsResponse(api.SearchReadGroupSetsResponse o) {
+  buildCounterSearchReadGroupSetsResponse++;
+  if (buildCounterSearchReadGroupSetsResponse < 3) {
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+    checkUnnamed1314(o.readGroupSets);
+  }
+  buildCounterSearchReadGroupSetsResponse--;
+}
+
+buildUnnamed1315() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1315(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1316() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1316(core.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 = buildUnnamed1315();
+    o.readGroupSetIds = buildUnnamed1316();
+    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'));
+    checkUnnamed1315(o.readGroupIds);
+    checkUnnamed1316(o.readGroupSetIds);
+    unittest.expect(o.referenceName, unittest.equals('foo'));
+    unittest.expect(o.start, unittest.equals('foo'));
+  }
+  buildCounterSearchReadsRequest--;
+}
+
+buildUnnamed1317() {
+  var o = new core.List<api.Read>();
+  o.add(buildRead());
+  o.add(buildRead());
+  return o;
+}
+
+checkUnnamed1317(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 = buildUnnamed1317();
+    o.nextPageToken = "foo";
+  }
+  buildCounterSearchReadsResponse--;
+  return o;
+}
+
+checkSearchReadsResponse(api.SearchReadsResponse o) {
+  buildCounterSearchReadsResponse++;
+  if (buildCounterSearchReadsResponse < 3) {
+    checkUnnamed1317(o.alignments);
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+  }
+  buildCounterSearchReadsResponse--;
+}
+
+buildUnnamed1318() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
+}
+
+buildUnnamed1319() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1319(core.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 = buildUnnamed1318();
+    o.md5checksums = buildUnnamed1319();
+    o.pageSize = 42;
+    o.pageToken = "foo";
+  }
+  buildCounterSearchReferenceSetsRequest--;
+  return o;
+}
+
+checkSearchReferenceSetsRequest(api.SearchReferenceSetsRequest o) {
+  buildCounterSearchReferenceSetsRequest++;
+  if (buildCounterSearchReferenceSetsRequest < 3) {
+    checkUnnamed1318(o.accessions);
+    checkUnnamed1319(o.md5checksums);
+    unittest.expect(o.pageSize, unittest.equals(42));
+    unittest.expect(o.pageToken, unittest.equals('foo'));
+  }
+  buildCounterSearchReferenceSetsRequest--;
+}
+
+buildUnnamed1320() {
+  var o = new core.List<api.ReferenceSet>();
+  o.add(buildReferenceSet());
+  o.add(buildReferenceSet());
+  return o;
+}
+
+checkUnnamed1320(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 = buildUnnamed1320();
+  }
+  buildCounterSearchReferenceSetsResponse--;
+  return o;
+}
+
+checkSearchReferenceSetsResponse(api.SearchReferenceSetsResponse o) {
+  buildCounterSearchReferenceSetsResponse++;
+  if (buildCounterSearchReferenceSetsResponse < 3) {
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+    checkUnnamed1320(o.referenceSets);
+  }
+  buildCounterSearchReferenceSetsResponse--;
+}
+
+buildUnnamed1321() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1321(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1322() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1322(core.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 = buildUnnamed1321();
+    o.md5checksums = buildUnnamed1322();
+    o.pageSize = 42;
+    o.pageToken = "foo";
+    o.referenceSetId = "foo";
+  }
+  buildCounterSearchReferencesRequest--;
+  return o;
+}
+
+checkSearchReferencesRequest(api.SearchReferencesRequest o) {
+  buildCounterSearchReferencesRequest++;
+  if (buildCounterSearchReferencesRequest < 3) {
+    checkUnnamed1321(o.accessions);
+    checkUnnamed1322(o.md5checksums);
+    unittest.expect(o.pageSize, unittest.equals(42));
+    unittest.expect(o.pageToken, unittest.equals('foo'));
+    unittest.expect(o.referenceSetId, unittest.equals('foo'));
+  }
+  buildCounterSearchReferencesRequest--;
+}
+
+buildUnnamed1323() {
+  var o = new core.List<api.Reference>();
+  o.add(buildReference());
+  o.add(buildReference());
+  return o;
+}
+
+checkUnnamed1323(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 = buildUnnamed1323();
+  }
+  buildCounterSearchReferencesResponse--;
+  return o;
+}
+
+checkSearchReferencesResponse(api.SearchReferencesResponse o) {
+  buildCounterSearchReferencesResponse++;
+  if (buildCounterSearchReferencesResponse < 3) {
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+    checkUnnamed1323(o.references);
+  }
+  buildCounterSearchReferencesResponse--;
+}
+
+buildUnnamed1324() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1324(core.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 = buildUnnamed1324();
+    o.pageSize = 42;
+    o.pageToken = "foo";
+  }
+  buildCounterSearchVariantSetsRequest--;
+  return o;
+}
+
+checkSearchVariantSetsRequest(api.SearchVariantSetsRequest o) {
+  buildCounterSearchVariantSetsRequest++;
+  if (buildCounterSearchVariantSetsRequest < 3) {
+    checkUnnamed1324(o.datasetIds);
+    unittest.expect(o.pageSize, unittest.equals(42));
+    unittest.expect(o.pageToken, unittest.equals('foo'));
+  }
+  buildCounterSearchVariantSetsRequest--;
+}
+
+buildUnnamed1325() {
+  var o = new core.List<api.VariantSet>();
+  o.add(buildVariantSet());
+  o.add(buildVariantSet());
+  return o;
+}
+
+checkUnnamed1325(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 = buildUnnamed1325();
+  }
+  buildCounterSearchVariantSetsResponse--;
+  return o;
+}
+
+checkSearchVariantSetsResponse(api.SearchVariantSetsResponse o) {
+  buildCounterSearchVariantSetsResponse++;
+  if (buildCounterSearchVariantSetsResponse < 3) {
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+    checkUnnamed1325(o.variantSets);
+  }
+  buildCounterSearchVariantSetsResponse--;
+}
+
+buildUnnamed1326() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1326(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1327() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1327(core.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 buildCounterSearchVariantsRequest = 0;
+buildSearchVariantsRequest() {
+  var o = new api.SearchVariantsRequest();
+  buildCounterSearchVariantsRequest++;
+  if (buildCounterSearchVariantsRequest < 3) {
+    o.callSetIds = buildUnnamed1326();
+    o.end = "foo";
+    o.maxCalls = 42;
+    o.pageSize = 42;
+    o.pageToken = "foo";
+    o.referenceName = "foo";
+    o.start = "foo";
+    o.variantName = "foo";
+    o.variantSetIds = buildUnnamed1327();
+  }
+  buildCounterSearchVariantsRequest--;
+  return o;
+}
+
+checkSearchVariantsRequest(api.SearchVariantsRequest o) {
+  buildCounterSearchVariantsRequest++;
+  if (buildCounterSearchVariantsRequest < 3) {
+    checkUnnamed1326(o.callSetIds);
+    unittest.expect(o.end, unittest.equals('foo'));
+    unittest.expect(o.maxCalls, unittest.equals(42));
+    unittest.expect(o.pageSize, unittest.equals(42));
+    unittest.expect(o.pageToken, unittest.equals('foo'));
+    unittest.expect(o.referenceName, unittest.equals('foo'));
+    unittest.expect(o.start, unittest.equals('foo'));
+    unittest.expect(o.variantName, unittest.equals('foo'));
+    checkUnnamed1327(o.variantSetIds);
+  }
+  buildCounterSearchVariantsRequest--;
+}
+
+buildUnnamed1328() {
+  var o = new core.List<api.Variant>();
+  o.add(buildVariant());
+  o.add(buildVariant());
+  return o;
+}
+
+checkUnnamed1328(core.List<api.Variant> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkVariant(o[0]);
+  checkVariant(o[1]);
+}
+
+core.int buildCounterSearchVariantsResponse = 0;
+buildSearchVariantsResponse() {
+  var o = new api.SearchVariantsResponse();
+  buildCounterSearchVariantsResponse++;
+  if (buildCounterSearchVariantsResponse < 3) {
+    o.nextPageToken = "foo";
+    o.variants = buildUnnamed1328();
+  }
+  buildCounterSearchVariantsResponse--;
+  return o;
+}
+
+checkSearchVariantsResponse(api.SearchVariantsResponse o) {
+  buildCounterSearchVariantsResponse++;
+  if (buildCounterSearchVariantsResponse < 3) {
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+    checkUnnamed1328(o.variants);
+  }
+  buildCounterSearchVariantsResponse--;
+}
+
+buildUnnamed1329() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1329(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1330() {
+  var o = new core.List<api.Call>();
+  o.add(buildCall());
+  o.add(buildCall());
+  return o;
+}
+
+checkUnnamed1330(core.List<api.Call> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkCall(o[0]);
+  checkCall(o[1]);
+}
+
+buildUnnamed1331() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1331(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1332() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1332(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1333() {
+  var o = new core.Map<core.String, core.List<core.String>>();
+  o["x"] = buildUnnamed1332();
+  o["y"] = buildUnnamed1332();
+  return o;
+}
+
+checkUnnamed1333(core.Map<core.String, core.List<core.String>> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkUnnamed1332(o["x"]);
+  checkUnnamed1332(o["y"]);
+}
+
+buildUnnamed1334() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1334(core.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 buildCounterVariant = 0;
+buildVariant() {
+  var o = new api.Variant();
+  buildCounterVariant++;
+  if (buildCounterVariant < 3) {
+    o.alternateBases = buildUnnamed1329();
+    o.calls = buildUnnamed1330();
+    o.created = "foo";
+    o.end = "foo";
+    o.filter = buildUnnamed1331();
+    o.id = "foo";
+    o.info = buildUnnamed1333();
+    o.names = buildUnnamed1334();
+    o.quality = 42.0;
+    o.referenceBases = "foo";
+    o.referenceName = "foo";
+    o.start = "foo";
+    o.variantSetId = "foo";
+  }
+  buildCounterVariant--;
+  return o;
+}
+
+checkVariant(api.Variant o) {
+  buildCounterVariant++;
+  if (buildCounterVariant < 3) {
+    checkUnnamed1329(o.alternateBases);
+    checkUnnamed1330(o.calls);
+    unittest.expect(o.created, unittest.equals('foo'));
+    unittest.expect(o.end, unittest.equals('foo'));
+    checkUnnamed1331(o.filter);
+    unittest.expect(o.id, unittest.equals('foo'));
+    checkUnnamed1333(o.info);
+    checkUnnamed1334(o.names);
+    unittest.expect(o.quality, unittest.equals(42.0));
+    unittest.expect(o.referenceBases, unittest.equals('foo'));
+    unittest.expect(o.referenceName, unittest.equals('foo'));
+    unittest.expect(o.start, unittest.equals('foo'));
+    unittest.expect(o.variantSetId, unittest.equals('foo'));
+  }
+  buildCounterVariant--;
+}
+
+buildUnnamed1335() {
+  var o = new core.List<api.Metadata>();
+  o.add(buildMetadata());
+  o.add(buildMetadata());
+  return o;
+}
+
+checkUnnamed1335(core.List<api.Metadata> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkMetadata(o[0]);
+  checkMetadata(o[1]);
+}
+
+buildUnnamed1336() {
+  var o = new core.List<api.ReferenceBound>();
+  o.add(buildReferenceBound());
+  o.add(buildReferenceBound());
+  return o;
+}
+
+checkUnnamed1336(core.List<api.ReferenceBound> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkReferenceBound(o[0]);
+  checkReferenceBound(o[1]);
+}
+
+core.int buildCounterVariantSet = 0;
+buildVariantSet() {
+  var o = new api.VariantSet();
+  buildCounterVariantSet++;
+  if (buildCounterVariantSet < 3) {
+    o.datasetId = "foo";
+    o.id = "foo";
+    o.metadata = buildUnnamed1335();
+    o.referenceBounds = buildUnnamed1336();
+  }
+  buildCounterVariantSet--;
+  return o;
+}
+
+checkVariantSet(api.VariantSet o) {
+  buildCounterVariantSet++;
+  if (buildCounterVariantSet < 3) {
+    unittest.expect(o.datasetId, unittest.equals('foo'));
+    unittest.expect(o.id, unittest.equals('foo'));
+    checkUnnamed1335(o.metadata);
+    checkUnnamed1336(o.referenceBounds);
+  }
+  buildCounterVariantSet--;
+}
+
+
+main() {
+  unittest.group("obj-schema-AlignReadGroupSetsRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildAlignReadGroupSetsRequest();
+      var od = new api.AlignReadGroupSetsRequest.fromJson(o.toJson());
+      checkAlignReadGroupSetsRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-AlignReadGroupSetsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildAlignReadGroupSetsResponse();
+      var od = new api.AlignReadGroupSetsResponse.fromJson(o.toJson());
+      checkAlignReadGroupSetsResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-Call", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildCall();
+      var od = new api.Call.fromJson(o.toJson());
+      checkCall(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-CallReadGroupSetsRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildCallReadGroupSetsRequest();
+      var od = new api.CallReadGroupSetsRequest.fromJson(o.toJson());
+      checkCallReadGroupSetsRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-CallReadGroupSetsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildCallReadGroupSetsResponse();
+      var od = new api.CallReadGroupSetsResponse.fromJson(o.toJson());
+      checkCallReadGroupSetsResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-CallSet", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildCallSet();
+      var od = new api.CallSet.fromJson(o.toJson());
+      checkCallSet(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-CigarUnit", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildCigarUnit();
+      var od = new api.CigarUnit.fromJson(o.toJson());
+      checkCigarUnit(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-CoverageBucket", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildCoverageBucket();
+      var od = new api.CoverageBucket.fromJson(o.toJson());
+      checkCoverageBucket(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-Dataset", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildDataset();
+      var od = new api.Dataset.fromJson(o.toJson());
+      checkDataset(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ExperimentalCreateJobRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildExperimentalCreateJobRequest();
+      var od = new api.ExperimentalCreateJobRequest.fromJson(o.toJson());
+      checkExperimentalCreateJobRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ExperimentalCreateJobResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildExperimentalCreateJobResponse();
+      var od = new api.ExperimentalCreateJobResponse.fromJson(o.toJson());
+      checkExperimentalCreateJobResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ExportReadGroupSetsRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildExportReadGroupSetsRequest();
+      var od = new api.ExportReadGroupSetsRequest.fromJson(o.toJson());
+      checkExportReadGroupSetsRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ExportReadGroupSetsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildExportReadGroupSetsResponse();
+      var od = new api.ExportReadGroupSetsResponse.fromJson(o.toJson());
+      checkExportReadGroupSetsResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ExportVariantSetRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildExportVariantSetRequest();
+      var od = new api.ExportVariantSetRequest.fromJson(o.toJson());
+      checkExportVariantSetRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ExportVariantSetResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildExportVariantSetResponse();
+      var od = new api.ExportVariantSetResponse.fromJson(o.toJson());
+      checkExportVariantSetResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-FastqMetadata", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildFastqMetadata();
+      var od = new api.FastqMetadata.fromJson(o.toJson());
+      checkFastqMetadata(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ImportReadGroupSetsRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildImportReadGroupSetsRequest();
+      var od = new api.ImportReadGroupSetsRequest.fromJson(o.toJson());
+      checkImportReadGroupSetsRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ImportReadGroupSetsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildImportReadGroupSetsResponse();
+      var od = new api.ImportReadGroupSetsResponse.fromJson(o.toJson());
+      checkImportReadGroupSetsResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ImportVariantsRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildImportVariantsRequest();
+      var od = new api.ImportVariantsRequest.fromJson(o.toJson());
+      checkImportVariantsRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ImportVariantsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildImportVariantsResponse();
+      var od = new api.ImportVariantsResponse.fromJson(o.toJson());
+      checkImportVariantsResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-InterleavedFastqSource", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildInterleavedFastqSource();
+      var od = new api.InterleavedFastqSource.fromJson(o.toJson());
+      checkInterleavedFastqSource(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-Job", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildJob();
+      var od = new api.Job.fromJson(o.toJson());
+      checkJob(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-JobRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildJobRequest();
+      var od = new api.JobRequest.fromJson(o.toJson());
+      checkJobRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-LinearAlignment", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildLinearAlignment();
+      var od = new api.LinearAlignment.fromJson(o.toJson());
+      checkLinearAlignment(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ListBasesResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListBasesResponse();
+      var od = new api.ListBasesResponse.fromJson(o.toJson());
+      checkListBasesResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ListCoverageBucketsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListCoverageBucketsResponse();
+      var od = new api.ListCoverageBucketsResponse.fromJson(o.toJson());
+      checkListCoverageBucketsResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ListDatasetsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildListDatasetsResponse();
+      var od = new api.ListDatasetsResponse.fromJson(o.toJson());
+      checkListDatasetsResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-MergeVariantsRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildMergeVariantsRequest();
+      var od = new api.MergeVariantsRequest.fromJson(o.toJson());
+      checkMergeVariantsRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-Metadata", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildMetadata();
+      var od = new api.Metadata.fromJson(o.toJson());
+      checkMetadata(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-PairedFastqSource", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildPairedFastqSource();
+      var od = new api.PairedFastqSource.fromJson(o.toJson());
+      checkPairedFastqSource(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-Position", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildPosition();
+      var od = new api.Position.fromJson(o.toJson());
+      checkPosition(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-Range", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildRange();
+      var od = new api.Range.fromJson(o.toJson());
+      checkRange(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-Read", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildRead();
+      var od = new api.Read.fromJson(o.toJson());
+      checkRead(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ReadGroup", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildReadGroup();
+      var od = new api.ReadGroup.fromJson(o.toJson());
+      checkReadGroup(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ReadGroupExperiment", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildReadGroupExperiment();
+      var od = new api.ReadGroupExperiment.fromJson(o.toJson());
+      checkReadGroupExperiment(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ReadGroupProgram", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildReadGroupProgram();
+      var od = new api.ReadGroupProgram.fromJson(o.toJson());
+      checkReadGroupProgram(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ReadGroupSet", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildReadGroupSet();
+      var od = new api.ReadGroupSet.fromJson(o.toJson());
+      checkReadGroupSet(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-Reference", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildReference();
+      var od = new api.Reference.fromJson(o.toJson());
+      checkReference(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ReferenceBound", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildReferenceBound();
+      var od = new api.ReferenceBound.fromJson(o.toJson());
+      checkReferenceBound(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-ReferenceSet", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildReferenceSet();
+      var od = new api.ReferenceSet.fromJson(o.toJson());
+      checkReferenceSet(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-SearchCallSetsRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSearchCallSetsRequest();
+      var od = new api.SearchCallSetsRequest.fromJson(o.toJson());
+      checkSearchCallSetsRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-SearchCallSetsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSearchCallSetsResponse();
+      var od = new api.SearchCallSetsResponse.fromJson(o.toJson());
+      checkSearchCallSetsResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-SearchJobsRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSearchJobsRequest();
+      var od = new api.SearchJobsRequest.fromJson(o.toJson());
+      checkSearchJobsRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-SearchJobsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSearchJobsResponse();
+      var od = new api.SearchJobsResponse.fromJson(o.toJson());
+      checkSearchJobsResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-SearchReadGroupSetsRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSearchReadGroupSetsRequest();
+      var od = new api.SearchReadGroupSetsRequest.fromJson(o.toJson());
+      checkSearchReadGroupSetsRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-SearchReadGroupSetsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSearchReadGroupSetsResponse();
+      var od = new api.SearchReadGroupSetsResponse.fromJson(o.toJson());
+      checkSearchReadGroupSetsResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-SearchReadsRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSearchReadsRequest();
+      var od = new api.SearchReadsRequest.fromJson(o.toJson());
+      checkSearchReadsRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-SearchReadsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSearchReadsResponse();
+      var od = new api.SearchReadsResponse.fromJson(o.toJson());
+      checkSearchReadsResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-SearchReferenceSetsRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSearchReferenceSetsRequest();
+      var od = new api.SearchReferenceSetsRequest.fromJson(o.toJson());
+      checkSearchReferenceSetsRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-SearchReferenceSetsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSearchReferenceSetsResponse();
+      var od = new api.SearchReferenceSetsResponse.fromJson(o.toJson());
+      checkSearchReferenceSetsResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-SearchReferencesRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSearchReferencesRequest();
+      var od = new api.SearchReferencesRequest.fromJson(o.toJson());
+      checkSearchReferencesRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-SearchReferencesResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSearchReferencesResponse();
+      var od = new api.SearchReferencesResponse.fromJson(o.toJson());
+      checkSearchReferencesResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-SearchVariantSetsRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSearchVariantSetsRequest();
+      var od = new api.SearchVariantSetsRequest.fromJson(o.toJson());
+      checkSearchVariantSetsRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-SearchVariantSetsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSearchVariantSetsResponse();
+      var od = new api.SearchVariantSetsResponse.fromJson(o.toJson());
+      checkSearchVariantSetsResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-SearchVariantsRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSearchVariantsRequest();
+      var od = new api.SearchVariantsRequest.fromJson(o.toJson());
+      checkSearchVariantsRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-SearchVariantsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSearchVariantsResponse();
+      var od = new api.SearchVariantsResponse.fromJson(o.toJson());
+      checkSearchVariantsResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-Variant", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildVariant();
+      var od = new api.Variant.fromJson(o.toJson());
+      checkVariant(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-VariantSet", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildVariantSet();
+      var od = new api.VariantSet.fromJson(o.toJson());
+      checkVariantSet(od);
+    });
+  });
+
+
+  unittest.group("resource-CallsetsResourceApi", () {
+    unittest.test("method--create", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.CallsetsResourceApi res = new api.GenomicsApi(mock).callsets;
+      var arg_request = buildCallSet();
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.CallSet.fromJson(json);
+        checkCallSet(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("callsets"));
+        pathOffset += 8;
+
+        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(buildCallSet());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.create(arg_request).then(unittest.expectAsync(((api.CallSet response) {
+        checkCallSet(response);
+      })));
+    });
+
+    unittest.test("method--delete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.CallsetsResourceApi res = new api.GenomicsApi(mock).callsets;
+      var arg_callSetId = "foo";
+      mock.register(unittest.expectAsync((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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("callsets/"));
+        pathOffset += 9;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_callSetId"));
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.delete(arg_callSetId).then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.CallsetsResourceApi res = new api.GenomicsApi(mock).callsets;
+      var arg_callSetId = "foo";
+      mock.register(unittest.expectAsync((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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("callsets/"));
+        pathOffset += 9;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_callSetId"));
+
+        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(buildCallSet());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_callSetId).then(unittest.expectAsync(((api.CallSet response) {
+        checkCallSet(response);
+      })));
+    });
+
+    unittest.test("method--patch", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.CallsetsResourceApi res = new api.GenomicsApi(mock).callsets;
+      var arg_request = buildCallSet();
+      var arg_callSetId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.CallSet.fromJson(json);
+        checkCallSet(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("callsets/"));
+        pathOffset += 9;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_callSetId"));
+
+        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(buildCallSet());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.patch(arg_request, arg_callSetId).then(unittest.expectAsync(((api.CallSet response) {
+        checkCallSet(response);
+      })));
+    });
+
+    unittest.test("method--search", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.CallsetsResourceApi res = new api.GenomicsApi(mock).callsets;
+      var arg_request = buildSearchCallSetsRequest();
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.SearchCallSetsRequest.fromJson(json);
+        checkSearchCallSetsRequest(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("callsets/search"));
+        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(buildSearchCallSetsResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.search(arg_request).then(unittest.expectAsync(((api.SearchCallSetsResponse response) {
+        checkSearchCallSetsResponse(response);
+      })));
+    });
+
+    unittest.test("method--update", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.CallsetsResourceApi res = new api.GenomicsApi(mock).callsets;
+      var arg_request = buildCallSet();
+      var arg_callSetId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.CallSet.fromJson(json);
+        checkCallSet(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("callsets/"));
+        pathOffset += 9;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_callSetId"));
+
+        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(buildCallSet());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.update(arg_request, arg_callSetId).then(unittest.expectAsync(((api.CallSet response) {
+        checkCallSet(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-DatasetsResourceApi", () {
+    unittest.test("method--create", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.DatasetsResourceApi res = new api.GenomicsApi(mock).datasets;
+      var arg_request = buildDataset();
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.Dataset.fromJson(json);
+        checkDataset(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("datasets"));
+        pathOffset += 8;
+
+        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(buildDataset());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.create(arg_request).then(unittest.expectAsync(((api.Dataset response) {
+        checkDataset(response);
+      })));
+    });
+
+    unittest.test("method--delete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.DatasetsResourceApi res = new api.GenomicsApi(mock).datasets;
+      var arg_datasetId = "foo";
+      mock.register(unittest.expectAsync((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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("datasets/"));
+        pathOffset += 9;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_datasetId"));
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.delete(arg_datasetId).then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.DatasetsResourceApi res = new api.GenomicsApi(mock).datasets;
+      var arg_datasetId = "foo";
+      mock.register(unittest.expectAsync((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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("datasets/"));
+        pathOffset += 9;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_datasetId"));
+
+        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(buildDataset());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_datasetId).then(unittest.expectAsync(((api.Dataset response) {
+        checkDataset(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.DatasetsResourceApi res = new api.GenomicsApi(mock).datasets;
+      var arg_pageSize = 42;
+      var arg_pageToken = "foo";
+      var arg_projectNumber = "foo";
+      mock.register(unittest.expectAsync((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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("datasets"));
+        pathOffset += 8;
+
+        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));
+        unittest.expect(queryMap["projectNumber"].first, unittest.equals(arg_projectNumber));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildListDatasetsResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(pageSize: arg_pageSize, pageToken: arg_pageToken, projectNumber: arg_projectNumber).then(unittest.expectAsync(((api.ListDatasetsResponse response) {
+        checkListDatasetsResponse(response);
+      })));
+    });
+
+    unittest.test("method--patch", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.DatasetsResourceApi res = new api.GenomicsApi(mock).datasets;
+      var arg_request = buildDataset();
+      var arg_datasetId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.Dataset.fromJson(json);
+        checkDataset(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("datasets/"));
+        pathOffset += 9;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_datasetId"));
+
+        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(buildDataset());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.patch(arg_request, arg_datasetId).then(unittest.expectAsync(((api.Dataset response) {
+        checkDataset(response);
+      })));
+    });
+
+    unittest.test("method--undelete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.DatasetsResourceApi res = new api.GenomicsApi(mock).datasets;
+      var arg_datasetId = "foo";
+      mock.register(unittest.expectAsync((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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("datasets/"));
+        pathOffset += 9;
+        index = path.indexOf("/undelete", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        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"));
+        pathOffset += 9;
+
+        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(buildDataset());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.undelete(arg_datasetId).then(unittest.expectAsync(((api.Dataset response) {
+        checkDataset(response);
+      })));
+    });
+
+    unittest.test("method--update", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.DatasetsResourceApi res = new api.GenomicsApi(mock).datasets;
+      var arg_request = buildDataset();
+      var arg_datasetId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.Dataset.fromJson(json);
+        checkDataset(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("datasets/"));
+        pathOffset += 9;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_datasetId"));
+
+        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(buildDataset());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.update(arg_request, arg_datasetId).then(unittest.expectAsync(((api.Dataset response) {
+        checkDataset(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-ExperimentalJobsResourceApi", () {
+    unittest.test("method--create", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ExperimentalJobsResourceApi res = new api.GenomicsApi(mock).experimental.jobs;
+      var arg_request = buildExperimentalCreateJobRequest();
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.ExperimentalCreateJobRequest.fromJson(json);
+        checkExperimentalCreateJobRequest(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("experimental/jobs/create"));
+        pathOffset += 24;
+
+        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(buildExperimentalCreateJobResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.create(arg_request).then(unittest.expectAsync(((api.ExperimentalCreateJobResponse response) {
+        checkExperimentalCreateJobResponse(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-JobsResourceApi", () {
+    unittest.test("method--cancel", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.JobsResourceApi res = new api.GenomicsApi(mock).jobs;
+      var arg_jobId = "foo";
+      mock.register(unittest.expectAsync((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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("jobs/"));
+        pathOffset += 5;
+        index = path.indexOf("/cancel", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        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"));
+        pathOffset += 7;
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.cancel(arg_jobId).then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.JobsResourceApi res = new api.GenomicsApi(mock).jobs;
+      var arg_jobId = "foo";
+      mock.register(unittest.expectAsync((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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("jobs/"));
+        pathOffset += 5;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_jobId"));
+
+        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(buildJob());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_jobId).then(unittest.expectAsync(((api.Job response) {
+        checkJob(response);
+      })));
+    });
+
+    unittest.test("method--search", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.JobsResourceApi res = new api.GenomicsApi(mock).jobs;
+      var arg_request = buildSearchJobsRequest();
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.SearchJobsRequest.fromJson(json);
+        checkSearchJobsRequest(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("jobs/search"));
+        pathOffset += 11;
+
+        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(buildSearchJobsResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.search(arg_request).then(unittest.expectAsync(((api.SearchJobsResponse response) {
+        checkSearchJobsResponse(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-ReadgroupsetsResourceApi", () {
+    unittest.test("method--align", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ReadgroupsetsResourceApi res = new api.GenomicsApi(mock).readgroupsets;
+      var arg_request = buildAlignReadGroupSetsRequest();
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.AlignReadGroupSetsRequest.fromJson(json);
+        checkAlignReadGroupSetsRequest(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("readgroupsets/align"));
+        pathOffset += 19;
+
+        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(buildAlignReadGroupSetsResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.align(arg_request).then(unittest.expectAsync(((api.AlignReadGroupSetsResponse response) {
+        checkAlignReadGroupSetsResponse(response);
+      })));
+    });
+
+    unittest.test("method--call", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ReadgroupsetsResourceApi res = new api.GenomicsApi(mock).readgroupsets;
+      var arg_request = buildCallReadGroupSetsRequest();
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.CallReadGroupSetsRequest.fromJson(json);
+        checkCallReadGroupSetsRequest(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("readgroupsets/call"));
+        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]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildCallReadGroupSetsResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.call(arg_request).then(unittest.expectAsync(((api.CallReadGroupSetsResponse response) {
+        checkCallReadGroupSetsResponse(response);
+      })));
+    });
+
+    unittest.test("method--delete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ReadgroupsetsResourceApi res = new api.GenomicsApi(mock).readgroupsets;
+      var arg_readGroupSetId = "foo";
+      mock.register(unittest.expectAsync((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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("readgroupsets/"));
+        pathOffset += 14;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_readGroupSetId"));
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.delete(arg_readGroupSetId).then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--export", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ReadgroupsetsResourceApi res = new api.GenomicsApi(mock).readgroupsets;
+      var arg_request = buildExportReadGroupSetsRequest();
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.ExportReadGroupSetsRequest.fromJson(json);
+        checkExportReadGroupSetsRequest(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("readgroupsets/export"));
+        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(buildExportReadGroupSetsResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.export(arg_request).then(unittest.expectAsync(((api.ExportReadGroupSetsResponse response) {
+        checkExportReadGroupSetsResponse(response);
+      })));
+    });
+
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ReadgroupsetsResourceApi res = new api.GenomicsApi(mock).readgroupsets;
+      var arg_readGroupSetId = "foo";
+      mock.register(unittest.expectAsync((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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("readgroupsets/"));
+        pathOffset += 14;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_readGroupSetId"));
+
+        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(buildReadGroupSet());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_readGroupSetId).then(unittest.expectAsync(((api.ReadGroupSet response) {
+        checkReadGroupSet(response);
+      })));
+    });
+
+    unittest.test("method--import", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ReadgroupsetsResourceApi res = new api.GenomicsApi(mock).readgroupsets;
+      var arg_request = buildImportReadGroupSetsRequest();
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.ImportReadGroupSetsRequest.fromJson(json);
+        checkImportReadGroupSetsRequest(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("readgroupsets/import"));
+        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(buildImportReadGroupSetsResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.import(arg_request).then(unittest.expectAsync(((api.ImportReadGroupSetsResponse response) {
+        checkImportReadGroupSetsResponse(response);
+      })));
+    });
+
+    unittest.test("method--patch", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ReadgroupsetsResourceApi res = new api.GenomicsApi(mock).readgroupsets;
+      var arg_request = buildReadGroupSet();
+      var arg_readGroupSetId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.ReadGroupSet.fromJson(json);
+        checkReadGroupSet(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("readgroupsets/"));
+        pathOffset += 14;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_readGroupSetId"));
+
+        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(buildReadGroupSet());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.patch(arg_request, arg_readGroupSetId).then(unittest.expectAsync(((api.ReadGroupSet response) {
+        checkReadGroupSet(response);
+      })));
+    });
+
+    unittest.test("method--search", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ReadgroupsetsResourceApi res = new api.GenomicsApi(mock).readgroupsets;
+      var arg_request = buildSearchReadGroupSetsRequest();
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.SearchReadGroupSetsRequest.fromJson(json);
+        checkSearchReadGroupSetsRequest(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("readgroupsets/search"));
+        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(buildSearchReadGroupSetsResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.search(arg_request).then(unittest.expectAsync(((api.SearchReadGroupSetsResponse response) {
+        checkSearchReadGroupSetsResponse(response);
+      })));
+    });
+
+    unittest.test("method--update", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ReadgroupsetsResourceApi res = new api.GenomicsApi(mock).readgroupsets;
+      var arg_request = buildReadGroupSet();
+      var arg_readGroupSetId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.ReadGroupSet.fromJson(json);
+        checkReadGroupSet(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("readgroupsets/"));
+        pathOffset += 14;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_readGroupSetId"));
+
+        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(buildReadGroupSet());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.update(arg_request, arg_readGroupSetId).then(unittest.expectAsync(((api.ReadGroupSet response) {
+        checkReadGroupSet(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-ReadgroupsetsCoveragebucketsResourceApi", () {
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ReadgroupsetsCoveragebucketsResourceApi res = new api.GenomicsApi(mock).readgroupsets.coveragebuckets;
+      var arg_readGroupSetId = "foo";
+      var arg_pageSize = 42;
+      var arg_pageToken = "foo";
+      var arg_range_end = "foo";
+      var arg_range_referenceName = "foo";
+      var arg_range_start = "foo";
+      var arg_targetBucketWidth = "foo";
+      mock.register(unittest.expectAsync((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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("readgroupsets/"));
+        pathOffset += 14;
+        index = path.indexOf("/coveragebuckets", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        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"));
+        pathOffset += 16;
+
+        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));
+        unittest.expect(queryMap["range.end"].first, unittest.equals(arg_range_end));
+        unittest.expect(queryMap["range.referenceName"].first, unittest.equals(arg_range_referenceName));
+        unittest.expect(queryMap["range.start"].first, unittest.equals(arg_range_start));
+        unittest.expect(queryMap["targetBucketWidth"].first, unittest.equals(arg_targetBucketWidth));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildListCoverageBucketsResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_readGroupSetId, pageSize: arg_pageSize, pageToken: arg_pageToken, range_end: arg_range_end, range_referenceName: arg_range_referenceName, range_start: arg_range_start, targetBucketWidth: arg_targetBucketWidth).then(unittest.expectAsync(((api.ListCoverageBucketsResponse response) {
+        checkListCoverageBucketsResponse(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-ReadsResourceApi", () {
+    unittest.test("method--search", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ReadsResourceApi res = new api.GenomicsApi(mock).reads;
+      var arg_request = buildSearchReadsRequest();
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.SearchReadsRequest.fromJson(json);
+        checkSearchReadsRequest(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("reads/search"));
+        pathOffset += 12;
+
+        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(buildSearchReadsResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.search(arg_request).then(unittest.expectAsync(((api.SearchReadsResponse response) {
+        checkSearchReadsResponse(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-ReferencesResourceApi", () {
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ReferencesResourceApi res = new api.GenomicsApi(mock).references;
+      var arg_referenceId = "foo";
+      mock.register(unittest.expectAsync((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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("references/"));
+        pathOffset += 11;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_referenceId"));
+
+        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(buildReference());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_referenceId).then(unittest.expectAsync(((api.Reference response) {
+        checkReference(response);
+      })));
+    });
+
+    unittest.test("method--search", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ReferencesResourceApi res = new api.GenomicsApi(mock).references;
+      var arg_request = buildSearchReferencesRequest();
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.SearchReferencesRequest.fromJson(json);
+        checkSearchReferencesRequest(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("references/search"));
+        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(buildSearchReferencesResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.search(arg_request).then(unittest.expectAsync(((api.SearchReferencesResponse response) {
+        checkSearchReferencesResponse(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-ReferencesBasesResourceApi", () {
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ReferencesBasesResourceApi res = new api.GenomicsApi(mock).references.bases;
+      var arg_referenceId = "foo";
+      var arg_end = "foo";
+      var arg_pageSize = 42;
+      var arg_pageToken = "foo";
+      var arg_start = "foo";
+      mock.register(unittest.expectAsync((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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("references/"));
+        pathOffset += 11;
+        index = path.indexOf("/bases", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        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"));
+        pathOffset += 6;
+
+        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["end"].first, unittest.equals(arg_end));
+        unittest.expect(core.int.parse(queryMap["pageSize"].first), unittest.equals(arg_pageSize));
+        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(queryMap["start"].first, unittest.equals(arg_start));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildListBasesResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_referenceId, end: arg_end, pageSize: arg_pageSize, pageToken: arg_pageToken, start: arg_start).then(unittest.expectAsync(((api.ListBasesResponse response) {
+        checkListBasesResponse(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-ReferencesetsResourceApi", () {
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ReferencesetsResourceApi res = new api.GenomicsApi(mock).referencesets;
+      var arg_referenceSetId = "foo";
+      mock.register(unittest.expectAsync((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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("referencesets/"));
+        pathOffset += 14;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_referenceSetId"));
+
+        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(buildReferenceSet());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_referenceSetId).then(unittest.expectAsync(((api.ReferenceSet response) {
+        checkReferenceSet(response);
+      })));
+    });
+
+    unittest.test("method--search", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ReferencesetsResourceApi res = new api.GenomicsApi(mock).referencesets;
+      var arg_request = buildSearchReferenceSetsRequest();
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.SearchReferenceSetsRequest.fromJson(json);
+        checkSearchReferenceSetsRequest(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("referencesets/search"));
+        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(buildSearchReferenceSetsResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.search(arg_request).then(unittest.expectAsync(((api.SearchReferenceSetsResponse response) {
+        checkSearchReferenceSetsResponse(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-VariantsResourceApi", () {
+    unittest.test("method--create", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.VariantsResourceApi res = new api.GenomicsApi(mock).variants;
+      var arg_request = buildVariant();
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.Variant.fromJson(json);
+        checkVariant(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("variants"));
+        pathOffset += 8;
+
+        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(buildVariant());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.create(arg_request).then(unittest.expectAsync(((api.Variant response) {
+        checkVariant(response);
+      })));
+    });
+
+    unittest.test("method--delete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.VariantsResourceApi res = new api.GenomicsApi(mock).variants;
+      var arg_variantId = "foo";
+      mock.register(unittest.expectAsync((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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("variants/"));
+        pathOffset += 9;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_variantId"));
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.delete(arg_variantId).then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.VariantsResourceApi res = new api.GenomicsApi(mock).variants;
+      var arg_variantId = "foo";
+      mock.register(unittest.expectAsync((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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("variants/"));
+        pathOffset += 9;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_variantId"));
+
+        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(buildVariant());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_variantId).then(unittest.expectAsync(((api.Variant response) {
+        checkVariant(response);
+      })));
+    });
+
+    unittest.test("method--search", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.VariantsResourceApi res = new api.GenomicsApi(mock).variants;
+      var arg_request = buildSearchVariantsRequest();
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.SearchVariantsRequest.fromJson(json);
+        checkSearchVariantsRequest(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("variants/search"));
+        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(buildSearchVariantsResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.search(arg_request).then(unittest.expectAsync(((api.SearchVariantsResponse response) {
+        checkSearchVariantsResponse(response);
+      })));
+    });
+
+    unittest.test("method--update", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.VariantsResourceApi res = new api.GenomicsApi(mock).variants;
+      var arg_request = buildVariant();
+      var arg_variantId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.Variant.fromJson(json);
+        checkVariant(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("variants/"));
+        pathOffset += 9;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_variantId"));
+
+        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(buildVariant());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.update(arg_request, arg_variantId).then(unittest.expectAsync(((api.Variant response) {
+        checkVariant(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-VariantsetsResourceApi", () {
+    unittest.test("method--delete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.VariantsetsResourceApi res = new api.GenomicsApi(mock).variantsets;
+      var arg_variantSetId = "foo";
+      mock.register(unittest.expectAsync((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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("variantsets/"));
+        pathOffset += 12;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_variantSetId"));
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.delete(arg_variantSetId).then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--export", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.VariantsetsResourceApi res = new api.GenomicsApi(mock).variantsets;
+      var arg_request = buildExportVariantSetRequest();
+      var arg_variantSetId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.ExportVariantSetRequest.fromJson(json);
+        checkExportVariantSetRequest(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("variantsets/"));
+        pathOffset += 12;
+        index = path.indexOf("/export", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        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"));
+        pathOffset += 7;
+
+        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(buildExportVariantSetResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.export(arg_request, arg_variantSetId).then(unittest.expectAsync(((api.ExportVariantSetResponse response) {
+        checkExportVariantSetResponse(response);
+      })));
+    });
+
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.VariantsetsResourceApi res = new api.GenomicsApi(mock).variantsets;
+      var arg_variantSetId = "foo";
+      mock.register(unittest.expectAsync((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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("variantsets/"));
+        pathOffset += 12;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_variantSetId"));
+
+        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(buildVariantSet());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_variantSetId).then(unittest.expectAsync(((api.VariantSet response) {
+        checkVariantSet(response);
+      })));
+    });
+
+    unittest.test("method--importVariants", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.VariantsetsResourceApi res = new api.GenomicsApi(mock).variantsets;
+      var arg_request = buildImportVariantsRequest();
+      var arg_variantSetId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.ImportVariantsRequest.fromJson(json);
+        checkImportVariantsRequest(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("variantsets/"));
+        pathOffset += 12;
+        index = path.indexOf("/importVariants", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_variantSetId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/importVariants"));
+        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(buildImportVariantsResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.importVariants(arg_request, arg_variantSetId).then(unittest.expectAsync(((api.ImportVariantsResponse response) {
+        checkImportVariantsResponse(response);
+      })));
+    });
+
+    unittest.test("method--mergeVariants", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.VariantsetsResourceApi res = new api.GenomicsApi(mock).variantsets;
+      var arg_request = buildMergeVariantsRequest();
+      var arg_variantSetId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.MergeVariantsRequest.fromJson(json);
+        checkMergeVariantsRequest(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("variantsets/"));
+        pathOffset += 12;
+        index = path.indexOf("/mergeVariants", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_variantSetId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/mergeVariants"));
+        pathOffset += 14;
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.mergeVariants(arg_request, arg_variantSetId).then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--patch", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.VariantsetsResourceApi res = new api.GenomicsApi(mock).variantsets;
+      var arg_request = buildVariantSet();
+      var arg_variantSetId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.VariantSet.fromJson(json);
+        checkVariantSet(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("variantsets/"));
+        pathOffset += 12;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_variantSetId"));
+
+        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(buildVariantSet());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.patch(arg_request, arg_variantSetId).then(unittest.expectAsync(((api.VariantSet response) {
+        checkVariantSet(response);
+      })));
+    });
+
+    unittest.test("method--search", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.VariantsetsResourceApi res = new api.GenomicsApi(mock).variantsets;
+      var arg_request = buildSearchVariantSetsRequest();
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.SearchVariantSetsRequest.fromJson(json);
+        checkSearchVariantSetsRequest(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("variantsets/search"));
+        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]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildSearchVariantSetsResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.search(arg_request).then(unittest.expectAsync(((api.SearchVariantSetsResponse response) {
+        checkSearchVariantSetsResponse(response);
+      })));
+    });
+
+    unittest.test("method--update", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.VariantsetsResourceApi res = new api.GenomicsApi(mock).variantsets;
+      var arg_request = buildVariantSet();
+      var arg_variantSetId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.VariantSet.fromJson(json);
+        checkVariantSet(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 + 17), unittest.equals("genomics/v1beta2/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("variantsets/"));
+        pathOffset += 12;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_variantSetId"));
+
+        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(buildVariantSet());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.update(arg_request, arg_variantSetId).then(unittest.expectAsync(((api.VariantSet response) {
+        checkVariantSet(response);
+      })));
+    });
+
+  });
+
+
+}
+
diff --git a/generated/googleapis_beta/test/genomics/v1beta_test.dart b/generated/googleapis_beta/test/genomics/v1beta_test.dart
index 18e857e..5bc0b5b 100644
--- a/generated/googleapis_beta/test/genomics/v1beta_test.dart
+++ b/generated/googleapis_beta/test/genomics/v1beta_test.dart
@@ -16,75 +16,56 @@
 
 
 
-core.int buildCounterBeacon = 0;
-buildBeacon() {
-  var o = new api.Beacon();
-  buildCounterBeacon++;
-  if (buildCounterBeacon < 3) {
-    o.exists = true;
-  }
-  buildCounterBeacon--;
-  return o;
-}
-
-checkBeacon(api.Beacon o) {
-  buildCounterBeacon++;
-  if (buildCounterBeacon < 3) {
-    unittest.expect(o.exists, unittest.isTrue);
-  }
-  buildCounterBeacon--;
-}
-
-buildUnnamed1213() {
+buildUnnamed1214() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed1213(core.List<core.int> o) {
+checkUnnamed1214(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));
 }
 
-buildUnnamed1214() {
+buildUnnamed1215() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1214(core.List<core.double> o) {
+checkUnnamed1215(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));
 }
 
-buildUnnamed1215() {
+buildUnnamed1216() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1215(core.List<core.String> o) {
+checkUnnamed1216(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1216() {
+buildUnnamed1217() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1215();
-  o["y"] = buildUnnamed1215();
+  o["x"] = buildUnnamed1216();
+  o["y"] = buildUnnamed1216();
   return o;
 }
 
-checkUnnamed1216(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1217(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1215(o["x"]);
-  checkUnnamed1215(o["y"]);
+  checkUnnamed1216(o["x"]);
+  checkUnnamed1216(o["y"]);
 }
 
 core.int buildCounterCall = 0;
@@ -94,9 +75,9 @@
   if (buildCounterCall < 3) {
     o.callSetId = "foo";
     o.callSetName = "foo";
-    o.genotype = buildUnnamed1213();
-    o.genotypeLikelihood = buildUnnamed1214();
-    o.info = buildUnnamed1216();
+    o.genotype = buildUnnamed1214();
+    o.genotypeLikelihood = buildUnnamed1215();
+    o.info = buildUnnamed1217();
     o.phaseset = "foo";
   }
   buildCounterCall--;
@@ -108,48 +89,48 @@
   if (buildCounterCall < 3) {
     unittest.expect(o.callSetId, unittest.equals('foo'));
     unittest.expect(o.callSetName, unittest.equals('foo'));
-    checkUnnamed1213(o.genotype);
-    checkUnnamed1214(o.genotypeLikelihood);
-    checkUnnamed1216(o.info);
+    checkUnnamed1214(o.genotype);
+    checkUnnamed1215(o.genotypeLikelihood);
+    checkUnnamed1217(o.info);
     unittest.expect(o.phaseset, unittest.equals('foo'));
   }
   buildCounterCall--;
 }
 
-buildUnnamed1217() {
+buildUnnamed1218() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1217(core.List<core.String> o) {
+checkUnnamed1218(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1218() {
+buildUnnamed1219() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1217();
-  o["y"] = buildUnnamed1217();
+  o["x"] = buildUnnamed1218();
+  o["y"] = buildUnnamed1218();
   return o;
 }
 
-checkUnnamed1218(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1219(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1217(o["x"]);
-  checkUnnamed1217(o["y"]);
+  checkUnnamed1218(o["x"]);
+  checkUnnamed1218(o["y"]);
 }
 
-buildUnnamed1219() {
+buildUnnamed1220() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1219(core.List<core.String> 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'));
@@ -162,10 +143,10 @@
   if (buildCounterCallSet < 3) {
     o.created = "foo";
     o.id = "foo";
-    o.info = buildUnnamed1218();
+    o.info = buildUnnamed1219();
     o.name = "foo";
     o.sampleId = "foo";
-    o.variantSetIds = buildUnnamed1219();
+    o.variantSetIds = buildUnnamed1220();
   }
   buildCounterCallSet--;
   return o;
@@ -176,10 +157,10 @@
   if (buildCounterCallSet < 3) {
     unittest.expect(o.created, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1218(o.info);
+    checkUnnamed1219(o.info);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.sampleId, unittest.equals('foo'));
-    checkUnnamed1219(o.variantSetIds);
+    checkUnnamed1220(o.variantSetIds);
   }
   buildCounterCallSet--;
 }
@@ -230,19 +211,6 @@
   buildCounterDataset--;
 }
 
-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'));
-}
-
 buildUnnamed1221() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -256,6 +224,19 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+buildUnnamed1222() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1222(core.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 buildCounterExperimentalCreateJobRequest = 0;
 buildExperimentalCreateJobRequest() {
   var o = new api.ExperimentalCreateJobRequest();
@@ -264,9 +245,9 @@
     o.align = true;
     o.callVariants = true;
     o.gcsOutputPath = "foo";
-    o.pairedSourceUris = buildUnnamed1220();
+    o.pairedSourceUris = buildUnnamed1221();
     o.projectId = "foo";
-    o.sourceUris = buildUnnamed1221();
+    o.sourceUris = buildUnnamed1222();
   }
   buildCounterExperimentalCreateJobRequest--;
   return o;
@@ -278,9 +259,9 @@
     unittest.expect(o.align, unittest.isTrue);
     unittest.expect(o.callVariants, unittest.isTrue);
     unittest.expect(o.gcsOutputPath, unittest.equals('foo'));
-    checkUnnamed1220(o.pairedSourceUris);
+    checkUnnamed1221(o.pairedSourceUris);
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkUnnamed1221(o.sourceUris);
+    checkUnnamed1222(o.sourceUris);
   }
   buildCounterExperimentalCreateJobRequest--;
 }
@@ -304,19 +285,6 @@
   buildCounterExperimentalCreateJobResponse--;
 }
 
-buildUnnamed1222() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1222(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 buildUnnamed1223() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -330,6 +298,19 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+buildUnnamed1224() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1224(core.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 buildCounterExportReadsetsRequest = 0;
 buildExportReadsetsRequest() {
   var o = new api.ExportReadsetsRequest();
@@ -337,8 +318,8 @@
   if (buildCounterExportReadsetsRequest < 3) {
     o.exportUri = "foo";
     o.projectId = "foo";
-    o.readsetIds = buildUnnamed1222();
-    o.referenceNames = buildUnnamed1223();
+    o.readsetIds = buildUnnamed1223();
+    o.referenceNames = buildUnnamed1224();
   }
   buildCounterExportReadsetsRequest--;
   return o;
@@ -349,8 +330,8 @@
   if (buildCounterExportReadsetsRequest < 3) {
     unittest.expect(o.exportUri, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkUnnamed1222(o.readsetIds);
-    checkUnnamed1223(o.referenceNames);
+    checkUnnamed1223(o.readsetIds);
+    checkUnnamed1224(o.referenceNames);
   }
   buildCounterExportReadsetsRequest--;
 }
@@ -374,14 +355,14 @@
   buildCounterExportReadsetsResponse--;
 }
 
-buildUnnamed1224() {
+buildUnnamed1225() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1224(core.List<core.String> 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'));
@@ -394,7 +375,7 @@
   if (buildCounterExportVariantsRequest < 3) {
     o.bigqueryDataset = "foo";
     o.bigqueryTable = "foo";
-    o.callSetIds = buildUnnamed1224();
+    o.callSetIds = buildUnnamed1225();
     o.format = "foo";
     o.projectId = "foo";
     o.variantSetId = "foo";
@@ -408,7 +389,7 @@
   if (buildCounterExportVariantsRequest < 3) {
     unittest.expect(o.bigqueryDataset, unittest.equals('foo'));
     unittest.expect(o.bigqueryTable, unittest.equals('foo'));
-    checkUnnamed1224(o.callSetIds);
+    checkUnnamed1225(o.callSetIds);
     unittest.expect(o.format, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.variantSetId, unittest.equals('foo'));
@@ -479,66 +460,66 @@
   buildCounterHeader--;
 }
 
-buildUnnamed1225() {
+buildUnnamed1226() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1225(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'));
 }
 
-buildUnnamed1226() {
+buildUnnamed1227() {
   var o = new core.List<api.Header>();
   o.add(buildHeader());
   o.add(buildHeader());
   return o;
 }
 
-checkUnnamed1226(core.List<api.Header> o) {
+checkUnnamed1227(core.List<api.Header> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHeader(o[0]);
   checkHeader(o[1]);
 }
 
-buildUnnamed1227() {
+buildUnnamed1228() {
   var o = new core.List<api.Program>();
   o.add(buildProgram());
   o.add(buildProgram());
   return o;
 }
 
-checkUnnamed1227(core.List<api.Program> o) {
+checkUnnamed1228(core.List<api.Program> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProgram(o[0]);
   checkProgram(o[1]);
 }
 
-buildUnnamed1228() {
+buildUnnamed1229() {
   var o = new core.List<api.ReadGroup>();
   o.add(buildReadGroup());
   o.add(buildReadGroup());
   return o;
 }
 
-checkUnnamed1228(core.List<api.ReadGroup> o) {
+checkUnnamed1229(core.List<api.ReadGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReadGroup(o[0]);
   checkReadGroup(o[1]);
 }
 
-buildUnnamed1229() {
+buildUnnamed1230() {
   var o = new core.List<api.ReferenceSequence>();
   o.add(buildReferenceSequence());
   o.add(buildReferenceSequence());
   return o;
 }
 
-checkUnnamed1229(core.List<api.ReferenceSequence> o) {
+checkUnnamed1230(core.List<api.ReferenceSequence> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReferenceSequence(o[0]);
   checkReferenceSequence(o[1]);
@@ -549,13 +530,13 @@
   var o = new api.HeaderSection();
   buildCounterHeaderSection++;
   if (buildCounterHeaderSection < 3) {
-    o.comments = buildUnnamed1225();
+    o.comments = buildUnnamed1226();
     o.fileUri = "foo";
     o.filename = "foo";
-    o.headers = buildUnnamed1226();
-    o.programs = buildUnnamed1227();
-    o.readGroups = buildUnnamed1228();
-    o.refSequences = buildUnnamed1229();
+    o.headers = buildUnnamed1227();
+    o.programs = buildUnnamed1228();
+    o.readGroups = buildUnnamed1229();
+    o.refSequences = buildUnnamed1230();
   }
   buildCounterHeaderSection--;
   return o;
@@ -564,25 +545,25 @@
 checkHeaderSection(api.HeaderSection o) {
   buildCounterHeaderSection++;
   if (buildCounterHeaderSection < 3) {
-    checkUnnamed1225(o.comments);
+    checkUnnamed1226(o.comments);
     unittest.expect(o.fileUri, unittest.equals('foo'));
     unittest.expect(o.filename, unittest.equals('foo'));
-    checkUnnamed1226(o.headers);
-    checkUnnamed1227(o.programs);
-    checkUnnamed1228(o.readGroups);
-    checkUnnamed1229(o.refSequences);
+    checkUnnamed1227(o.headers);
+    checkUnnamed1228(o.programs);
+    checkUnnamed1229(o.readGroups);
+    checkUnnamed1230(o.refSequences);
   }
   buildCounterHeaderSection--;
 }
 
-buildUnnamed1230() {
+buildUnnamed1231() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1230(core.List<core.String> o) {
+checkUnnamed1231(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -594,7 +575,7 @@
   buildCounterImportReadsetsRequest++;
   if (buildCounterImportReadsetsRequest < 3) {
     o.datasetId = "foo";
-    o.sourceUris = buildUnnamed1230();
+    o.sourceUris = buildUnnamed1231();
   }
   buildCounterImportReadsetsRequest--;
   return o;
@@ -604,7 +585,7 @@
   buildCounterImportReadsetsRequest++;
   if (buildCounterImportReadsetsRequest < 3) {
     unittest.expect(o.datasetId, unittest.equals('foo'));
-    checkUnnamed1230(o.sourceUris);
+    checkUnnamed1231(o.sourceUris);
   }
   buildCounterImportReadsetsRequest--;
 }
@@ -628,14 +609,14 @@
   buildCounterImportReadsetsResponse--;
 }
 
-buildUnnamed1231() {
+buildUnnamed1232() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1231(core.List<core.String> o) {
+checkUnnamed1232(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -647,7 +628,7 @@
   buildCounterImportVariantsRequest++;
   if (buildCounterImportVariantsRequest < 3) {
     o.format = "foo";
-    o.sourceUris = buildUnnamed1231();
+    o.sourceUris = buildUnnamed1232();
     o.variantSetId = "foo";
   }
   buildCounterImportVariantsRequest--;
@@ -658,7 +639,7 @@
   buildCounterImportVariantsRequest++;
   if (buildCounterImportVariantsRequest < 3) {
     unittest.expect(o.format, unittest.equals('foo'));
-    checkUnnamed1231(o.sourceUris);
+    checkUnnamed1232(o.sourceUris);
     unittest.expect(o.variantSetId, unittest.equals('foo'));
   }
   buildCounterImportVariantsRequest--;
@@ -683,19 +664,6 @@
   buildCounterImportVariantsResponse--;
 }
 
-buildUnnamed1232() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1232(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 buildUnnamed1233() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -722,41 +690,6 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterJob = 0;
-buildJob() {
-  var o = new api.Job();
-  buildCounterJob++;
-  if (buildCounterJob < 3) {
-    o.created = "foo";
-    o.description = "foo";
-    o.errors = buildUnnamed1232();
-    o.id = "foo";
-    o.importedIds = buildUnnamed1233();
-    o.projectId = "foo";
-    o.request = buildJobRequest();
-    o.status = "foo";
-    o.warnings = buildUnnamed1234();
-  }
-  buildCounterJob--;
-  return o;
-}
-
-checkJob(api.Job o) {
-  buildCounterJob++;
-  if (buildCounterJob < 3) {
-    unittest.expect(o.created, unittest.equals('foo'));
-    unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1232(o.errors);
-    unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1233(o.importedIds);
-    unittest.expect(o.projectId, unittest.equals('foo'));
-    checkJobRequest(o.request);
-    unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed1234(o.warnings);
-  }
-  buildCounterJob--;
-}
-
 buildUnnamed1235() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -770,6 +703,41 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+core.int buildCounterJob = 0;
+buildJob() {
+  var o = new api.Job();
+  buildCounterJob++;
+  if (buildCounterJob < 3) {
+    o.created = "foo";
+    o.description = "foo";
+    o.errors = buildUnnamed1233();
+    o.id = "foo";
+    o.importedIds = buildUnnamed1234();
+    o.projectId = "foo";
+    o.request = buildJobRequest();
+    o.status = "foo";
+    o.warnings = buildUnnamed1235();
+  }
+  buildCounterJob--;
+  return o;
+}
+
+checkJob(api.Job o) {
+  buildCounterJob++;
+  if (buildCounterJob < 3) {
+    unittest.expect(o.created, unittest.equals('foo'));
+    unittest.expect(o.description, unittest.equals('foo'));
+    checkUnnamed1233(o.errors);
+    unittest.expect(o.id, unittest.equals('foo'));
+    checkUnnamed1234(o.importedIds);
+    unittest.expect(o.projectId, unittest.equals('foo'));
+    checkJobRequest(o.request);
+    unittest.expect(o.status, unittest.equals('foo'));
+    checkUnnamed1235(o.warnings);
+  }
+  buildCounterJob--;
+}
+
 buildUnnamed1236() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -783,13 +751,26 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+buildUnnamed1237() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1237(core.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 buildCounterJobRequest = 0;
 buildJobRequest() {
   var o = new api.JobRequest();
   buildCounterJobRequest++;
   if (buildCounterJobRequest < 3) {
-    o.destination = buildUnnamed1235();
-    o.source = buildUnnamed1236();
+    o.destination = buildUnnamed1236();
+    o.source = buildUnnamed1237();
     o.type = "foo";
   }
   buildCounterJobRequest--;
@@ -799,21 +780,21 @@
 checkJobRequest(api.JobRequest o) {
   buildCounterJobRequest++;
   if (buildCounterJobRequest < 3) {
-    checkUnnamed1235(o.destination);
-    checkUnnamed1236(o.source);
+    checkUnnamed1236(o.destination);
+    checkUnnamed1237(o.source);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterJobRequest--;
 }
 
-buildUnnamed1237() {
+buildUnnamed1238() {
   var o = new core.List<api.CoverageBucket>();
   o.add(buildCoverageBucket());
   o.add(buildCoverageBucket());
   return o;
 }
 
-checkUnnamed1237(core.List<api.CoverageBucket> o) {
+checkUnnamed1238(core.List<api.CoverageBucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCoverageBucket(o[0]);
   checkCoverageBucket(o[1]);
@@ -825,7 +806,7 @@
   buildCounterListCoverageBucketsResponse++;
   if (buildCounterListCoverageBucketsResponse < 3) {
     o.bucketWidth = "foo";
-    o.coverageBuckets = buildUnnamed1237();
+    o.coverageBuckets = buildUnnamed1238();
     o.nextPageToken = "foo";
   }
   buildCounterListCoverageBucketsResponse--;
@@ -836,20 +817,20 @@
   buildCounterListCoverageBucketsResponse++;
   if (buildCounterListCoverageBucketsResponse < 3) {
     unittest.expect(o.bucketWidth, unittest.equals('foo'));
-    checkUnnamed1237(o.coverageBuckets);
+    checkUnnamed1238(o.coverageBuckets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListCoverageBucketsResponse--;
 }
 
-buildUnnamed1238() {
+buildUnnamed1239() {
   var o = new core.List<api.Dataset>();
   o.add(buildDataset());
   o.add(buildDataset());
   return o;
 }
 
-checkUnnamed1238(core.List<api.Dataset> o) {
+checkUnnamed1239(core.List<api.Dataset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataset(o[0]);
   checkDataset(o[1]);
@@ -860,7 +841,7 @@
   var o = new api.ListDatasetsResponse();
   buildCounterListDatasetsResponse++;
   if (buildCounterListDatasetsResponse < 3) {
-    o.datasets = buildUnnamed1238();
+    o.datasets = buildUnnamed1239();
     o.nextPageToken = "foo";
   }
   buildCounterListDatasetsResponse--;
@@ -870,20 +851,20 @@
 checkListDatasetsResponse(api.ListDatasetsResponse o) {
   buildCounterListDatasetsResponse++;
   if (buildCounterListDatasetsResponse < 3) {
-    checkUnnamed1238(o.datasets);
+    checkUnnamed1239(o.datasets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListDatasetsResponse--;
 }
 
-buildUnnamed1239() {
+buildUnnamed1240() {
   var o = new core.List<api.Variant>();
   o.add(buildVariant());
   o.add(buildVariant());
   return o;
 }
 
-checkUnnamed1239(core.List<api.Variant> o) {
+checkUnnamed1240(core.List<api.Variant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariant(o[0]);
   checkVariant(o[1]);
@@ -894,7 +875,7 @@
   var o = new api.MergeVariantsRequest();
   buildCounterMergeVariantsRequest++;
   if (buildCounterMergeVariantsRequest < 3) {
-    o.variants = buildUnnamed1239();
+    o.variants = buildUnnamed1240();
   }
   buildCounterMergeVariantsRequest--;
   return o;
@@ -903,35 +884,35 @@
 checkMergeVariantsRequest(api.MergeVariantsRequest o) {
   buildCounterMergeVariantsRequest++;
   if (buildCounterMergeVariantsRequest < 3) {
-    checkUnnamed1239(o.variants);
+    checkUnnamed1240(o.variants);
   }
   buildCounterMergeVariantsRequest--;
 }
 
-buildUnnamed1240() {
+buildUnnamed1241() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1240(core.List<core.String> o) {
+checkUnnamed1241(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1241() {
+buildUnnamed1242() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1240();
-  o["y"] = buildUnnamed1240();
+  o["x"] = buildUnnamed1241();
+  o["y"] = buildUnnamed1241();
   return o;
 }
 
-checkUnnamed1241(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1242(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1240(o["x"]);
-  checkUnnamed1240(o["y"]);
+  checkUnnamed1241(o["x"]);
+  checkUnnamed1241(o["y"]);
 }
 
 core.int buildCounterMetadata = 0;
@@ -941,7 +922,7 @@
   if (buildCounterMetadata < 3) {
     o.description = "foo";
     o.id = "foo";
-    o.info = buildUnnamed1241();
+    o.info = buildUnnamed1242();
     o.key = "foo";
     o.number = "foo";
     o.type = "foo";
@@ -956,7 +937,7 @@
   if (buildCounterMetadata < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1241(o.info);
+    checkUnnamed1242(o.info);
     unittest.expect(o.key, unittest.equals('foo'));
     unittest.expect(o.number, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -992,30 +973,30 @@
   buildCounterProgram--;
 }
 
-buildUnnamed1242() {
+buildUnnamed1243() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1242(core.List<core.String> o) {
+checkUnnamed1243(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1243() {
+buildUnnamed1244() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1242();
-  o["y"] = buildUnnamed1242();
+  o["x"] = buildUnnamed1243();
+  o["y"] = buildUnnamed1243();
   return o;
 }
 
-checkUnnamed1243(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1244(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1242(o["x"]);
-  checkUnnamed1242(o["y"]);
+  checkUnnamed1243(o["x"]);
+  checkUnnamed1243(o["y"]);
 }
 
 core.int buildCounterRead = 0;
@@ -1036,7 +1017,7 @@
     o.position = 42;
     o.readsetId = "foo";
     o.referenceSequenceName = "foo";
-    o.tags = buildUnnamed1243();
+    o.tags = buildUnnamed1244();
     o.templateLength = 42;
   }
   buildCounterRead--;
@@ -1059,7 +1040,7 @@
     unittest.expect(o.position, unittest.equals(42));
     unittest.expect(o.readsetId, unittest.equals('foo'));
     unittest.expect(o.referenceSequenceName, unittest.equals('foo'));
-    checkUnnamed1243(o.tags);
+    checkUnnamed1244(o.tags);
     unittest.expect(o.templateLength, unittest.equals(42));
   }
   buildCounterRead--;
@@ -1106,14 +1087,14 @@
   buildCounterReadGroup--;
 }
 
-buildUnnamed1244() {
+buildUnnamed1245() {
   var o = new core.List<api.HeaderSection>();
   o.add(buildHeaderSection());
   o.add(buildHeaderSection());
   return o;
 }
 
-checkUnnamed1244(core.List<api.HeaderSection> o) {
+checkUnnamed1245(core.List<api.HeaderSection> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHeaderSection(o[0]);
   checkHeaderSection(o[1]);
@@ -1125,7 +1106,7 @@
   buildCounterReadset++;
   if (buildCounterReadset < 3) {
     o.datasetId = "foo";
-    o.fileData = buildUnnamed1244();
+    o.fileData = buildUnnamed1245();
     o.id = "foo";
     o.name = "foo";
   }
@@ -1137,7 +1118,7 @@
   buildCounterReadset++;
   if (buildCounterReadset < 3) {
     unittest.expect(o.datasetId, unittest.equals('foo'));
-    checkUnnamed1244(o.fileData);
+    checkUnnamed1245(o.fileData);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
   }
@@ -1194,14 +1175,14 @@
   buildCounterReferenceSequence--;
 }
 
-buildUnnamed1245() {
+buildUnnamed1246() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1245(core.List<core.String> o) {
+checkUnnamed1246(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1215,7 +1196,7 @@
     o.name = "foo";
     o.pageSize = 42;
     o.pageToken = "foo";
-    o.variantSetIds = buildUnnamed1245();
+    o.variantSetIds = buildUnnamed1246();
   }
   buildCounterSearchCallSetsRequest--;
   return o;
@@ -1227,19 +1208,19 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed1245(o.variantSetIds);
+    checkUnnamed1246(o.variantSetIds);
   }
   buildCounterSearchCallSetsRequest--;
 }
 
-buildUnnamed1246() {
+buildUnnamed1247() {
   var o = new core.List<api.CallSet>();
   o.add(buildCallSet());
   o.add(buildCallSet());
   return o;
 }
 
-checkUnnamed1246(core.List<api.CallSet> o) {
+checkUnnamed1247(core.List<api.CallSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCallSet(o[0]);
   checkCallSet(o[1]);
@@ -1250,7 +1231,7 @@
   var o = new api.SearchCallSetsResponse();
   buildCounterSearchCallSetsResponse++;
   if (buildCounterSearchCallSetsResponse < 3) {
-    o.callSets = buildUnnamed1246();
+    o.callSets = buildUnnamed1247();
     o.nextPageToken = "foo";
   }
   buildCounterSearchCallSetsResponse--;
@@ -1260,20 +1241,20 @@
 checkSearchCallSetsResponse(api.SearchCallSetsResponse o) {
   buildCounterSearchCallSetsResponse++;
   if (buildCounterSearchCallSetsResponse < 3) {
-    checkUnnamed1246(o.callSets);
+    checkUnnamed1247(o.callSets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterSearchCallSetsResponse--;
 }
 
-buildUnnamed1247() {
+buildUnnamed1248() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1247(core.List<core.String> o) {
+checkUnnamed1248(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1289,7 +1270,7 @@
     o.maxResults = "foo";
     o.pageToken = "foo";
     o.projectId = "foo";
-    o.status = buildUnnamed1247();
+    o.status = buildUnnamed1248();
   }
   buildCounterSearchJobsRequest--;
   return o;
@@ -1303,19 +1284,19 @@
     unittest.expect(o.maxResults, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkUnnamed1247(o.status);
+    checkUnnamed1248(o.status);
   }
   buildCounterSearchJobsRequest--;
 }
 
-buildUnnamed1248() {
+buildUnnamed1249() {
   var o = new core.List<api.Job>();
   o.add(buildJob());
   o.add(buildJob());
   return o;
 }
 
-checkUnnamed1248(core.List<api.Job> o) {
+checkUnnamed1249(core.List<api.Job> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJob(o[0]);
   checkJob(o[1]);
@@ -1326,7 +1307,7 @@
   var o = new api.SearchJobsResponse();
   buildCounterSearchJobsResponse++;
   if (buildCounterSearchJobsResponse < 3) {
-    o.jobs = buildUnnamed1248();
+    o.jobs = buildUnnamed1249();
     o.nextPageToken = "foo";
   }
   buildCounterSearchJobsResponse--;
@@ -1336,20 +1317,20 @@
 checkSearchJobsResponse(api.SearchJobsResponse o) {
   buildCounterSearchJobsResponse++;
   if (buildCounterSearchJobsResponse < 3) {
-    checkUnnamed1248(o.jobs);
+    checkUnnamed1249(o.jobs);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterSearchJobsResponse--;
 }
 
-buildUnnamed1249() {
+buildUnnamed1250() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1249(core.List<core.String> o) {
+checkUnnamed1250(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1362,7 +1343,7 @@
   if (buildCounterSearchReadsRequest < 3) {
     o.maxResults = "foo";
     o.pageToken = "foo";
-    o.readsetIds = buildUnnamed1249();
+    o.readsetIds = buildUnnamed1250();
     o.sequenceEnd = "foo";
     o.sequenceName = "foo";
     o.sequenceStart = "foo";
@@ -1376,7 +1357,7 @@
   if (buildCounterSearchReadsRequest < 3) {
     unittest.expect(o.maxResults, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed1249(o.readsetIds);
+    checkUnnamed1250(o.readsetIds);
     unittest.expect(o.sequenceEnd, unittest.equals('foo'));
     unittest.expect(o.sequenceName, unittest.equals('foo'));
     unittest.expect(o.sequenceStart, unittest.equals('foo'));
@@ -1384,14 +1365,14 @@
   buildCounterSearchReadsRequest--;
 }
 
-buildUnnamed1250() {
+buildUnnamed1251() {
   var o = new core.List<api.Read>();
   o.add(buildRead());
   o.add(buildRead());
   return o;
 }
 
-checkUnnamed1250(core.List<api.Read> o) {
+checkUnnamed1251(core.List<api.Read> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRead(o[0]);
   checkRead(o[1]);
@@ -1403,7 +1384,7 @@
   buildCounterSearchReadsResponse++;
   if (buildCounterSearchReadsResponse < 3) {
     o.nextPageToken = "foo";
-    o.reads = buildUnnamed1250();
+    o.reads = buildUnnamed1251();
   }
   buildCounterSearchReadsResponse--;
   return o;
@@ -1413,19 +1394,19 @@
   buildCounterSearchReadsResponse++;
   if (buildCounterSearchReadsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1250(o.reads);
+    checkUnnamed1251(o.reads);
   }
   buildCounterSearchReadsResponse--;
 }
 
-buildUnnamed1251() {
+buildUnnamed1252() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1251(core.List<core.String> o) {
+checkUnnamed1252(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1436,7 +1417,7 @@
   var o = new api.SearchReadsetsRequest();
   buildCounterSearchReadsetsRequest++;
   if (buildCounterSearchReadsetsRequest < 3) {
-    o.datasetIds = buildUnnamed1251();
+    o.datasetIds = buildUnnamed1252();
     o.maxResults = "foo";
     o.name = "foo";
     o.pageToken = "foo";
@@ -1448,7 +1429,7 @@
 checkSearchReadsetsRequest(api.SearchReadsetsRequest o) {
   buildCounterSearchReadsetsRequest++;
   if (buildCounterSearchReadsetsRequest < 3) {
-    checkUnnamed1251(o.datasetIds);
+    checkUnnamed1252(o.datasetIds);
     unittest.expect(o.maxResults, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
@@ -1456,14 +1437,14 @@
   buildCounterSearchReadsetsRequest--;
 }
 
-buildUnnamed1252() {
+buildUnnamed1253() {
   var o = new core.List<api.Readset>();
   o.add(buildReadset());
   o.add(buildReadset());
   return o;
 }
 
-checkUnnamed1252(core.List<api.Readset> o) {
+checkUnnamed1253(core.List<api.Readset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReadset(o[0]);
   checkReadset(o[1]);
@@ -1475,7 +1456,7 @@
   buildCounterSearchReadsetsResponse++;
   if (buildCounterSearchReadsetsResponse < 3) {
     o.nextPageToken = "foo";
-    o.readsets = buildUnnamed1252();
+    o.readsets = buildUnnamed1253();
   }
   buildCounterSearchReadsetsResponse--;
   return o;
@@ -1485,19 +1466,19 @@
   buildCounterSearchReadsetsResponse++;
   if (buildCounterSearchReadsetsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1252(o.readsets);
+    checkUnnamed1253(o.readsets);
   }
   buildCounterSearchReadsetsResponse--;
 }
 
-buildUnnamed1253() {
+buildUnnamed1254() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1253(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'));
@@ -1508,7 +1489,7 @@
   var o = new api.SearchVariantSetsRequest();
   buildCounterSearchVariantSetsRequest++;
   if (buildCounterSearchVariantSetsRequest < 3) {
-    o.datasetIds = buildUnnamed1253();
+    o.datasetIds = buildUnnamed1254();
     o.pageSize = 42;
     o.pageToken = "foo";
   }
@@ -1519,21 +1500,21 @@
 checkSearchVariantSetsRequest(api.SearchVariantSetsRequest o) {
   buildCounterSearchVariantSetsRequest++;
   if (buildCounterSearchVariantSetsRequest < 3) {
-    checkUnnamed1253(o.datasetIds);
+    checkUnnamed1254(o.datasetIds);
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
   }
   buildCounterSearchVariantSetsRequest--;
 }
 
-buildUnnamed1254() {
+buildUnnamed1255() {
   var o = new core.List<api.VariantSet>();
   o.add(buildVariantSet());
   o.add(buildVariantSet());
   return o;
 }
 
-checkUnnamed1254(core.List<api.VariantSet> o) {
+checkUnnamed1255(core.List<api.VariantSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariantSet(o[0]);
   checkVariantSet(o[1]);
@@ -1545,7 +1526,7 @@
   buildCounterSearchVariantSetsResponse++;
   if (buildCounterSearchVariantSetsResponse < 3) {
     o.nextPageToken = "foo";
-    o.variantSets = buildUnnamed1254();
+    o.variantSets = buildUnnamed1255();
   }
   buildCounterSearchVariantSetsResponse--;
   return o;
@@ -1555,24 +1536,11 @@
   buildCounterSearchVariantSetsResponse++;
   if (buildCounterSearchVariantSetsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1254(o.variantSets);
+    checkUnnamed1255(o.variantSets);
   }
   buildCounterSearchVariantSetsResponse--;
 }
 
-buildUnnamed1255() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1255(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 buildUnnamed1256() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -1586,12 +1554,25 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+buildUnnamed1257() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
+}
+
 core.int buildCounterSearchVariantsRequest = 0;
 buildSearchVariantsRequest() {
   var o = new api.SearchVariantsRequest();
   buildCounterSearchVariantsRequest++;
   if (buildCounterSearchVariantsRequest < 3) {
-    o.callSetIds = buildUnnamed1255();
+    o.callSetIds = buildUnnamed1256();
     o.end = "foo";
     o.maxCalls = 42;
     o.pageSize = 42;
@@ -1599,7 +1580,7 @@
     o.referenceName = "foo";
     o.start = "foo";
     o.variantName = "foo";
-    o.variantSetIds = buildUnnamed1256();
+    o.variantSetIds = buildUnnamed1257();
   }
   buildCounterSearchVariantsRequest--;
   return o;
@@ -1608,7 +1589,7 @@
 checkSearchVariantsRequest(api.SearchVariantsRequest o) {
   buildCounterSearchVariantsRequest++;
   if (buildCounterSearchVariantsRequest < 3) {
-    checkUnnamed1255(o.callSetIds);
+    checkUnnamed1256(o.callSetIds);
     unittest.expect(o.end, unittest.equals('foo'));
     unittest.expect(o.maxCalls, unittest.equals(42));
     unittest.expect(o.pageSize, unittest.equals(42));
@@ -1616,19 +1597,19 @@
     unittest.expect(o.referenceName, unittest.equals('foo'));
     unittest.expect(o.start, unittest.equals('foo'));
     unittest.expect(o.variantName, unittest.equals('foo'));
-    checkUnnamed1256(o.variantSetIds);
+    checkUnnamed1257(o.variantSetIds);
   }
   buildCounterSearchVariantsRequest--;
 }
 
-buildUnnamed1257() {
+buildUnnamed1258() {
   var o = new core.List<api.Variant>();
   o.add(buildVariant());
   o.add(buildVariant());
   return o;
 }
 
-checkUnnamed1257(core.List<api.Variant> o) {
+checkUnnamed1258(core.List<api.Variant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariant(o[0]);
   checkVariant(o[1]);
@@ -1640,7 +1621,7 @@
   buildCounterSearchVariantsResponse++;
   if (buildCounterSearchVariantsResponse < 3) {
     o.nextPageToken = "foo";
-    o.variants = buildUnnamed1257();
+    o.variants = buildUnnamed1258();
   }
   buildCounterSearchVariantsResponse--;
   return o;
@@ -1650,50 +1631,37 @@
   buildCounterSearchVariantsResponse++;
   if (buildCounterSearchVariantsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1257(o.variants);
+    checkUnnamed1258(o.variants);
   }
   buildCounterSearchVariantsResponse--;
 }
 
-buildUnnamed1258() {
+buildUnnamed1259() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1258(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'));
 }
 
-buildUnnamed1259() {
+buildUnnamed1260() {
   var o = new core.List<api.Call>();
   o.add(buildCall());
   o.add(buildCall());
   return o;
 }
 
-checkUnnamed1259(core.List<api.Call> o) {
+checkUnnamed1260(core.List<api.Call> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCall(o[0]);
   checkCall(o[1]);
 }
 
-buildUnnamed1260() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1260(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 buildUnnamed1261() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -1708,26 +1676,39 @@
 }
 
 buildUnnamed1262() {
-  var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1261();
-  o["y"] = buildUnnamed1261();
-  return o;
-}
-
-checkUnnamed1262(core.Map<core.String, core.List<core.String>> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1261(o["x"]);
-  checkUnnamed1261(o["y"]);
-}
-
-buildUnnamed1263() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1263(core.List<core.String> o) {
+checkUnnamed1262(core.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() {
+  var o = new core.Map<core.String, core.List<core.String>>();
+  o["x"] = buildUnnamed1262();
+  o["y"] = buildUnnamed1262();
+  return o;
+}
+
+checkUnnamed1263(core.Map<core.String, core.List<core.String>> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkUnnamed1262(o["x"]);
+  checkUnnamed1262(o["y"]);
+}
+
+buildUnnamed1264() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return 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'));
@@ -1738,14 +1719,14 @@
   var o = new api.Variant();
   buildCounterVariant++;
   if (buildCounterVariant < 3) {
-    o.alternateBases = buildUnnamed1258();
-    o.calls = buildUnnamed1259();
+    o.alternateBases = buildUnnamed1259();
+    o.calls = buildUnnamed1260();
     o.created = "foo";
     o.end = "foo";
-    o.filter = buildUnnamed1260();
+    o.filter = buildUnnamed1261();
     o.id = "foo";
-    o.info = buildUnnamed1262();
-    o.names = buildUnnamed1263();
+    o.info = buildUnnamed1263();
+    o.names = buildUnnamed1264();
     o.quality = 42.0;
     o.referenceBases = "foo";
     o.referenceName = "foo";
@@ -1759,14 +1740,14 @@
 checkVariant(api.Variant o) {
   buildCounterVariant++;
   if (buildCounterVariant < 3) {
-    checkUnnamed1258(o.alternateBases);
-    checkUnnamed1259(o.calls);
+    checkUnnamed1259(o.alternateBases);
+    checkUnnamed1260(o.calls);
     unittest.expect(o.created, unittest.equals('foo'));
     unittest.expect(o.end, unittest.equals('foo'));
-    checkUnnamed1260(o.filter);
+    checkUnnamed1261(o.filter);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1262(o.info);
-    checkUnnamed1263(o.names);
+    checkUnnamed1263(o.info);
+    checkUnnamed1264(o.names);
     unittest.expect(o.quality, unittest.equals(42.0));
     unittest.expect(o.referenceBases, unittest.equals('foo'));
     unittest.expect(o.referenceName, unittest.equals('foo'));
@@ -1776,27 +1757,27 @@
   buildCounterVariant--;
 }
 
-buildUnnamed1264() {
+buildUnnamed1265() {
   var o = new core.List<api.Metadata>();
   o.add(buildMetadata());
   o.add(buildMetadata());
   return o;
 }
 
-checkUnnamed1264(core.List<api.Metadata> o) {
+checkUnnamed1265(core.List<api.Metadata> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetadata(o[0]);
   checkMetadata(o[1]);
 }
 
-buildUnnamed1265() {
+buildUnnamed1266() {
   var o = new core.List<api.ReferenceBound>();
   o.add(buildReferenceBound());
   o.add(buildReferenceBound());
   return o;
 }
 
-checkUnnamed1265(core.List<api.ReferenceBound> o) {
+checkUnnamed1266(core.List<api.ReferenceBound> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReferenceBound(o[0]);
   checkReferenceBound(o[1]);
@@ -1809,8 +1790,8 @@
   if (buildCounterVariantSet < 3) {
     o.datasetId = "foo";
     o.id = "foo";
-    o.metadata = buildUnnamed1264();
-    o.referenceBounds = buildUnnamed1265();
+    o.metadata = buildUnnamed1265();
+    o.referenceBounds = buildUnnamed1266();
   }
   buildCounterVariantSet--;
   return o;
@@ -1821,23 +1802,14 @@
   if (buildCounterVariantSet < 3) {
     unittest.expect(o.datasetId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1264(o.metadata);
-    checkUnnamed1265(o.referenceBounds);
+    checkUnnamed1265(o.metadata);
+    checkUnnamed1266(o.referenceBounds);
   }
   buildCounterVariantSet--;
 }
 
 
 main() {
-  unittest.group("obj-schema-Beacon", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildBeacon();
-      var od = new api.Beacon.fromJson(o.toJson());
-      checkBeacon(od);
-    });
-  });
-
-
   unittest.group("obj-schema-Call", () {
     unittest.test("to-json--from-json", () {
       var o = buildCall();
@@ -2225,65 +2197,6 @@
   });
 
 
-  unittest.group("resource-BeaconsResourceApi", () {
-    unittest.test("method--get", () {
-
-      var mock = new common_test.HttpServerMock();
-      api.BeaconsResourceApi res = new api.GenomicsApi(mock).beacons;
-      var arg_variantSetId = "foo";
-      var arg_allele = "foo";
-      var arg_position = "foo";
-      var arg_referenceName = "foo";
-      mock.register(unittest.expectAsync((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 + 16), unittest.equals("genomics/v1beta/"));
-        pathOffset += 16;
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("beacons/"));
-        pathOffset += 8;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_variantSetId"));
-
-        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["allele"].first, unittest.equals(arg_allele));
-        unittest.expect(queryMap["position"].first, unittest.equals(arg_position));
-        unittest.expect(queryMap["referenceName"].first, unittest.equals(arg_referenceName));
-
-
-        var h = {
-          "content-type" : "application/json; charset=utf-8",
-        };
-        var resp = convert.JSON.encode(buildBeacon());
-        return new async.Future.value(common_test.stringResponse(200, h, resp));
-      }), true);
-      res.get(arg_variantSetId, allele: arg_allele, position: arg_position, referenceName: arg_referenceName).then(unittest.expectAsync(((api.Beacon response) {
-        checkBeacon(response);
-      })));
-    });
-
-  });
-
-
   unittest.group("resource-CallsetsResourceApi", () {
     unittest.test("method--create", () {
 
diff --git a/generated/googleapis_beta/test/manager/v1beta2_test.dart b/generated/googleapis_beta/test/manager/v1beta2_test.dart
index 3e995c2..ce09d28 100644
--- a/generated/googleapis_beta/test/manager/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/manager/v1beta2_test.dart
@@ -39,14 +39,14 @@
   buildCounterAccessConfig--;
 }
 
-buildUnnamed1183() {
+buildUnnamed1337() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1183(core.List<core.String> o) {
+checkUnnamed1337(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -57,7 +57,7 @@
   var o = new api.Action();
   buildCounterAction++;
   if (buildCounterAction < 3) {
-    o.commands = buildUnnamed1183();
+    o.commands = buildUnnamed1337();
     o.timeoutMs = 42;
   }
   buildCounterAction--;
@@ -67,20 +67,20 @@
 checkAction(api.Action o) {
   buildCounterAction++;
   if (buildCounterAction < 3) {
-    checkUnnamed1183(o.commands);
+    checkUnnamed1337(o.commands);
     unittest.expect(o.timeoutMs, unittest.equals(42));
   }
   buildCounterAction--;
 }
 
-buildUnnamed1184() {
+buildUnnamed1338() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1184(core.List<core.String> o) {
+checkUnnamed1338(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -92,7 +92,7 @@
   buildCounterAllowedRule++;
   if (buildCounterAllowedRule < 3) {
     o.IPProtocol = "foo";
-    o.ports = buildUnnamed1184();
+    o.ports = buildUnnamed1338();
   }
   buildCounterAllowedRule--;
   return o;
@@ -102,7 +102,7 @@
   buildCounterAllowedRule++;
   if (buildCounterAllowedRule < 3) {
     unittest.expect(o.IPProtocol, unittest.equals('foo'));
-    checkUnnamed1184(o.ports);
+    checkUnnamed1338(o.ports);
   }
   buildCounterAllowedRule--;
 }
@@ -178,27 +178,27 @@
   buildCounterDeployState--;
 }
 
-buildUnnamed1185() {
+buildUnnamed1339() {
   var o = new core.Map<core.String, api.ModuleStatus>();
   o["x"] = buildModuleStatus();
   o["y"] = buildModuleStatus();
   return o;
 }
 
-checkUnnamed1185(core.Map<core.String, api.ModuleStatus> o) {
+checkUnnamed1339(core.Map<core.String, api.ModuleStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkModuleStatus(o["x"]);
   checkModuleStatus(o["y"]);
 }
 
-buildUnnamed1186() {
+buildUnnamed1340() {
   var o = new core.List<api.ParamOverride>();
   o.add(buildParamOverride());
   o.add(buildParamOverride());
   return o;
 }
 
-checkUnnamed1186(core.List<api.ParamOverride> o) {
+checkUnnamed1340(core.List<api.ParamOverride> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParamOverride(o[0]);
   checkParamOverride(o[1]);
@@ -211,9 +211,9 @@
   if (buildCounterDeployment < 3) {
     o.creationDate = "foo";
     o.description = "foo";
-    o.modules = buildUnnamed1185();
+    o.modules = buildUnnamed1339();
     o.name = "foo";
-    o.overrides = buildUnnamed1186();
+    o.overrides = buildUnnamed1340();
     o.state = buildDeployState();
     o.templateName = "foo";
   }
@@ -226,23 +226,23 @@
   if (buildCounterDeployment < 3) {
     unittest.expect(o.creationDate, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1185(o.modules);
+    checkUnnamed1339(o.modules);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1186(o.overrides);
+    checkUnnamed1340(o.overrides);
     checkDeployState(o.state);
     unittest.expect(o.templateName, unittest.equals('foo'));
   }
   buildCounterDeployment--;
 }
 
-buildUnnamed1187() {
+buildUnnamed1341() {
   var o = new core.List<api.Deployment>();
   o.add(buildDeployment());
   o.add(buildDeployment());
   return o;
 }
 
-checkUnnamed1187(core.List<api.Deployment> o) {
+checkUnnamed1341(core.List<api.Deployment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDeployment(o[0]);
   checkDeployment(o[1]);
@@ -254,7 +254,7 @@
   buildCounterDeploymentsListResponse++;
   if (buildCounterDeploymentsListResponse < 3) {
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed1187();
+    o.resources = buildUnnamed1341();
   }
   buildCounterDeploymentsListResponse--;
   return o;
@@ -264,7 +264,7 @@
   buildCounterDeploymentsListResponse++;
   if (buildCounterDeploymentsListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1187(o.resources);
+    checkUnnamed1341(o.resources);
   }
   buildCounterDeploymentsListResponse--;
 }
@@ -332,53 +332,53 @@
   buildCounterExistingDisk--;
 }
 
-buildUnnamed1188() {
+buildUnnamed1342() {
   var o = new core.List<api.AllowedRule>();
   o.add(buildAllowedRule());
   o.add(buildAllowedRule());
   return o;
 }
 
-checkUnnamed1188(core.List<api.AllowedRule> o) {
+checkUnnamed1342(core.List<api.AllowedRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAllowedRule(o[0]);
   checkAllowedRule(o[1]);
 }
 
-buildUnnamed1189() {
+buildUnnamed1343() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1189(core.List<core.String> o) {
+checkUnnamed1343(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1190() {
+buildUnnamed1344() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1190(core.List<core.String> o) {
+checkUnnamed1344(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1191() {
+buildUnnamed1345() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1191(core.List<core.String> o) {
+checkUnnamed1345(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -389,12 +389,12 @@
   var o = new api.FirewallModule();
   buildCounterFirewallModule++;
   if (buildCounterFirewallModule < 3) {
-    o.allowed = buildUnnamed1188();
+    o.allowed = buildUnnamed1342();
     o.description = "foo";
     o.network = "foo";
-    o.sourceRanges = buildUnnamed1189();
-    o.sourceTags = buildUnnamed1190();
-    o.targetTags = buildUnnamed1191();
+    o.sourceRanges = buildUnnamed1343();
+    o.sourceTags = buildUnnamed1344();
+    o.targetTags = buildUnnamed1345();
   }
   buildCounterFirewallModule--;
   return o;
@@ -403,12 +403,12 @@
 checkFirewallModule(api.FirewallModule o) {
   buildCounterFirewallModule++;
   if (buildCounterFirewallModule < 3) {
-    checkUnnamed1188(o.allowed);
+    checkUnnamed1342(o.allowed);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
-    checkUnnamed1189(o.sourceRanges);
-    checkUnnamed1190(o.sourceTags);
-    checkUnnamed1191(o.targetTags);
+    checkUnnamed1343(o.sourceRanges);
+    checkUnnamed1344(o.sourceTags);
+    checkUnnamed1345(o.targetTags);
   }
   buildCounterFirewallModule--;
 }
@@ -484,27 +484,27 @@
   buildCounterHealthCheckModuleStatus--;
 }
 
-buildUnnamed1192() {
+buildUnnamed1346() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1192(core.List<core.String> o) {
+checkUnnamed1346(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1193() {
+buildUnnamed1347() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1193(core.List<core.String> o) {
+checkUnnamed1347(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -516,12 +516,12 @@
   buildCounterLbModule++;
   if (buildCounterLbModule < 3) {
     o.description = "foo";
-    o.healthChecks = buildUnnamed1192();
+    o.healthChecks = buildUnnamed1346();
     o.ipAddress = "foo";
     o.ipProtocol = "foo";
     o.portRange = "foo";
     o.sessionAffinity = "foo";
-    o.targetModules = buildUnnamed1193();
+    o.targetModules = buildUnnamed1347();
   }
   buildCounterLbModule--;
   return o;
@@ -531,12 +531,12 @@
   buildCounterLbModule++;
   if (buildCounterLbModule < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1192(o.healthChecks);
+    checkUnnamed1346(o.healthChecks);
     unittest.expect(o.ipAddress, unittest.equals('foo'));
     unittest.expect(o.ipProtocol, unittest.equals('foo'));
     unittest.expect(o.portRange, unittest.equals('foo'));
     unittest.expect(o.sessionAffinity, unittest.equals('foo'));
-    checkUnnamed1193(o.targetModules);
+    checkUnnamed1347(o.targetModules);
   }
   buildCounterLbModule--;
 }
@@ -562,14 +562,14 @@
   buildCounterLbModuleStatus--;
 }
 
-buildUnnamed1194() {
+buildUnnamed1348() {
   var o = new core.List<api.MetadataItem>();
   o.add(buildMetadataItem());
   o.add(buildMetadataItem());
   return o;
 }
 
-checkUnnamed1194(core.List<api.MetadataItem> o) {
+checkUnnamed1348(core.List<api.MetadataItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetadataItem(o[0]);
   checkMetadataItem(o[1]);
@@ -581,7 +581,7 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     o.fingerPrint = "foo";
-    o.items = buildUnnamed1194();
+    o.items = buildUnnamed1348();
   }
   buildCounterMetadata--;
   return o;
@@ -591,7 +591,7 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     unittest.expect(o.fingerPrint, unittest.equals('foo'));
-    checkUnnamed1194(o.items);
+    checkUnnamed1348(o.items);
   }
   buildCounterMetadata--;
 }
@@ -681,14 +681,14 @@
   buildCounterModuleStatus--;
 }
 
-buildUnnamed1195() {
+buildUnnamed1349() {
   var o = new core.List<api.AccessConfig>();
   o.add(buildAccessConfig());
   o.add(buildAccessConfig());
   return o;
 }
 
-checkUnnamed1195(core.List<api.AccessConfig> o) {
+checkUnnamed1349(core.List<api.AccessConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccessConfig(o[0]);
   checkAccessConfig(o[1]);
@@ -699,7 +699,7 @@
   var o = new api.NetworkInterface();
   buildCounterNetworkInterface++;
   if (buildCounterNetworkInterface < 3) {
-    o.accessConfigs = buildUnnamed1195();
+    o.accessConfigs = buildUnnamed1349();
     o.name = "foo";
     o.network = "foo";
     o.networkIp = "foo";
@@ -711,7 +711,7 @@
 checkNetworkInterface(api.NetworkInterface o) {
   buildCounterNetworkInterface++;
   if (buildCounterNetworkInterface < 3) {
-    checkUnnamed1195(o.accessConfigs);
+    checkUnnamed1349(o.accessConfigs);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.networkIp, unittest.equals('foo'));
@@ -830,27 +830,27 @@
   buildCounterParamOverride--;
 }
 
-buildUnnamed1196() {
+buildUnnamed1350() {
   var o = new core.Map<core.String, api.EnvVariable>();
   o["x"] = buildEnvVariable();
   o["y"] = buildEnvVariable();
   return o;
 }
 
-checkUnnamed1196(core.Map<core.String, api.EnvVariable> o) {
+checkUnnamed1350(core.Map<core.String, api.EnvVariable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEnvVariable(o["x"]);
   checkEnvVariable(o["y"]);
 }
 
-buildUnnamed1197() {
+buildUnnamed1351() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1197(core.List<core.String> o) {
+checkUnnamed1351(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -861,8 +861,8 @@
   var o = new api.ReplicaPoolModule();
   buildCounterReplicaPoolModule++;
   if (buildCounterReplicaPoolModule < 3) {
-    o.envVariables = buildUnnamed1196();
-    o.healthChecks = buildUnnamed1197();
+    o.envVariables = buildUnnamed1350();
+    o.healthChecks = buildUnnamed1351();
     o.numReplicas = 42;
     o.replicaPoolParams = buildReplicaPoolParams();
     o.resourceView = "foo";
@@ -874,8 +874,8 @@
 checkReplicaPoolModule(api.ReplicaPoolModule o) {
   buildCounterReplicaPoolModule++;
   if (buildCounterReplicaPoolModule < 3) {
-    checkUnnamed1196(o.envVariables);
-    checkUnnamed1197(o.healthChecks);
+    checkUnnamed1350(o.envVariables);
+    checkUnnamed1351(o.healthChecks);
     unittest.expect(o.numReplicas, unittest.equals(42));
     checkReplicaPoolParams(o.replicaPoolParams);
     unittest.expect(o.resourceView, unittest.equals('foo'));
@@ -923,53 +923,53 @@
   buildCounterReplicaPoolParams--;
 }
 
-buildUnnamed1198() {
+buildUnnamed1352() {
   var o = new core.List<api.ExistingDisk>();
   o.add(buildExistingDisk());
   o.add(buildExistingDisk());
   return o;
 }
 
-checkUnnamed1198(core.List<api.ExistingDisk> o) {
+checkUnnamed1352(core.List<api.ExistingDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExistingDisk(o[0]);
   checkExistingDisk(o[1]);
 }
 
-buildUnnamed1199() {
+buildUnnamed1353() {
   var o = new core.List<api.NewDisk>();
   o.add(buildNewDisk());
   o.add(buildNewDisk());
   return o;
 }
 
-checkUnnamed1199(core.List<api.NewDisk> o) {
+checkUnnamed1353(core.List<api.NewDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNewDisk(o[0]);
   checkNewDisk(o[1]);
 }
 
-buildUnnamed1200() {
+buildUnnamed1354() {
   var o = new core.List<api.NetworkInterface>();
   o.add(buildNetworkInterface());
   o.add(buildNetworkInterface());
   return o;
 }
 
-checkUnnamed1200(core.List<api.NetworkInterface> o) {
+checkUnnamed1354(core.List<api.NetworkInterface> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetworkInterface(o[0]);
   checkNetworkInterface(o[1]);
 }
 
-buildUnnamed1201() {
+buildUnnamed1355() {
   var o = new core.List<api.ServiceAccount>();
   o.add(buildServiceAccount());
   o.add(buildServiceAccount());
   return o;
 }
 
-checkUnnamed1201(core.List<api.ServiceAccount> o) {
+checkUnnamed1355(core.List<api.ServiceAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceAccount(o[0]);
   checkServiceAccount(o[1]);
@@ -984,14 +984,14 @@
     o.baseInstanceName = "foo";
     o.canIpForward = true;
     o.description = "foo";
-    o.disksToAttach = buildUnnamed1198();
-    o.disksToCreate = buildUnnamed1199();
+    o.disksToAttach = buildUnnamed1352();
+    o.disksToCreate = buildUnnamed1353();
     o.initAction = "foo";
     o.machineType = "foo";
     o.metadata = buildMetadata();
-    o.networkInterfaces = buildUnnamed1200();
+    o.networkInterfaces = buildUnnamed1354();
     o.onHostMaintenance = "foo";
-    o.serviceAccounts = buildUnnamed1201();
+    o.serviceAccounts = buildUnnamed1355();
     o.tags = buildTag();
     o.zone = "foo";
   }
@@ -1006,28 +1006,28 @@
     unittest.expect(o.baseInstanceName, unittest.equals('foo'));
     unittest.expect(o.canIpForward, unittest.isTrue);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1198(o.disksToAttach);
-    checkUnnamed1199(o.disksToCreate);
+    checkUnnamed1352(o.disksToAttach);
+    checkUnnamed1353(o.disksToCreate);
     unittest.expect(o.initAction, unittest.equals('foo'));
     unittest.expect(o.machineType, unittest.equals('foo'));
     checkMetadata(o.metadata);
-    checkUnnamed1200(o.networkInterfaces);
+    checkUnnamed1354(o.networkInterfaces);
     unittest.expect(o.onHostMaintenance, unittest.equals('foo'));
-    checkUnnamed1201(o.serviceAccounts);
+    checkUnnamed1355(o.serviceAccounts);
     checkTag(o.tags);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterReplicaPoolParamsV1Beta1--;
 }
 
-buildUnnamed1202() {
+buildUnnamed1356() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1202(core.List<core.String> o) {
+checkUnnamed1356(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1039,7 +1039,7 @@
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
     o.email = "foo";
-    o.scopes = buildUnnamed1202();
+    o.scopes = buildUnnamed1356();
   }
   buildCounterServiceAccount--;
   return o;
@@ -1049,19 +1049,19 @@
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
     unittest.expect(o.email, unittest.equals('foo'));
-    checkUnnamed1202(o.scopes);
+    checkUnnamed1356(o.scopes);
   }
   buildCounterServiceAccount--;
 }
 
-buildUnnamed1203() {
+buildUnnamed1357() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1203(core.List<core.String> o) {
+checkUnnamed1357(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1073,7 +1073,7 @@
   buildCounterTag++;
   if (buildCounterTag < 3) {
     o.fingerPrint = "foo";
-    o.items = buildUnnamed1203();
+    o.items = buildUnnamed1357();
   }
   buildCounterTag--;
   return o;
@@ -1083,32 +1083,32 @@
   buildCounterTag++;
   if (buildCounterTag < 3) {
     unittest.expect(o.fingerPrint, unittest.equals('foo'));
-    checkUnnamed1203(o.items);
+    checkUnnamed1357(o.items);
   }
   buildCounterTag--;
 }
 
-buildUnnamed1204() {
+buildUnnamed1358() {
   var o = new core.Map<core.String, api.Action>();
   o["x"] = buildAction();
   o["y"] = buildAction();
   return o;
 }
 
-checkUnnamed1204(core.Map<core.String, api.Action> o) {
+checkUnnamed1358(core.Map<core.String, api.Action> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAction(o["x"]);
   checkAction(o["y"]);
 }
 
-buildUnnamed1205() {
+buildUnnamed1359() {
   var o = new core.Map<core.String, api.Module>();
   o["x"] = buildModule();
   o["y"] = buildModule();
   return o;
 }
 
-checkUnnamed1205(core.Map<core.String, api.Module> o) {
+checkUnnamed1359(core.Map<core.String, api.Module> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkModule(o["x"]);
   checkModule(o["y"]);
@@ -1119,9 +1119,9 @@
   var o = new api.Template();
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
-    o.actions = buildUnnamed1204();
+    o.actions = buildUnnamed1358();
     o.description = "foo";
-    o.modules = buildUnnamed1205();
+    o.modules = buildUnnamed1359();
     o.name = "foo";
   }
   buildCounterTemplate--;
@@ -1131,22 +1131,22 @@
 checkTemplate(api.Template o) {
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
-    checkUnnamed1204(o.actions);
+    checkUnnamed1358(o.actions);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1205(o.modules);
+    checkUnnamed1359(o.modules);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterTemplate--;
 }
 
-buildUnnamed1206() {
+buildUnnamed1360() {
   var o = new core.List<api.Template>();
   o.add(buildTemplate());
   o.add(buildTemplate());
   return o;
 }
 
-checkUnnamed1206(core.List<api.Template> o) {
+checkUnnamed1360(core.List<api.Template> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTemplate(o[0]);
   checkTemplate(o[1]);
@@ -1158,7 +1158,7 @@
   buildCounterTemplatesListResponse++;
   if (buildCounterTemplatesListResponse < 3) {
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed1206();
+    o.resources = buildUnnamed1360();
   }
   buildCounterTemplatesListResponse--;
   return o;
@@ -1168,7 +1168,7 @@
   buildCounterTemplatesListResponse++;
   if (buildCounterTemplatesListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1206(o.resources);
+    checkUnnamed1360(o.resources);
   }
   buildCounterTemplatesListResponse--;
 }
diff --git a/generated/googleapis_beta/test/pubsub/v1beta1_test.dart b/generated/googleapis_beta/test/pubsub/v1beta1_test.dart
index 35cea17..86689a1 100644
--- a/generated/googleapis_beta/test/pubsub/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/pubsub/v1beta1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed1266() {
+buildUnnamed1361() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1266(core.List<core.String> o) {
+checkUnnamed1361(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -34,7 +34,7 @@
   var o = new api.AcknowledgeRequest();
   buildCounterAcknowledgeRequest++;
   if (buildCounterAcknowledgeRequest < 3) {
-    o.ackId = buildUnnamed1266();
+    o.ackId = buildUnnamed1361();
     o.subscription = "foo";
   }
   buildCounterAcknowledgeRequest--;
@@ -44,7 +44,7 @@
 checkAcknowledgeRequest(api.AcknowledgeRequest o) {
   buildCounterAcknowledgeRequest++;
   if (buildCounterAcknowledgeRequest < 3) {
-    checkUnnamed1266(o.ackId);
+    checkUnnamed1361(o.ackId);
     unittest.expect(o.subscription, unittest.equals('foo'));
   }
   buildCounterAcknowledgeRequest--;
@@ -73,14 +73,14 @@
   buildCounterLabel--;
 }
 
-buildUnnamed1267() {
+buildUnnamed1362() {
   var o = new core.List<api.Subscription>();
   o.add(buildSubscription());
   o.add(buildSubscription());
   return o;
 }
 
-checkUnnamed1267(core.List<api.Subscription> o) {
+checkUnnamed1362(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubscription(o[0]);
   checkSubscription(o[1]);
@@ -92,7 +92,7 @@
   buildCounterListSubscriptionsResponse++;
   if (buildCounterListSubscriptionsResponse < 3) {
     o.nextPageToken = "foo";
-    o.subscription = buildUnnamed1267();
+    o.subscription = buildUnnamed1362();
   }
   buildCounterListSubscriptionsResponse--;
   return o;
@@ -102,19 +102,19 @@
   buildCounterListSubscriptionsResponse++;
   if (buildCounterListSubscriptionsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1267(o.subscription);
+    checkUnnamed1362(o.subscription);
   }
   buildCounterListSubscriptionsResponse--;
 }
 
-buildUnnamed1268() {
+buildUnnamed1363() {
   var o = new core.List<api.Topic>();
   o.add(buildTopic());
   o.add(buildTopic());
   return o;
 }
 
-checkUnnamed1268(core.List<api.Topic> o) {
+checkUnnamed1363(core.List<api.Topic> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTopic(o[0]);
   checkTopic(o[1]);
@@ -126,7 +126,7 @@
   buildCounterListTopicsResponse++;
   if (buildCounterListTopicsResponse < 3) {
     o.nextPageToken = "foo";
-    o.topic = buildUnnamed1268();
+    o.topic = buildUnnamed1363();
   }
   buildCounterListTopicsResponse--;
   return o;
@@ -136,7 +136,7 @@
   buildCounterListTopicsResponse++;
   if (buildCounterListTopicsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1268(o.topic);
+    checkUnnamed1363(o.topic);
   }
   buildCounterListTopicsResponse--;
 }
@@ -231,14 +231,14 @@
   buildCounterPubsubEvent--;
 }
 
-buildUnnamed1269() {
+buildUnnamed1364() {
   var o = new core.List<api.Label>();
   o.add(buildLabel());
   o.add(buildLabel());
   return o;
 }
 
-checkUnnamed1269(core.List<api.Label> o) {
+checkUnnamed1364(core.List<api.Label> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabel(o[0]);
   checkLabel(o[1]);
@@ -250,7 +250,7 @@
   buildCounterPubsubMessage++;
   if (buildCounterPubsubMessage < 3) {
     o.data = "foo";
-    o.label = buildUnnamed1269();
+    o.label = buildUnnamed1364();
   }
   buildCounterPubsubMessage--;
   return o;
@@ -260,7 +260,7 @@
   buildCounterPubsubMessage++;
   if (buildCounterPubsubMessage < 3) {
     unittest.expect(o.data, unittest.equals('foo'));
-    checkUnnamed1269(o.label);
+    checkUnnamed1364(o.label);
   }
   buildCounterPubsubMessage--;
 }
diff --git a/generated/googleapis_beta/test/replicapool/v1beta1_test.dart b/generated/googleapis_beta/test/replicapool/v1beta1_test.dart
deleted file mode 100644
index 87c501b..0000000
--- a/generated/googleapis_beta/test/replicapool/v1beta1_test.dart
+++ /dev/null
@@ -1,1497 +0,0 @@
-library googleapis_beta.replicapool.v1beta1.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:unittest/unittest.dart' as unittest;
-import 'package:googleapis_beta/common/common.dart' as common;
-import 'package:googleapis_beta/src/common_internal.dart' as common_internal;
-import '../common/common_internal_test.dart' as common_test;
-
-import 'package:googleapis_beta/replicapool/v1beta1.dart' as api;
-
-
-
-core.int buildCounterAccessConfig = 0;
-buildAccessConfig() {
-  var o = new api.AccessConfig();
-  buildCounterAccessConfig++;
-  if (buildCounterAccessConfig < 3) {
-    o.name = "foo";
-    o.natIp = "foo";
-    o.type = "foo";
-  }
-  buildCounterAccessConfig--;
-  return o;
-}
-
-checkAccessConfig(api.AccessConfig o) {
-  buildCounterAccessConfig++;
-  if (buildCounterAccessConfig < 3) {
-    unittest.expect(o.name, unittest.equals('foo'));
-    unittest.expect(o.natIp, unittest.equals('foo'));
-    unittest.expect(o.type, unittest.equals('foo'));
-  }
-  buildCounterAccessConfig--;
-}
-
-buildUnnamed1150() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1150(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed1151() {
-  var o = new core.List<api.EnvVariable>();
-  o.add(buildEnvVariable());
-  o.add(buildEnvVariable());
-  return o;
-}
-
-checkUnnamed1151(core.List<api.EnvVariable> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkEnvVariable(o[0]);
-  checkEnvVariable(o[1]);
-}
-
-core.int buildCounterAction = 0;
-buildAction() {
-  var o = new api.Action();
-  buildCounterAction++;
-  if (buildCounterAction < 3) {
-    o.commands = buildUnnamed1150();
-    o.envVariables = buildUnnamed1151();
-    o.timeoutMilliSeconds = 42;
-  }
-  buildCounterAction--;
-  return o;
-}
-
-checkAction(api.Action o) {
-  buildCounterAction++;
-  if (buildCounterAction < 3) {
-    checkUnnamed1150(o.commands);
-    checkUnnamed1151(o.envVariables);
-    unittest.expect(o.timeoutMilliSeconds, unittest.equals(42));
-  }
-  buildCounterAction--;
-}
-
-core.int buildCounterDiskAttachment = 0;
-buildDiskAttachment() {
-  var o = new api.DiskAttachment();
-  buildCounterDiskAttachment++;
-  if (buildCounterDiskAttachment < 3) {
-    o.deviceName = "foo";
-    o.index = 42;
-  }
-  buildCounterDiskAttachment--;
-  return o;
-}
-
-checkDiskAttachment(api.DiskAttachment o) {
-  buildCounterDiskAttachment++;
-  if (buildCounterDiskAttachment < 3) {
-    unittest.expect(o.deviceName, unittest.equals('foo'));
-    unittest.expect(o.index, unittest.equals(42));
-  }
-  buildCounterDiskAttachment--;
-}
-
-core.int buildCounterEnvVariable = 0;
-buildEnvVariable() {
-  var o = new api.EnvVariable();
-  buildCounterEnvVariable++;
-  if (buildCounterEnvVariable < 3) {
-    o.hidden = true;
-    o.name = "foo";
-    o.value = "foo";
-  }
-  buildCounterEnvVariable--;
-  return o;
-}
-
-checkEnvVariable(api.EnvVariable o) {
-  buildCounterEnvVariable++;
-  if (buildCounterEnvVariable < 3) {
-    unittest.expect(o.hidden, unittest.isTrue);
-    unittest.expect(o.name, unittest.equals('foo'));
-    unittest.expect(o.value, unittest.equals('foo'));
-  }
-  buildCounterEnvVariable--;
-}
-
-core.int buildCounterExistingDisk = 0;
-buildExistingDisk() {
-  var o = new api.ExistingDisk();
-  buildCounterExistingDisk++;
-  if (buildCounterExistingDisk < 3) {
-    o.attachment = buildDiskAttachment();
-    o.source = "foo";
-  }
-  buildCounterExistingDisk--;
-  return o;
-}
-
-checkExistingDisk(api.ExistingDisk o) {
-  buildCounterExistingDisk++;
-  if (buildCounterExistingDisk < 3) {
-    checkDiskAttachment(o.attachment);
-    unittest.expect(o.source, unittest.equals('foo'));
-  }
-  buildCounterExistingDisk--;
-}
-
-core.int buildCounterHealthCheck = 0;
-buildHealthCheck() {
-  var o = new api.HealthCheck();
-  buildCounterHealthCheck++;
-  if (buildCounterHealthCheck < 3) {
-    o.checkIntervalSec = 42;
-    o.description = "foo";
-    o.healthyThreshold = 42;
-    o.host = "foo";
-    o.name = "foo";
-    o.path = "foo";
-    o.port = 42;
-    o.timeoutSec = 42;
-    o.unhealthyThreshold = 42;
-  }
-  buildCounterHealthCheck--;
-  return o;
-}
-
-checkHealthCheck(api.HealthCheck o) {
-  buildCounterHealthCheck++;
-  if (buildCounterHealthCheck < 3) {
-    unittest.expect(o.checkIntervalSec, unittest.equals(42));
-    unittest.expect(o.description, unittest.equals('foo'));
-    unittest.expect(o.healthyThreshold, unittest.equals(42));
-    unittest.expect(o.host, unittest.equals('foo'));
-    unittest.expect(o.name, unittest.equals('foo'));
-    unittest.expect(o.path, unittest.equals('foo'));
-    unittest.expect(o.port, unittest.equals(42));
-    unittest.expect(o.timeoutSec, unittest.equals(42));
-    unittest.expect(o.unhealthyThreshold, unittest.equals(42));
-  }
-  buildCounterHealthCheck--;
-}
-
-core.int buildCounterLabel = 0;
-buildLabel() {
-  var o = new api.Label();
-  buildCounterLabel++;
-  if (buildCounterLabel < 3) {
-    o.key = "foo";
-    o.value = "foo";
-  }
-  buildCounterLabel--;
-  return o;
-}
-
-checkLabel(api.Label o) {
-  buildCounterLabel++;
-  if (buildCounterLabel < 3) {
-    unittest.expect(o.key, unittest.equals('foo'));
-    unittest.expect(o.value, unittest.equals('foo'));
-  }
-  buildCounterLabel--;
-}
-
-buildUnnamed1152() {
-  var o = new core.List<api.MetadataItem>();
-  o.add(buildMetadataItem());
-  o.add(buildMetadataItem());
-  return o;
-}
-
-checkUnnamed1152(core.List<api.MetadataItem> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkMetadataItem(o[0]);
-  checkMetadataItem(o[1]);
-}
-
-core.int buildCounterMetadata = 0;
-buildMetadata() {
-  var o = new api.Metadata();
-  buildCounterMetadata++;
-  if (buildCounterMetadata < 3) {
-    o.fingerPrint = "foo";
-    o.items = buildUnnamed1152();
-  }
-  buildCounterMetadata--;
-  return o;
-}
-
-checkMetadata(api.Metadata o) {
-  buildCounterMetadata++;
-  if (buildCounterMetadata < 3) {
-    unittest.expect(o.fingerPrint, unittest.equals('foo'));
-    checkUnnamed1152(o.items);
-  }
-  buildCounterMetadata--;
-}
-
-core.int buildCounterMetadataItem = 0;
-buildMetadataItem() {
-  var o = new api.MetadataItem();
-  buildCounterMetadataItem++;
-  if (buildCounterMetadataItem < 3) {
-    o.key = "foo";
-    o.value = "foo";
-  }
-  buildCounterMetadataItem--;
-  return o;
-}
-
-checkMetadataItem(api.MetadataItem o) {
-  buildCounterMetadataItem++;
-  if (buildCounterMetadataItem < 3) {
-    unittest.expect(o.key, unittest.equals('foo'));
-    unittest.expect(o.value, unittest.equals('foo'));
-  }
-  buildCounterMetadataItem--;
-}
-
-buildUnnamed1153() {
-  var o = new core.List<api.AccessConfig>();
-  o.add(buildAccessConfig());
-  o.add(buildAccessConfig());
-  return o;
-}
-
-checkUnnamed1153(core.List<api.AccessConfig> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkAccessConfig(o[0]);
-  checkAccessConfig(o[1]);
-}
-
-core.int buildCounterNetworkInterface = 0;
-buildNetworkInterface() {
-  var o = new api.NetworkInterface();
-  buildCounterNetworkInterface++;
-  if (buildCounterNetworkInterface < 3) {
-    o.accessConfigs = buildUnnamed1153();
-    o.network = "foo";
-    o.networkIp = "foo";
-  }
-  buildCounterNetworkInterface--;
-  return o;
-}
-
-checkNetworkInterface(api.NetworkInterface o) {
-  buildCounterNetworkInterface++;
-  if (buildCounterNetworkInterface < 3) {
-    checkUnnamed1153(o.accessConfigs);
-    unittest.expect(o.network, unittest.equals('foo'));
-    unittest.expect(o.networkIp, unittest.equals('foo'));
-  }
-  buildCounterNetworkInterface--;
-}
-
-core.int buildCounterNewDisk = 0;
-buildNewDisk() {
-  var o = new api.NewDisk();
-  buildCounterNewDisk++;
-  if (buildCounterNewDisk < 3) {
-    o.attachment = buildDiskAttachment();
-    o.autoDelete = true;
-    o.boot = true;
-    o.initializeParams = buildNewDiskInitializeParams();
-  }
-  buildCounterNewDisk--;
-  return o;
-}
-
-checkNewDisk(api.NewDisk o) {
-  buildCounterNewDisk++;
-  if (buildCounterNewDisk < 3) {
-    checkDiskAttachment(o.attachment);
-    unittest.expect(o.autoDelete, unittest.isTrue);
-    unittest.expect(o.boot, unittest.isTrue);
-    checkNewDiskInitializeParams(o.initializeParams);
-  }
-  buildCounterNewDisk--;
-}
-
-core.int buildCounterNewDiskInitializeParams = 0;
-buildNewDiskInitializeParams() {
-  var o = new api.NewDiskInitializeParams();
-  buildCounterNewDiskInitializeParams++;
-  if (buildCounterNewDiskInitializeParams < 3) {
-    o.diskSizeGb = "foo";
-    o.diskType = "foo";
-    o.sourceImage = "foo";
-  }
-  buildCounterNewDiskInitializeParams--;
-  return o;
-}
-
-checkNewDiskInitializeParams(api.NewDiskInitializeParams o) {
-  buildCounterNewDiskInitializeParams++;
-  if (buildCounterNewDiskInitializeParams < 3) {
-    unittest.expect(o.diskSizeGb, unittest.equals('foo'));
-    unittest.expect(o.diskType, unittest.equals('foo'));
-    unittest.expect(o.sourceImage, unittest.equals('foo'));
-  }
-  buildCounterNewDiskInitializeParams--;
-}
-
-buildUnnamed1154() {
-  var o = new core.List<api.HealthCheck>();
-  o.add(buildHealthCheck());
-  o.add(buildHealthCheck());
-  return o;
-}
-
-checkUnnamed1154(core.List<api.HealthCheck> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkHealthCheck(o[0]);
-  checkHealthCheck(o[1]);
-}
-
-buildUnnamed1155() {
-  var o = new core.List<api.Label>();
-  o.add(buildLabel());
-  o.add(buildLabel());
-  return o;
-}
-
-checkUnnamed1155(core.List<api.Label> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkLabel(o[0]);
-  checkLabel(o[1]);
-}
-
-buildUnnamed1156() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1156(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed1157() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1157(core.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 buildCounterPool = 0;
-buildPool() {
-  var o = new api.Pool();
-  buildCounterPool++;
-  if (buildCounterPool < 3) {
-    o.autoRestart = true;
-    o.baseInstanceName = "foo";
-    o.currentNumReplicas = 42;
-    o.description = "foo";
-    o.healthChecks = buildUnnamed1154();
-    o.initialNumReplicas = 42;
-    o.labels = buildUnnamed1155();
-    o.name = "foo";
-    o.numReplicas = 42;
-    o.resourceViews = buildUnnamed1156();
-    o.selfLink = "foo";
-    o.targetPool = "foo";
-    o.targetPools = buildUnnamed1157();
-    o.template = buildTemplate();
-    o.type = "foo";
-  }
-  buildCounterPool--;
-  return o;
-}
-
-checkPool(api.Pool o) {
-  buildCounterPool++;
-  if (buildCounterPool < 3) {
-    unittest.expect(o.autoRestart, unittest.isTrue);
-    unittest.expect(o.baseInstanceName, unittest.equals('foo'));
-    unittest.expect(o.currentNumReplicas, unittest.equals(42));
-    unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1154(o.healthChecks);
-    unittest.expect(o.initialNumReplicas, unittest.equals(42));
-    checkUnnamed1155(o.labels);
-    unittest.expect(o.name, unittest.equals('foo'));
-    unittest.expect(o.numReplicas, unittest.equals(42));
-    checkUnnamed1156(o.resourceViews);
-    unittest.expect(o.selfLink, unittest.equals('foo'));
-    unittest.expect(o.targetPool, unittest.equals('foo'));
-    checkUnnamed1157(o.targetPools);
-    checkTemplate(o.template);
-    unittest.expect(o.type, unittest.equals('foo'));
-  }
-  buildCounterPool--;
-}
-
-buildUnnamed1158() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1158(core.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 buildCounterPoolsDeleteRequest = 0;
-buildPoolsDeleteRequest() {
-  var o = new api.PoolsDeleteRequest();
-  buildCounterPoolsDeleteRequest++;
-  if (buildCounterPoolsDeleteRequest < 3) {
-    o.abandonInstances = buildUnnamed1158();
-  }
-  buildCounterPoolsDeleteRequest--;
-  return o;
-}
-
-checkPoolsDeleteRequest(api.PoolsDeleteRequest o) {
-  buildCounterPoolsDeleteRequest++;
-  if (buildCounterPoolsDeleteRequest < 3) {
-    checkUnnamed1158(o.abandonInstances);
-  }
-  buildCounterPoolsDeleteRequest--;
-}
-
-buildUnnamed1159() {
-  var o = new core.List<api.Pool>();
-  o.add(buildPool());
-  o.add(buildPool());
-  return o;
-}
-
-checkUnnamed1159(core.List<api.Pool> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkPool(o[0]);
-  checkPool(o[1]);
-}
-
-core.int buildCounterPoolsListResponse = 0;
-buildPoolsListResponse() {
-  var o = new api.PoolsListResponse();
-  buildCounterPoolsListResponse++;
-  if (buildCounterPoolsListResponse < 3) {
-    o.nextPageToken = "foo";
-    o.resources = buildUnnamed1159();
-  }
-  buildCounterPoolsListResponse--;
-  return o;
-}
-
-checkPoolsListResponse(api.PoolsListResponse o) {
-  buildCounterPoolsListResponse++;
-  if (buildCounterPoolsListResponse < 3) {
-    unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1159(o.resources);
-  }
-  buildCounterPoolsListResponse--;
-}
-
-core.int buildCounterReplica = 0;
-buildReplica() {
-  var o = new api.Replica();
-  buildCounterReplica++;
-  if (buildCounterReplica < 3) {
-    o.name = "foo";
-    o.selfLink = "foo";
-    o.status = buildReplicaStatus();
-  }
-  buildCounterReplica--;
-  return o;
-}
-
-checkReplica(api.Replica o) {
-  buildCounterReplica++;
-  if (buildCounterReplica < 3) {
-    unittest.expect(o.name, unittest.equals('foo'));
-    unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkReplicaStatus(o.status);
-  }
-  buildCounterReplica--;
-}
-
-core.int buildCounterReplicaStatus = 0;
-buildReplicaStatus() {
-  var o = new api.ReplicaStatus();
-  buildCounterReplicaStatus++;
-  if (buildCounterReplicaStatus < 3) {
-    o.details = "foo";
-    o.state = "foo";
-    o.templateVersion = "foo";
-    o.vmLink = "foo";
-    o.vmStartTime = "foo";
-  }
-  buildCounterReplicaStatus--;
-  return o;
-}
-
-checkReplicaStatus(api.ReplicaStatus o) {
-  buildCounterReplicaStatus++;
-  if (buildCounterReplicaStatus < 3) {
-    unittest.expect(o.details, unittest.equals('foo'));
-    unittest.expect(o.state, unittest.equals('foo'));
-    unittest.expect(o.templateVersion, unittest.equals('foo'));
-    unittest.expect(o.vmLink, unittest.equals('foo'));
-    unittest.expect(o.vmStartTime, unittest.equals('foo'));
-  }
-  buildCounterReplicaStatus--;
-}
-
-core.int buildCounterReplicasDeleteRequest = 0;
-buildReplicasDeleteRequest() {
-  var o = new api.ReplicasDeleteRequest();
-  buildCounterReplicasDeleteRequest++;
-  if (buildCounterReplicasDeleteRequest < 3) {
-    o.abandonInstance = true;
-  }
-  buildCounterReplicasDeleteRequest--;
-  return o;
-}
-
-checkReplicasDeleteRequest(api.ReplicasDeleteRequest o) {
-  buildCounterReplicasDeleteRequest++;
-  if (buildCounterReplicasDeleteRequest < 3) {
-    unittest.expect(o.abandonInstance, unittest.isTrue);
-  }
-  buildCounterReplicasDeleteRequest--;
-}
-
-buildUnnamed1160() {
-  var o = new core.List<api.Replica>();
-  o.add(buildReplica());
-  o.add(buildReplica());
-  return o;
-}
-
-checkUnnamed1160(core.List<api.Replica> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkReplica(o[0]);
-  checkReplica(o[1]);
-}
-
-core.int buildCounterReplicasListResponse = 0;
-buildReplicasListResponse() {
-  var o = new api.ReplicasListResponse();
-  buildCounterReplicasListResponse++;
-  if (buildCounterReplicasListResponse < 3) {
-    o.nextPageToken = "foo";
-    o.resources = buildUnnamed1160();
-  }
-  buildCounterReplicasListResponse--;
-  return o;
-}
-
-checkReplicasListResponse(api.ReplicasListResponse o) {
-  buildCounterReplicasListResponse++;
-  if (buildCounterReplicasListResponse < 3) {
-    unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1160(o.resources);
-  }
-  buildCounterReplicasListResponse--;
-}
-
-buildUnnamed1161() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed1161(core.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 buildCounterServiceAccount = 0;
-buildServiceAccount() {
-  var o = new api.ServiceAccount();
-  buildCounterServiceAccount++;
-  if (buildCounterServiceAccount < 3) {
-    o.email = "foo";
-    o.scopes = buildUnnamed1161();
-  }
-  buildCounterServiceAccount--;
-  return o;
-}
-
-checkServiceAccount(api.ServiceAccount o) {
-  buildCounterServiceAccount++;
-  if (buildCounterServiceAccount < 3) {
-    unittest.expect(o.email, unittest.equals('foo'));
-    checkUnnamed1161(o.scopes);
-  }
-  buildCounterServiceAccount--;
-}
-
-buildUnnamed1162() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return 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'));
-}
-
-core.int buildCounterTag = 0;
-buildTag() {
-  var o = new api.Tag();
-  buildCounterTag++;
-  if (buildCounterTag < 3) {
-    o.fingerPrint = "foo";
-    o.items = buildUnnamed1162();
-  }
-  buildCounterTag--;
-  return o;
-}
-
-checkTag(api.Tag o) {
-  buildCounterTag++;
-  if (buildCounterTag < 3) {
-    unittest.expect(o.fingerPrint, unittest.equals('foo'));
-    checkUnnamed1162(o.items);
-  }
-  buildCounterTag--;
-}
-
-buildUnnamed1163() {
-  var o = new core.List<api.HealthCheck>();
-  o.add(buildHealthCheck());
-  o.add(buildHealthCheck());
-  return o;
-}
-
-checkUnnamed1163(core.List<api.HealthCheck> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkHealthCheck(o[0]);
-  checkHealthCheck(o[1]);
-}
-
-core.int buildCounterTemplate = 0;
-buildTemplate() {
-  var o = new api.Template();
-  buildCounterTemplate++;
-  if (buildCounterTemplate < 3) {
-    o.action = buildAction();
-    o.healthChecks = buildUnnamed1163();
-    o.version = "foo";
-    o.vmParams = buildVmParams();
-  }
-  buildCounterTemplate--;
-  return o;
-}
-
-checkTemplate(api.Template o) {
-  buildCounterTemplate++;
-  if (buildCounterTemplate < 3) {
-    checkAction(o.action);
-    checkUnnamed1163(o.healthChecks);
-    unittest.expect(o.version, unittest.equals('foo'));
-    checkVmParams(o.vmParams);
-  }
-  buildCounterTemplate--;
-}
-
-buildUnnamed1164() {
-  var o = new core.List<api.ExistingDisk>();
-  o.add(buildExistingDisk());
-  o.add(buildExistingDisk());
-  return o;
-}
-
-checkUnnamed1164(core.List<api.ExistingDisk> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkExistingDisk(o[0]);
-  checkExistingDisk(o[1]);
-}
-
-buildUnnamed1165() {
-  var o = new core.List<api.NewDisk>();
-  o.add(buildNewDisk());
-  o.add(buildNewDisk());
-  return o;
-}
-
-checkUnnamed1165(core.List<api.NewDisk> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkNewDisk(o[0]);
-  checkNewDisk(o[1]);
-}
-
-buildUnnamed1166() {
-  var o = new core.List<api.NetworkInterface>();
-  o.add(buildNetworkInterface());
-  o.add(buildNetworkInterface());
-  return o;
-}
-
-checkUnnamed1166(core.List<api.NetworkInterface> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkNetworkInterface(o[0]);
-  checkNetworkInterface(o[1]);
-}
-
-buildUnnamed1167() {
-  var o = new core.List<api.ServiceAccount>();
-  o.add(buildServiceAccount());
-  o.add(buildServiceAccount());
-  return o;
-}
-
-checkUnnamed1167(core.List<api.ServiceAccount> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkServiceAccount(o[0]);
-  checkServiceAccount(o[1]);
-}
-
-core.int buildCounterVmParams = 0;
-buildVmParams() {
-  var o = new api.VmParams();
-  buildCounterVmParams++;
-  if (buildCounterVmParams < 3) {
-    o.baseInstanceName = "foo";
-    o.canIpForward = true;
-    o.description = "foo";
-    o.disksToAttach = buildUnnamed1164();
-    o.disksToCreate = buildUnnamed1165();
-    o.machineType = "foo";
-    o.metadata = buildMetadata();
-    o.networkInterfaces = buildUnnamed1166();
-    o.onHostMaintenance = "foo";
-    o.serviceAccounts = buildUnnamed1167();
-    o.tags = buildTag();
-  }
-  buildCounterVmParams--;
-  return o;
-}
-
-checkVmParams(api.VmParams o) {
-  buildCounterVmParams++;
-  if (buildCounterVmParams < 3) {
-    unittest.expect(o.baseInstanceName, unittest.equals('foo'));
-    unittest.expect(o.canIpForward, unittest.isTrue);
-    unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1164(o.disksToAttach);
-    checkUnnamed1165(o.disksToCreate);
-    unittest.expect(o.machineType, unittest.equals('foo'));
-    checkMetadata(o.metadata);
-    checkUnnamed1166(o.networkInterfaces);
-    unittest.expect(o.onHostMaintenance, unittest.equals('foo'));
-    checkUnnamed1167(o.serviceAccounts);
-    checkTag(o.tags);
-  }
-  buildCounterVmParams--;
-}
-
-
-main() {
-  unittest.group("obj-schema-AccessConfig", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildAccessConfig();
-      var od = new api.AccessConfig.fromJson(o.toJson());
-      checkAccessConfig(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-Action", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildAction();
-      var od = new api.Action.fromJson(o.toJson());
-      checkAction(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-DiskAttachment", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildDiskAttachment();
-      var od = new api.DiskAttachment.fromJson(o.toJson());
-      checkDiskAttachment(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-EnvVariable", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildEnvVariable();
-      var od = new api.EnvVariable.fromJson(o.toJson());
-      checkEnvVariable(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-ExistingDisk", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildExistingDisk();
-      var od = new api.ExistingDisk.fromJson(o.toJson());
-      checkExistingDisk(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-HealthCheck", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildHealthCheck();
-      var od = new api.HealthCheck.fromJson(o.toJson());
-      checkHealthCheck(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-Label", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildLabel();
-      var od = new api.Label.fromJson(o.toJson());
-      checkLabel(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-Metadata", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildMetadata();
-      var od = new api.Metadata.fromJson(o.toJson());
-      checkMetadata(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-MetadataItem", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildMetadataItem();
-      var od = new api.MetadataItem.fromJson(o.toJson());
-      checkMetadataItem(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-NetworkInterface", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildNetworkInterface();
-      var od = new api.NetworkInterface.fromJson(o.toJson());
-      checkNetworkInterface(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-NewDisk", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildNewDisk();
-      var od = new api.NewDisk.fromJson(o.toJson());
-      checkNewDisk(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-NewDiskInitializeParams", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildNewDiskInitializeParams();
-      var od = new api.NewDiskInitializeParams.fromJson(o.toJson());
-      checkNewDiskInitializeParams(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-Pool", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildPool();
-      var od = new api.Pool.fromJson(o.toJson());
-      checkPool(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-PoolsDeleteRequest", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildPoolsDeleteRequest();
-      var od = new api.PoolsDeleteRequest.fromJson(o.toJson());
-      checkPoolsDeleteRequest(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-PoolsListResponse", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildPoolsListResponse();
-      var od = new api.PoolsListResponse.fromJson(o.toJson());
-      checkPoolsListResponse(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-Replica", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildReplica();
-      var od = new api.Replica.fromJson(o.toJson());
-      checkReplica(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-ReplicaStatus", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildReplicaStatus();
-      var od = new api.ReplicaStatus.fromJson(o.toJson());
-      checkReplicaStatus(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-ReplicasDeleteRequest", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildReplicasDeleteRequest();
-      var od = new api.ReplicasDeleteRequest.fromJson(o.toJson());
-      checkReplicasDeleteRequest(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-ReplicasListResponse", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildReplicasListResponse();
-      var od = new api.ReplicasListResponse.fromJson(o.toJson());
-      checkReplicasListResponse(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-ServiceAccount", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildServiceAccount();
-      var od = new api.ServiceAccount.fromJson(o.toJson());
-      checkServiceAccount(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-Tag", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildTag();
-      var od = new api.Tag.fromJson(o.toJson());
-      checkTag(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-Template", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildTemplate();
-      var od = new api.Template.fromJson(o.toJson());
-      checkTemplate(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-VmParams", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildVmParams();
-      var od = new api.VmParams.fromJson(o.toJson());
-      checkVmParams(od);
-    });
-  });
-
-
-  unittest.group("resource-PoolsResourceApi", () {
-    unittest.test("method--delete", () {
-
-      var mock = new common_test.HttpServerMock();
-      api.PoolsResourceApi res = new api.ReplicapoolApi(mock).pools;
-      var arg_request = buildPoolsDeleteRequest();
-      var arg_projectName = "foo";
-      var arg_zone = "foo";
-      var arg_poolName = "foo";
-      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
-        var obj = new api.PoolsDeleteRequest.fromJson(json);
-        checkPoolsDeleteRequest(obj);
-
-        var path = (req.url).path;
-        var pathOffset = 0;
-        var index;
-        var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
-        pathOffset += 1;
-
-        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 = "";
-        return new async.Future.value(common_test.stringResponse(200, h, resp));
-      }), true);
-      res.delete(arg_request, arg_projectName, arg_zone, arg_poolName).then(unittest.expectAsync((_) {}));
-    });
-
-    unittest.test("method--get", () {
-
-      var mock = new common_test.HttpServerMock();
-      api.PoolsResourceApi res = new api.ReplicapoolApi(mock).pools;
-      var arg_projectName = "foo";
-      var arg_zone = "foo";
-      var arg_poolName = "foo";
-      mock.register(unittest.expectAsync((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;
-
-        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(buildPool());
-        return new async.Future.value(common_test.stringResponse(200, h, resp));
-      }), true);
-      res.get(arg_projectName, arg_zone, arg_poolName).then(unittest.expectAsync(((api.Pool response) {
-        checkPool(response);
-      })));
-    });
-
-    unittest.test("method--insert", () {
-
-      var mock = new common_test.HttpServerMock();
-      api.PoolsResourceApi res = new api.ReplicapoolApi(mock).pools;
-      var arg_request = buildPool();
-      var arg_projectName = "foo";
-      var arg_zone = "foo";
-      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
-        var obj = new api.Pool.fromJson(json);
-        checkPool(obj);
-
-        var path = (req.url).path;
-        var pathOffset = 0;
-        var index;
-        var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
-        pathOffset += 1;
-
-        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(buildPool());
-        return new async.Future.value(common_test.stringResponse(200, h, resp));
-      }), true);
-      res.insert(arg_request, arg_projectName, arg_zone).then(unittest.expectAsync(((api.Pool response) {
-        checkPool(response);
-      })));
-    });
-
-    unittest.test("method--list", () {
-
-      var mock = new common_test.HttpServerMock();
-      api.PoolsResourceApi res = new api.ReplicapoolApi(mock).pools;
-      var arg_projectName = "foo";
-      var arg_zone = "foo";
-      var arg_maxResults = 42;
-      var arg_pageToken = "foo";
-      mock.register(unittest.expectAsync((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;
-
-        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["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
-
-        var h = {
-          "content-type" : "application/json; charset=utf-8",
-        };
-        var resp = convert.JSON.encode(buildPoolsListResponse());
-        return new async.Future.value(common_test.stringResponse(200, h, resp));
-      }), true);
-      res.list(arg_projectName, arg_zone, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync(((api.PoolsListResponse response) {
-        checkPoolsListResponse(response);
-      })));
-    });
-
-    unittest.test("method--resize", () {
-
-      var mock = new common_test.HttpServerMock();
-      api.PoolsResourceApi res = new api.ReplicapoolApi(mock).pools;
-      var arg_projectName = "foo";
-      var arg_zone = "foo";
-      var arg_poolName = "foo";
-      var arg_numReplicas = 42;
-      mock.register(unittest.expectAsync((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;
-
-        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["numReplicas"].first), unittest.equals(arg_numReplicas));
-
-
-        var h = {
-          "content-type" : "application/json; charset=utf-8",
-        };
-        var resp = convert.JSON.encode(buildPool());
-        return new async.Future.value(common_test.stringResponse(200, h, resp));
-      }), true);
-      res.resize(arg_projectName, arg_zone, arg_poolName, numReplicas: arg_numReplicas).then(unittest.expectAsync(((api.Pool response) {
-        checkPool(response);
-      })));
-    });
-
-    unittest.test("method--updatetemplate", () {
-
-      var mock = new common_test.HttpServerMock();
-      api.PoolsResourceApi res = new api.ReplicapoolApi(mock).pools;
-      var arg_request = buildTemplate();
-      var arg_projectName = "foo";
-      var arg_zone = "foo";
-      var arg_poolName = "foo";
-      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
-        var obj = new api.Template.fromJson(json);
-        checkTemplate(obj);
-
-        var path = (req.url).path;
-        var pathOffset = 0;
-        var index;
-        var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
-        pathOffset += 1;
-
-        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 = "";
-        return new async.Future.value(common_test.stringResponse(200, h, resp));
-      }), true);
-      res.updatetemplate(arg_request, arg_projectName, arg_zone, arg_poolName).then(unittest.expectAsync((_) {}));
-    });
-
-  });
-
-
-  unittest.group("resource-ReplicasResourceApi", () {
-    unittest.test("method--delete", () {
-
-      var mock = new common_test.HttpServerMock();
-      api.ReplicasResourceApi res = new api.ReplicapoolApi(mock).replicas;
-      var arg_request = buildReplicasDeleteRequest();
-      var arg_projectName = "foo";
-      var arg_zone = "foo";
-      var arg_poolName = "foo";
-      var arg_replicaName = "foo";
-      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
-        var obj = new api.ReplicasDeleteRequest.fromJson(json);
-        checkReplicasDeleteRequest(obj);
-
-        var path = (req.url).path;
-        var pathOffset = 0;
-        var index;
-        var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
-        pathOffset += 1;
-
-        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(buildReplica());
-        return new async.Future.value(common_test.stringResponse(200, h, resp));
-      }), true);
-      res.delete(arg_request, arg_projectName, arg_zone, arg_poolName, arg_replicaName).then(unittest.expectAsync(((api.Replica response) {
-        checkReplica(response);
-      })));
-    });
-
-    unittest.test("method--get", () {
-
-      var mock = new common_test.HttpServerMock();
-      api.ReplicasResourceApi res = new api.ReplicapoolApi(mock).replicas;
-      var arg_projectName = "foo";
-      var arg_zone = "foo";
-      var arg_poolName = "foo";
-      var arg_replicaName = "foo";
-      mock.register(unittest.expectAsync((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;
-
-        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(buildReplica());
-        return new async.Future.value(common_test.stringResponse(200, h, resp));
-      }), true);
-      res.get(arg_projectName, arg_zone, arg_poolName, arg_replicaName).then(unittest.expectAsync(((api.Replica response) {
-        checkReplica(response);
-      })));
-    });
-
-    unittest.test("method--list", () {
-
-      var mock = new common_test.HttpServerMock();
-      api.ReplicasResourceApi res = new api.ReplicapoolApi(mock).replicas;
-      var arg_projectName = "foo";
-      var arg_zone = "foo";
-      var arg_poolName = "foo";
-      var arg_maxResults = 42;
-      var arg_pageToken = "foo";
-      mock.register(unittest.expectAsync((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;
-
-        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["maxResults"].first), unittest.equals(arg_maxResults));
-        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
-
-
-        var h = {
-          "content-type" : "application/json; charset=utf-8",
-        };
-        var resp = convert.JSON.encode(buildReplicasListResponse());
-        return new async.Future.value(common_test.stringResponse(200, h, resp));
-      }), true);
-      res.list(arg_projectName, arg_zone, arg_poolName, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync(((api.ReplicasListResponse response) {
-        checkReplicasListResponse(response);
-      })));
-    });
-
-    unittest.test("method--restart", () {
-
-      var mock = new common_test.HttpServerMock();
-      api.ReplicasResourceApi res = new api.ReplicapoolApi(mock).replicas;
-      var arg_projectName = "foo";
-      var arg_zone = "foo";
-      var arg_poolName = "foo";
-      var arg_replicaName = "foo";
-      mock.register(unittest.expectAsync((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;
-
-        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(buildReplica());
-        return new async.Future.value(common_test.stringResponse(200, h, resp));
-      }), true);
-      res.restart(arg_projectName, arg_zone, arg_poolName, arg_replicaName).then(unittest.expectAsync(((api.Replica response) {
-        checkReplica(response);
-      })));
-    });
-
-  });
-
-
-}
-
diff --git a/generated/googleapis_beta/test/replicapool/v1beta2_test.dart b/generated/googleapis_beta/test/replicapool/v1beta2_test.dart
new file mode 100644
index 0000000..ee7e5f9
--- /dev/null
+++ b/generated/googleapis_beta/test/replicapool/v1beta2_test.dart
@@ -0,0 +1,1183 @@
+library googleapis_beta.replicapool.v1beta2.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:unittest/unittest.dart' as unittest;
+import 'package:googleapis_beta/common/common.dart' as common;
+import 'package:googleapis_beta/src/common_internal.dart' as common_internal;
+import '../common/common_internal_test.dart' as common_test;
+
+import 'package:googleapis_beta/replicapool/v1beta2.dart' as api;
+
+
+
+buildUnnamed1365() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1365(core.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 buildCounterInstanceGroupManager = 0;
+buildInstanceGroupManager() {
+  var o = new api.InstanceGroupManager();
+  buildCounterInstanceGroupManager++;
+  if (buildCounterInstanceGroupManager < 3) {
+    o.baseInstanceName = "foo";
+    o.creationTimestamp = "foo";
+    o.currentSize = 42;
+    o.description = "foo";
+    o.fingerprint = "foo";
+    o.group = "foo";
+    o.id = "foo";
+    o.instanceTemplate = "foo";
+    o.kind = "foo";
+    o.name = "foo";
+    o.selfLink = "foo";
+    o.targetPools = buildUnnamed1365();
+    o.targetSize = 42;
+  }
+  buildCounterInstanceGroupManager--;
+  return o;
+}
+
+checkInstanceGroupManager(api.InstanceGroupManager o) {
+  buildCounterInstanceGroupManager++;
+  if (buildCounterInstanceGroupManager < 3) {
+    unittest.expect(o.baseInstanceName, unittest.equals('foo'));
+    unittest.expect(o.creationTimestamp, unittest.equals('foo'));
+    unittest.expect(o.currentSize, unittest.equals(42));
+    unittest.expect(o.description, unittest.equals('foo'));
+    unittest.expect(o.fingerprint, unittest.equals('foo'));
+    unittest.expect(o.group, unittest.equals('foo'));
+    unittest.expect(o.id, unittest.equals('foo'));
+    unittest.expect(o.instanceTemplate, unittest.equals('foo'));
+    unittest.expect(o.kind, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.selfLink, unittest.equals('foo'));
+    checkUnnamed1365(o.targetPools);
+    unittest.expect(o.targetSize, unittest.equals(42));
+  }
+  buildCounterInstanceGroupManager--;
+}
+
+buildUnnamed1366() {
+  var o = new core.List<api.InstanceGroupManager>();
+  o.add(buildInstanceGroupManager());
+  o.add(buildInstanceGroupManager());
+  return o;
+}
+
+checkUnnamed1366(core.List<api.InstanceGroupManager> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkInstanceGroupManager(o[0]);
+  checkInstanceGroupManager(o[1]);
+}
+
+core.int buildCounterInstanceGroupManagerList = 0;
+buildInstanceGroupManagerList() {
+  var o = new api.InstanceGroupManagerList();
+  buildCounterInstanceGroupManagerList++;
+  if (buildCounterInstanceGroupManagerList < 3) {
+    o.id = "foo";
+    o.items = buildUnnamed1366();
+    o.kind = "foo";
+    o.nextPageToken = "foo";
+    o.selfLink = "foo";
+  }
+  buildCounterInstanceGroupManagerList--;
+  return o;
+}
+
+checkInstanceGroupManagerList(api.InstanceGroupManagerList o) {
+  buildCounterInstanceGroupManagerList++;
+  if (buildCounterInstanceGroupManagerList < 3) {
+    unittest.expect(o.id, unittest.equals('foo'));
+    checkUnnamed1366(o.items);
+    unittest.expect(o.kind, unittest.equals('foo'));
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+    unittest.expect(o.selfLink, unittest.equals('foo'));
+  }
+  buildCounterInstanceGroupManagerList--;
+}
+
+buildUnnamed1367() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1367(core.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 buildCounterInstanceGroupManagersAbandonInstancesRequest = 0;
+buildInstanceGroupManagersAbandonInstancesRequest() {
+  var o = new api.InstanceGroupManagersAbandonInstancesRequest();
+  buildCounterInstanceGroupManagersAbandonInstancesRequest++;
+  if (buildCounterInstanceGroupManagersAbandonInstancesRequest < 3) {
+    o.instances = buildUnnamed1367();
+  }
+  buildCounterInstanceGroupManagersAbandonInstancesRequest--;
+  return o;
+}
+
+checkInstanceGroupManagersAbandonInstancesRequest(api.InstanceGroupManagersAbandonInstancesRequest o) {
+  buildCounterInstanceGroupManagersAbandonInstancesRequest++;
+  if (buildCounterInstanceGroupManagersAbandonInstancesRequest < 3) {
+    checkUnnamed1367(o.instances);
+  }
+  buildCounterInstanceGroupManagersAbandonInstancesRequest--;
+}
+
+buildUnnamed1368() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1368(core.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 buildCounterInstanceGroupManagersDeleteInstancesRequest = 0;
+buildInstanceGroupManagersDeleteInstancesRequest() {
+  var o = new api.InstanceGroupManagersDeleteInstancesRequest();
+  buildCounterInstanceGroupManagersDeleteInstancesRequest++;
+  if (buildCounterInstanceGroupManagersDeleteInstancesRequest < 3) {
+    o.instances = buildUnnamed1368();
+  }
+  buildCounterInstanceGroupManagersDeleteInstancesRequest--;
+  return o;
+}
+
+checkInstanceGroupManagersDeleteInstancesRequest(api.InstanceGroupManagersDeleteInstancesRequest o) {
+  buildCounterInstanceGroupManagersDeleteInstancesRequest++;
+  if (buildCounterInstanceGroupManagersDeleteInstancesRequest < 3) {
+    checkUnnamed1368(o.instances);
+  }
+  buildCounterInstanceGroupManagersDeleteInstancesRequest--;
+}
+
+buildUnnamed1369() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1369(core.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 buildCounterInstanceGroupManagersRecreateInstancesRequest = 0;
+buildInstanceGroupManagersRecreateInstancesRequest() {
+  var o = new api.InstanceGroupManagersRecreateInstancesRequest();
+  buildCounterInstanceGroupManagersRecreateInstancesRequest++;
+  if (buildCounterInstanceGroupManagersRecreateInstancesRequest < 3) {
+    o.instances = buildUnnamed1369();
+  }
+  buildCounterInstanceGroupManagersRecreateInstancesRequest--;
+  return o;
+}
+
+checkInstanceGroupManagersRecreateInstancesRequest(api.InstanceGroupManagersRecreateInstancesRequest o) {
+  buildCounterInstanceGroupManagersRecreateInstancesRequest++;
+  if (buildCounterInstanceGroupManagersRecreateInstancesRequest < 3) {
+    checkUnnamed1369(o.instances);
+  }
+  buildCounterInstanceGroupManagersRecreateInstancesRequest--;
+}
+
+core.int buildCounterInstanceGroupManagersSetInstanceTemplateRequest = 0;
+buildInstanceGroupManagersSetInstanceTemplateRequest() {
+  var o = new api.InstanceGroupManagersSetInstanceTemplateRequest();
+  buildCounterInstanceGroupManagersSetInstanceTemplateRequest++;
+  if (buildCounterInstanceGroupManagersSetInstanceTemplateRequest < 3) {
+    o.instanceTemplate = "foo";
+  }
+  buildCounterInstanceGroupManagersSetInstanceTemplateRequest--;
+  return o;
+}
+
+checkInstanceGroupManagersSetInstanceTemplateRequest(api.InstanceGroupManagersSetInstanceTemplateRequest o) {
+  buildCounterInstanceGroupManagersSetInstanceTemplateRequest++;
+  if (buildCounterInstanceGroupManagersSetInstanceTemplateRequest < 3) {
+    unittest.expect(o.instanceTemplate, unittest.equals('foo'));
+  }
+  buildCounterInstanceGroupManagersSetInstanceTemplateRequest--;
+}
+
+buildUnnamed1370() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1370(core.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 buildCounterInstanceGroupManagersSetTargetPoolsRequest = 0;
+buildInstanceGroupManagersSetTargetPoolsRequest() {
+  var o = new api.InstanceGroupManagersSetTargetPoolsRequest();
+  buildCounterInstanceGroupManagersSetTargetPoolsRequest++;
+  if (buildCounterInstanceGroupManagersSetTargetPoolsRequest < 3) {
+    o.fingerprint = "foo";
+    o.targetPools = buildUnnamed1370();
+  }
+  buildCounterInstanceGroupManagersSetTargetPoolsRequest--;
+  return o;
+}
+
+checkInstanceGroupManagersSetTargetPoolsRequest(api.InstanceGroupManagersSetTargetPoolsRequest o) {
+  buildCounterInstanceGroupManagersSetTargetPoolsRequest++;
+  if (buildCounterInstanceGroupManagersSetTargetPoolsRequest < 3) {
+    unittest.expect(o.fingerprint, unittest.equals('foo'));
+    checkUnnamed1370(o.targetPools);
+  }
+  buildCounterInstanceGroupManagersSetTargetPoolsRequest--;
+}
+
+core.int buildCounterOperationErrorErrors = 0;
+buildOperationErrorErrors() {
+  var o = new api.OperationErrorErrors();
+  buildCounterOperationErrorErrors++;
+  if (buildCounterOperationErrorErrors < 3) {
+    o.code = "foo";
+    o.location = "foo";
+    o.message = "foo";
+  }
+  buildCounterOperationErrorErrors--;
+  return o;
+}
+
+checkOperationErrorErrors(api.OperationErrorErrors o) {
+  buildCounterOperationErrorErrors++;
+  if (buildCounterOperationErrorErrors < 3) {
+    unittest.expect(o.code, unittest.equals('foo'));
+    unittest.expect(o.location, unittest.equals('foo'));
+    unittest.expect(o.message, unittest.equals('foo'));
+  }
+  buildCounterOperationErrorErrors--;
+}
+
+buildUnnamed1371() {
+  var o = new core.List<api.OperationErrorErrors>();
+  o.add(buildOperationErrorErrors());
+  o.add(buildOperationErrorErrors());
+  return o;
+}
+
+checkUnnamed1371(core.List<api.OperationErrorErrors> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkOperationErrorErrors(o[0]);
+  checkOperationErrorErrors(o[1]);
+}
+
+core.int buildCounterOperationError = 0;
+buildOperationError() {
+  var o = new api.OperationError();
+  buildCounterOperationError++;
+  if (buildCounterOperationError < 3) {
+    o.errors = buildUnnamed1371();
+  }
+  buildCounterOperationError--;
+  return o;
+}
+
+checkOperationError(api.OperationError o) {
+  buildCounterOperationError++;
+  if (buildCounterOperationError < 3) {
+    checkUnnamed1371(o.errors);
+  }
+  buildCounterOperationError--;
+}
+
+core.int buildCounterOperationWarningsData = 0;
+buildOperationWarningsData() {
+  var o = new api.OperationWarningsData();
+  buildCounterOperationWarningsData++;
+  if (buildCounterOperationWarningsData < 3) {
+    o.key = "foo";
+    o.value = "foo";
+  }
+  buildCounterOperationWarningsData--;
+  return o;
+}
+
+checkOperationWarningsData(api.OperationWarningsData o) {
+  buildCounterOperationWarningsData++;
+  if (buildCounterOperationWarningsData < 3) {
+    unittest.expect(o.key, unittest.equals('foo'));
+    unittest.expect(o.value, unittest.equals('foo'));
+  }
+  buildCounterOperationWarningsData--;
+}
+
+buildUnnamed1372() {
+  var o = new core.List<api.OperationWarningsData>();
+  o.add(buildOperationWarningsData());
+  o.add(buildOperationWarningsData());
+  return o;
+}
+
+checkUnnamed1372(core.List<api.OperationWarningsData> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkOperationWarningsData(o[0]);
+  checkOperationWarningsData(o[1]);
+}
+
+core.int buildCounterOperationWarnings = 0;
+buildOperationWarnings() {
+  var o = new api.OperationWarnings();
+  buildCounterOperationWarnings++;
+  if (buildCounterOperationWarnings < 3) {
+    o.code = "foo";
+    o.data = buildUnnamed1372();
+    o.message = "foo";
+  }
+  buildCounterOperationWarnings--;
+  return o;
+}
+
+checkOperationWarnings(api.OperationWarnings o) {
+  buildCounterOperationWarnings++;
+  if (buildCounterOperationWarnings < 3) {
+    unittest.expect(o.code, unittest.equals('foo'));
+    checkUnnamed1372(o.data);
+    unittest.expect(o.message, unittest.equals('foo'));
+  }
+  buildCounterOperationWarnings--;
+}
+
+buildUnnamed1373() {
+  var o = new core.List<api.OperationWarnings>();
+  o.add(buildOperationWarnings());
+  o.add(buildOperationWarnings());
+  return o;
+}
+
+checkUnnamed1373(core.List<api.OperationWarnings> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkOperationWarnings(o[0]);
+  checkOperationWarnings(o[1]);
+}
+
+core.int buildCounterOperation = 0;
+buildOperation() {
+  var o = new api.Operation();
+  buildCounterOperation++;
+  if (buildCounterOperation < 3) {
+    o.clientOperationId = "foo";
+    o.creationTimestamp = "foo";
+    o.endTime = "foo";
+    o.error = buildOperationError();
+    o.httpErrorMessage = "foo";
+    o.httpErrorStatusCode = 42;
+    o.id = "foo";
+    o.insertTime = "foo";
+    o.kind = "foo";
+    o.name = "foo";
+    o.operationType = "foo";
+    o.progress = 42;
+    o.region = "foo";
+    o.selfLink = "foo";
+    o.startTime = "foo";
+    o.status = "foo";
+    o.statusMessage = "foo";
+    o.targetId = "foo";
+    o.targetLink = "foo";
+    o.user = "foo";
+    o.warnings = buildUnnamed1373();
+    o.zone = "foo";
+  }
+  buildCounterOperation--;
+  return o;
+}
+
+checkOperation(api.Operation o) {
+  buildCounterOperation++;
+  if (buildCounterOperation < 3) {
+    unittest.expect(o.clientOperationId, unittest.equals('foo'));
+    unittest.expect(o.creationTimestamp, unittest.equals('foo'));
+    unittest.expect(o.endTime, unittest.equals('foo'));
+    checkOperationError(o.error);
+    unittest.expect(o.httpErrorMessage, unittest.equals('foo'));
+    unittest.expect(o.httpErrorStatusCode, unittest.equals(42));
+    unittest.expect(o.id, unittest.equals('foo'));
+    unittest.expect(o.insertTime, unittest.equals('foo'));
+    unittest.expect(o.kind, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.operationType, unittest.equals('foo'));
+    unittest.expect(o.progress, unittest.equals(42));
+    unittest.expect(o.region, 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.targetId, unittest.equals('foo'));
+    unittest.expect(o.targetLink, unittest.equals('foo'));
+    unittest.expect(o.user, unittest.equals('foo'));
+    checkUnnamed1373(o.warnings);
+    unittest.expect(o.zone, unittest.equals('foo'));
+  }
+  buildCounterOperation--;
+}
+
+buildUnnamed1374() {
+  var o = new core.List<api.Operation>();
+  o.add(buildOperation());
+  o.add(buildOperation());
+  return o;
+}
+
+checkUnnamed1374(core.List<api.Operation> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkOperation(o[0]);
+  checkOperation(o[1]);
+}
+
+core.int buildCounterOperationList = 0;
+buildOperationList() {
+  var o = new api.OperationList();
+  buildCounterOperationList++;
+  if (buildCounterOperationList < 3) {
+    o.id = "foo";
+    o.items = buildUnnamed1374();
+    o.kind = "foo";
+    o.nextPageToken = "foo";
+    o.selfLink = "foo";
+  }
+  buildCounterOperationList--;
+  return o;
+}
+
+checkOperationList(api.OperationList o) {
+  buildCounterOperationList++;
+  if (buildCounterOperationList < 3) {
+    unittest.expect(o.id, unittest.equals('foo'));
+    checkUnnamed1374(o.items);
+    unittest.expect(o.kind, unittest.equals('foo'));
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+    unittest.expect(o.selfLink, unittest.equals('foo'));
+  }
+  buildCounterOperationList--;
+}
+
+
+main() {
+  unittest.group("obj-schema-InstanceGroupManager", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildInstanceGroupManager();
+      var od = new api.InstanceGroupManager.fromJson(o.toJson());
+      checkInstanceGroupManager(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-InstanceGroupManagerList", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildInstanceGroupManagerList();
+      var od = new api.InstanceGroupManagerList.fromJson(o.toJson());
+      checkInstanceGroupManagerList(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-InstanceGroupManagersAbandonInstancesRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildInstanceGroupManagersAbandonInstancesRequest();
+      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());
+      checkInstanceGroupManagersDeleteInstancesRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-InstanceGroupManagersRecreateInstancesRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildInstanceGroupManagersRecreateInstancesRequest();
+      var od = new api.InstanceGroupManagersRecreateInstancesRequest.fromJson(o.toJson());
+      checkInstanceGroupManagersRecreateInstancesRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-InstanceGroupManagersSetInstanceTemplateRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildInstanceGroupManagersSetInstanceTemplateRequest();
+      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());
+      checkInstanceGroupManagersSetTargetPoolsRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-OperationErrorErrors", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildOperationErrorErrors();
+      var od = new api.OperationErrorErrors.fromJson(o.toJson());
+      checkOperationErrorErrors(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-OperationError", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildOperationError();
+      var od = new api.OperationError.fromJson(o.toJson());
+      checkOperationError(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-OperationWarningsData", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildOperationWarningsData();
+      var od = new api.OperationWarningsData.fromJson(o.toJson());
+      checkOperationWarningsData(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-OperationWarnings", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildOperationWarnings();
+      var od = new api.OperationWarnings.fromJson(o.toJson());
+      checkOperationWarnings(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-Operation", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildOperation();
+      var od = new api.Operation.fromJson(o.toJson());
+      checkOperation(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-OperationList", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildOperationList();
+      var od = new api.OperationList.fromJson(o.toJson());
+      checkOperationList(od);
+    });
+  });
+
+
+  unittest.group("resource-InstanceGroupManagersResourceApi", () {
+    unittest.test("method--abandonInstances", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.InstanceGroupManagersResourceApi res = new api.ReplicapoolApi(mock).instanceGroupManagers;
+      var arg_request = buildInstanceGroupManagersAbandonInstancesRequest();
+      var arg_project = "foo";
+      var arg_zone = "foo";
+      var arg_instanceGroupManager = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, 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("/"));
+        pathOffset += 1;
+
+        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(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.abandonInstances(arg_request, arg_project, arg_zone, arg_instanceGroupManager).then(unittest.expectAsync(((api.Operation response) {
+        checkOperation(response);
+      })));
+    });
+
+    unittest.test("method--delete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.InstanceGroupManagersResourceApi res = new api.ReplicapoolApi(mock).instanceGroupManagers;
+      var arg_project = "foo";
+      var arg_zone = "foo";
+      var arg_instanceGroupManager = "foo";
+      mock.register(unittest.expectAsync((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;
+
+        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(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.delete(arg_project, arg_zone, arg_instanceGroupManager).then(unittest.expectAsync(((api.Operation response) {
+        checkOperation(response);
+      })));
+    });
+
+    unittest.test("method--deleteInstances", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.InstanceGroupManagersResourceApi res = new api.ReplicapoolApi(mock).instanceGroupManagers;
+      var arg_request = buildInstanceGroupManagersDeleteInstancesRequest();
+      var arg_project = "foo";
+      var arg_zone = "foo";
+      var arg_instanceGroupManager = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, 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("/"));
+        pathOffset += 1;
+
+        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(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.deleteInstances(arg_request, arg_project, arg_zone, arg_instanceGroupManager).then(unittest.expectAsync(((api.Operation response) {
+        checkOperation(response);
+      })));
+    });
+
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.InstanceGroupManagersResourceApi res = new api.ReplicapoolApi(mock).instanceGroupManagers;
+      var arg_project = "foo";
+      var arg_zone = "foo";
+      var arg_instanceGroupManager = "foo";
+      mock.register(unittest.expectAsync((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;
+
+        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(buildInstanceGroupManager());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_project, arg_zone, arg_instanceGroupManager).then(unittest.expectAsync(((api.InstanceGroupManager response) {
+        checkInstanceGroupManager(response);
+      })));
+    });
+
+    unittest.test("method--insert", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.InstanceGroupManagersResourceApi res = new api.ReplicapoolApi(mock).instanceGroupManagers;
+      var arg_request = buildInstanceGroupManager();
+      var arg_project = "foo";
+      var arg_zone = "foo";
+      var arg_size = 42;
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.InstanceGroupManager.fromJson(json);
+        checkInstanceGroupManager(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+
+        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["size"].first), unittest.equals(arg_size));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildOperation());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.insert(arg_request, arg_project, arg_zone, arg_size).then(unittest.expectAsync(((api.Operation response) {
+        checkOperation(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.InstanceGroupManagersResourceApi res = new api.ReplicapoolApi(mock).instanceGroupManagers;
+      var arg_project = "foo";
+      var arg_zone = "foo";
+      var arg_filter = "foo";
+      var arg_maxResults = 42;
+      var arg_pageToken = "foo";
+      mock.register(unittest.expectAsync((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;
+
+        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["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));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildInstanceGroupManagerList());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_project, arg_zone, filter: arg_filter, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync(((api.InstanceGroupManagerList response) {
+        checkInstanceGroupManagerList(response);
+      })));
+    });
+
+    unittest.test("method--recreateInstances", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.InstanceGroupManagersResourceApi res = new api.ReplicapoolApi(mock).instanceGroupManagers;
+      var arg_request = buildInstanceGroupManagersRecreateInstancesRequest();
+      var arg_project = "foo";
+      var arg_zone = "foo";
+      var arg_instanceGroupManager = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, 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("/"));
+        pathOffset += 1;
+
+        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(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.recreateInstances(arg_request, arg_project, arg_zone, arg_instanceGroupManager).then(unittest.expectAsync(((api.Operation response) {
+        checkOperation(response);
+      })));
+    });
+
+    unittest.test("method--resize", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.InstanceGroupManagersResourceApi res = new api.ReplicapoolApi(mock).instanceGroupManagers;
+      var arg_project = "foo";
+      var arg_zone = "foo";
+      var arg_instanceGroupManager = "foo";
+      var arg_size = 42;
+      mock.register(unittest.expectAsync((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;
+
+        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["size"].first), unittest.equals(arg_size));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildOperation());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.resize(arg_project, arg_zone, arg_instanceGroupManager, arg_size).then(unittest.expectAsync(((api.Operation response) {
+        checkOperation(response);
+      })));
+    });
+
+    unittest.test("method--setInstanceTemplate", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.InstanceGroupManagersResourceApi res = new api.ReplicapoolApi(mock).instanceGroupManagers;
+      var arg_request = buildInstanceGroupManagersSetInstanceTemplateRequest();
+      var arg_project = "foo";
+      var arg_zone = "foo";
+      var arg_instanceGroupManager = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, 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("/"));
+        pathOffset += 1;
+
+        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(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.setInstanceTemplate(arg_request, arg_project, arg_zone, arg_instanceGroupManager).then(unittest.expectAsync(((api.Operation response) {
+        checkOperation(response);
+      })));
+    });
+
+    unittest.test("method--setTargetPools", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.InstanceGroupManagersResourceApi res = new api.ReplicapoolApi(mock).instanceGroupManagers;
+      var arg_request = buildInstanceGroupManagersSetTargetPoolsRequest();
+      var arg_project = "foo";
+      var arg_zone = "foo";
+      var arg_instanceGroupManager = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, 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("/"));
+        pathOffset += 1;
+
+        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(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.setTargetPools(arg_request, arg_project, arg_zone, arg_instanceGroupManager).then(unittest.expectAsync(((api.Operation response) {
+        checkOperation(response);
+      })));
+    });
+
+  });
+
+
+  unittest.group("resource-ZoneOperationsResourceApi", () {
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ZoneOperationsResourceApi res = new api.ReplicapoolApi(mock).zoneOperations;
+      var arg_project = "foo";
+      var arg_zone = "foo";
+      var arg_operation = "foo";
+      mock.register(unittest.expectAsync((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;
+
+        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(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_project, arg_zone, arg_operation).then(unittest.expectAsync(((api.Operation response) {
+        checkOperation(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.ZoneOperationsResourceApi res = new api.ReplicapoolApi(mock).zoneOperations;
+      var arg_project = "foo";
+      var arg_zone = "foo";
+      var arg_filter = "foo";
+      var arg_maxResults = 42;
+      var arg_pageToken = "foo";
+      mock.register(unittest.expectAsync((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;
+
+        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["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));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildOperationList());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_project, arg_zone, filter: arg_filter, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync(((api.OperationList response) {
+        checkOperationList(response);
+      })));
+    });
+
+  });
+
+
+}
+
diff --git a/generated/googleapis_beta/test/replicapoolupdater/v1beta1_test.dart b/generated/googleapis_beta/test/replicapoolupdater/v1beta1_test.dart
new file mode 100644
index 0000000..426e0f4
--- /dev/null
+++ b/generated/googleapis_beta/test/replicapoolupdater/v1beta1_test.dart
@@ -0,0 +1,557 @@
+library googleapis_beta.replicapoolupdater.v1beta1.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:unittest/unittest.dart' as unittest;
+import 'package:googleapis_beta/common/common.dart' as common;
+import 'package:googleapis_beta/src/common_internal.dart' as common_internal;
+import '../common/common_internal_test.dart' as common_test;
+
+import 'package:googleapis_beta/replicapoolupdater/v1beta1.dart' as api;
+
+
+
+core.int buildCounterInsertResponse = 0;
+buildInsertResponse() {
+  var o = new api.InsertResponse();
+  buildCounterInsertResponse++;
+  if (buildCounterInsertResponse < 3) {
+    o.update = "foo";
+  }
+  buildCounterInsertResponse--;
+  return o;
+}
+
+checkInsertResponse(api.InsertResponse o) {
+  buildCounterInsertResponse++;
+  if (buildCounterInsertResponse < 3) {
+    unittest.expect(o.update, unittest.equals('foo'));
+  }
+  buildCounterInsertResponse--;
+}
+
+core.int buildCounterInstanceUpdate = 0;
+buildInstanceUpdate() {
+  var o = new api.InstanceUpdate();
+  buildCounterInstanceUpdate++;
+  if (buildCounterInstanceUpdate < 3) {
+    o.instanceName = "foo";
+    o.state = "foo";
+  }
+  buildCounterInstanceUpdate--;
+  return o;
+}
+
+checkInstanceUpdate(api.InstanceUpdate o) {
+  buildCounterInstanceUpdate++;
+  if (buildCounterInstanceUpdate < 3) {
+    unittest.expect(o.instanceName, unittest.equals('foo'));
+    unittest.expect(o.state, unittest.equals('foo'));
+  }
+  buildCounterInstanceUpdate--;
+}
+
+buildUnnamed1375() {
+  var o = new core.List<api.InstanceUpdate>();
+  o.add(buildInstanceUpdate());
+  o.add(buildInstanceUpdate());
+  return o;
+}
+
+checkUnnamed1375(core.List<api.InstanceUpdate> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkInstanceUpdate(o[0]);
+  checkInstanceUpdate(o[1]);
+}
+
+core.int buildCounterUpdate = 0;
+buildUpdate() {
+  var o = new api.Update();
+  buildCounterUpdate++;
+  if (buildCounterUpdate < 3) {
+    o.details = "foo";
+    o.handle = "foo";
+    o.instanceTemplate = "foo";
+    o.instanceUpdates = buildUnnamed1375();
+    o.kind = "foo";
+    o.policy = buildUpdatePolicy();
+    o.selfLink = "foo";
+    o.state = "foo";
+    o.targetState = "foo";
+  }
+  buildCounterUpdate--;
+  return o;
+}
+
+checkUpdate(api.Update o) {
+  buildCounterUpdate++;
+  if (buildCounterUpdate < 3) {
+    unittest.expect(o.details, unittest.equals('foo'));
+    unittest.expect(o.handle, unittest.equals('foo'));
+    unittest.expect(o.instanceTemplate, unittest.equals('foo'));
+    checkUnnamed1375(o.instanceUpdates);
+    unittest.expect(o.kind, unittest.equals('foo'));
+    checkUpdatePolicy(o.policy);
+    unittest.expect(o.selfLink, unittest.equals('foo'));
+    unittest.expect(o.state, unittest.equals('foo'));
+    unittest.expect(o.targetState, unittest.equals('foo'));
+  }
+  buildCounterUpdate--;
+}
+
+buildUnnamed1376() {
+  var o = new core.List<api.Update>();
+  o.add(buildUpdate());
+  o.add(buildUpdate());
+  return o;
+}
+
+checkUnnamed1376(core.List<api.Update> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkUpdate(o[0]);
+  checkUpdate(o[1]);
+}
+
+core.int buildCounterUpdateList = 0;
+buildUpdateList() {
+  var o = new api.UpdateList();
+  buildCounterUpdateList++;
+  if (buildCounterUpdateList < 3) {
+    o.items = buildUnnamed1376();
+    o.nextPageToken = "foo";
+  }
+  buildCounterUpdateList--;
+  return o;
+}
+
+checkUpdateList(api.UpdateList o) {
+  buildCounterUpdateList++;
+  if (buildCounterUpdateList < 3) {
+    checkUnnamed1376(o.items);
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+  }
+  buildCounterUpdateList--;
+}
+
+core.int buildCounterUpdatePolicy = 0;
+buildUpdatePolicy() {
+  var o = new api.UpdatePolicy();
+  buildCounterUpdatePolicy++;
+  if (buildCounterUpdatePolicy < 3) {
+    o.canary = buildUpdatePolicyCanary();
+    o.maxNumConcurrentInstances = 42;
+    o.sleepAfterInstanceRestartSec = 42;
+  }
+  buildCounterUpdatePolicy--;
+  return o;
+}
+
+checkUpdatePolicy(api.UpdatePolicy o) {
+  buildCounterUpdatePolicy++;
+  if (buildCounterUpdatePolicy < 3) {
+    checkUpdatePolicyCanary(o.canary);
+    unittest.expect(o.maxNumConcurrentInstances, unittest.equals(42));
+    unittest.expect(o.sleepAfterInstanceRestartSec, unittest.equals(42));
+  }
+  buildCounterUpdatePolicy--;
+}
+
+core.int buildCounterUpdatePolicyCanary = 0;
+buildUpdatePolicyCanary() {
+  var o = new api.UpdatePolicyCanary();
+  buildCounterUpdatePolicyCanary++;
+  if (buildCounterUpdatePolicyCanary < 3) {
+    o.numInstances = 42;
+  }
+  buildCounterUpdatePolicyCanary--;
+  return o;
+}
+
+checkUpdatePolicyCanary(api.UpdatePolicyCanary o) {
+  buildCounterUpdatePolicyCanary++;
+  if (buildCounterUpdatePolicyCanary < 3) {
+    unittest.expect(o.numInstances, unittest.equals(42));
+  }
+  buildCounterUpdatePolicyCanary--;
+}
+
+
+main() {
+  unittest.group("obj-schema-InsertResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildInsertResponse();
+      var od = new api.InsertResponse.fromJson(o.toJson());
+      checkInsertResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-InstanceUpdate", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildInstanceUpdate();
+      var od = new api.InstanceUpdate.fromJson(o.toJson());
+      checkInstanceUpdate(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-Update", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildUpdate();
+      var od = new api.Update.fromJson(o.toJson());
+      checkUpdate(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-UpdateList", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildUpdateList();
+      var od = new api.UpdateList.fromJson(o.toJson());
+      checkUpdateList(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-UpdatePolicy", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildUpdatePolicy();
+      var od = new api.UpdatePolicy.fromJson(o.toJson());
+      checkUpdatePolicy(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-UpdatePolicyCanary", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildUpdatePolicyCanary();
+      var od = new api.UpdatePolicyCanary.fromJson(o.toJson());
+      checkUpdatePolicyCanary(od);
+    });
+  });
+
+
+  unittest.group("resource-UpdatesResourceApi", () {
+    unittest.test("method--cancel", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.UpdatesResourceApi res = new api.ReplicapoolupdaterApi(mock).updates;
+      var arg_project = "foo";
+      var arg_zone = "foo";
+      var arg_instanceGroupManager = "foo";
+      var arg_update = "foo";
+      mock.register(unittest.expectAsync((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;
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.cancel(arg_project, arg_zone, arg_instanceGroupManager, arg_update).then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.UpdatesResourceApi res = new api.ReplicapoolupdaterApi(mock).updates;
+      var arg_project = "foo";
+      var arg_zone = "foo";
+      var arg_instanceGroupManager = "foo";
+      var arg_update = "foo";
+      mock.register(unittest.expectAsync((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;
+
+        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(buildUpdate());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_project, arg_zone, arg_instanceGroupManager, arg_update).then(unittest.expectAsync(((api.Update response) {
+        checkUpdate(response);
+      })));
+    });
+
+    unittest.test("method--insert", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.UpdatesResourceApi res = new api.ReplicapoolupdaterApi(mock).updates;
+      var arg_request = buildUpdate();
+      var arg_project = "foo";
+      var arg_zone = "foo";
+      var arg_instanceGroupManager = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.Update.fromJson(json);
+        checkUpdate(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+
+        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(buildInsertResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.insert(arg_request, arg_project, arg_zone, arg_instanceGroupManager).then(unittest.expectAsync(((api.InsertResponse response) {
+        checkInsertResponse(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.UpdatesResourceApi res = new api.ReplicapoolupdaterApi(mock).updates;
+      var arg_project = "foo";
+      var arg_zone = "foo";
+      var arg_instanceGroupManager = "foo";
+      var arg_maxResults = 42;
+      var arg_pageToken = "foo";
+      mock.register(unittest.expectAsync((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;
+
+        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["maxResults"].first), unittest.equals(arg_maxResults));
+        unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildUpdateList());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_project, arg_zone, arg_instanceGroupManager, maxResults: arg_maxResults, pageToken: arg_pageToken).then(unittest.expectAsync(((api.UpdateList response) {
+        checkUpdateList(response);
+      })));
+    });
+
+    unittest.test("method--pause", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.UpdatesResourceApi res = new api.ReplicapoolupdaterApi(mock).updates;
+      var arg_project = "foo";
+      var arg_zone = "foo";
+      var arg_instanceGroupManager = "foo";
+      var arg_update = "foo";
+      mock.register(unittest.expectAsync((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;
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.pause(arg_project, arg_zone, arg_instanceGroupManager, arg_update).then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--rollback", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.UpdatesResourceApi res = new api.ReplicapoolupdaterApi(mock).updates;
+      var arg_project = "foo";
+      var arg_zone = "foo";
+      var arg_instanceGroupManager = "foo";
+      var arg_update = "foo";
+      mock.register(unittest.expectAsync((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;
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.rollback(arg_project, arg_zone, arg_instanceGroupManager, arg_update).then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--rollforward", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.UpdatesResourceApi res = new api.ReplicapoolupdaterApi(mock).updates;
+      var arg_project = "foo";
+      var arg_zone = "foo";
+      var arg_instanceGroupManager = "foo";
+      var arg_update = "foo";
+      mock.register(unittest.expectAsync((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;
+
+        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 = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.rollforward(arg_project, arg_zone, arg_instanceGroupManager, arg_update).then(unittest.expectAsync((_) {}));
+    });
+
+  });
+
+
+}
+
diff --git a/generated/googleapis_beta/test/resourceviews/v1beta1_test.dart b/generated/googleapis_beta/test/resourceviews/v1beta1_test.dart
index 2726b71..3218de7 100644
--- a/generated/googleapis_beta/test/resourceviews/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/resourceviews/v1beta1_test.dart
@@ -37,14 +37,14 @@
   buildCounterLabel--;
 }
 
-buildUnnamed1173() {
+buildUnnamed1377() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1173(core.List<core.String> o) {
+checkUnnamed1377(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -55,7 +55,7 @@
   var o = new api.RegionViewsAddResourcesRequest();
   buildCounterRegionViewsAddResourcesRequest++;
   if (buildCounterRegionViewsAddResourcesRequest < 3) {
-    o.resources = buildUnnamed1173();
+    o.resources = buildUnnamed1377();
   }
   buildCounterRegionViewsAddResourcesRequest--;
   return o;
@@ -64,7 +64,7 @@
 checkRegionViewsAddResourcesRequest(api.RegionViewsAddResourcesRequest o) {
   buildCounterRegionViewsAddResourcesRequest++;
   if (buildCounterRegionViewsAddResourcesRequest < 3) {
-    checkUnnamed1173(o.resources);
+    checkUnnamed1377(o.resources);
   }
   buildCounterRegionViewsAddResourcesRequest--;
 }
@@ -88,14 +88,14 @@
   buildCounterRegionViewsInsertResponse--;
 }
 
-buildUnnamed1174() {
+buildUnnamed1378() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1174(core.List<core.String> o) {
+checkUnnamed1378(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -106,7 +106,7 @@
   var o = new api.RegionViewsListResourcesResponse();
   buildCounterRegionViewsListResourcesResponse++;
   if (buildCounterRegionViewsListResourcesResponse < 3) {
-    o.members = buildUnnamed1174();
+    o.members = buildUnnamed1378();
     o.nextPageToken = "foo";
   }
   buildCounterRegionViewsListResourcesResponse--;
@@ -116,20 +116,20 @@
 checkRegionViewsListResourcesResponse(api.RegionViewsListResourcesResponse o) {
   buildCounterRegionViewsListResourcesResponse++;
   if (buildCounterRegionViewsListResourcesResponse < 3) {
-    checkUnnamed1174(o.members);
+    checkUnnamed1378(o.members);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterRegionViewsListResourcesResponse--;
 }
 
-buildUnnamed1175() {
+buildUnnamed1379() {
   var o = new core.List<api.ResourceView>();
   o.add(buildResourceView());
   o.add(buildResourceView());
   return o;
 }
 
-checkUnnamed1175(core.List<api.ResourceView> o) {
+checkUnnamed1379(core.List<api.ResourceView> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceView(o[0]);
   checkResourceView(o[1]);
@@ -141,7 +141,7 @@
   buildCounterRegionViewsListResponse++;
   if (buildCounterRegionViewsListResponse < 3) {
     o.nextPageToken = "foo";
-    o.resourceViews = buildUnnamed1175();
+    o.resourceViews = buildUnnamed1379();
   }
   buildCounterRegionViewsListResponse--;
   return o;
@@ -151,19 +151,19 @@
   buildCounterRegionViewsListResponse++;
   if (buildCounterRegionViewsListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1175(o.resourceViews);
+    checkUnnamed1379(o.resourceViews);
   }
   buildCounterRegionViewsListResponse--;
 }
 
-buildUnnamed1176() {
+buildUnnamed1380() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1176(core.List<core.String> o) {
+checkUnnamed1380(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -174,7 +174,7 @@
   var o = new api.RegionViewsRemoveResourcesRequest();
   buildCounterRegionViewsRemoveResourcesRequest++;
   if (buildCounterRegionViewsRemoveResourcesRequest < 3) {
-    o.resources = buildUnnamed1176();
+    o.resources = buildUnnamed1380();
   }
   buildCounterRegionViewsRemoveResourcesRequest--;
   return o;
@@ -183,32 +183,32 @@
 checkRegionViewsRemoveResourcesRequest(api.RegionViewsRemoveResourcesRequest o) {
   buildCounterRegionViewsRemoveResourcesRequest++;
   if (buildCounterRegionViewsRemoveResourcesRequest < 3) {
-    checkUnnamed1176(o.resources);
+    checkUnnamed1380(o.resources);
   }
   buildCounterRegionViewsRemoveResourcesRequest--;
 }
 
-buildUnnamed1177() {
+buildUnnamed1381() {
   var o = new core.List<api.Label>();
   o.add(buildLabel());
   o.add(buildLabel());
   return o;
 }
 
-checkUnnamed1177(core.List<api.Label> o) {
+checkUnnamed1381(core.List<api.Label> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabel(o[0]);
   checkLabel(o[1]);
 }
 
-buildUnnamed1178() {
+buildUnnamed1382() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1178(core.List<core.String> o) {
+checkUnnamed1382(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -223,9 +223,9 @@
     o.description = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed1177();
+    o.labels = buildUnnamed1381();
     o.lastModified = "foo";
-    o.members = buildUnnamed1178();
+    o.members = buildUnnamed1382();
     o.name = "foo";
     o.numMembers = 42;
     o.selfLink = "foo";
@@ -241,9 +241,9 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1177(o.labels);
+    checkUnnamed1381(o.labels);
     unittest.expect(o.lastModified, unittest.equals('foo'));
-    checkUnnamed1178(o.members);
+    checkUnnamed1382(o.members);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.numMembers, unittest.equals(42));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -251,14 +251,14 @@
   buildCounterResourceView--;
 }
 
-buildUnnamed1179() {
+buildUnnamed1383() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1179(core.List<core.String> o) {
+checkUnnamed1383(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -269,7 +269,7 @@
   var o = new api.ZoneViewsAddResourcesRequest();
   buildCounterZoneViewsAddResourcesRequest++;
   if (buildCounterZoneViewsAddResourcesRequest < 3) {
-    o.resources = buildUnnamed1179();
+    o.resources = buildUnnamed1383();
   }
   buildCounterZoneViewsAddResourcesRequest--;
   return o;
@@ -278,7 +278,7 @@
 checkZoneViewsAddResourcesRequest(api.ZoneViewsAddResourcesRequest o) {
   buildCounterZoneViewsAddResourcesRequest++;
   if (buildCounterZoneViewsAddResourcesRequest < 3) {
-    checkUnnamed1179(o.resources);
+    checkUnnamed1383(o.resources);
   }
   buildCounterZoneViewsAddResourcesRequest--;
 }
@@ -302,14 +302,14 @@
   buildCounterZoneViewsInsertResponse--;
 }
 
-buildUnnamed1180() {
+buildUnnamed1384() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1180(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'));
@@ -320,7 +320,7 @@
   var o = new api.ZoneViewsListResourcesResponse();
   buildCounterZoneViewsListResourcesResponse++;
   if (buildCounterZoneViewsListResourcesResponse < 3) {
-    o.members = buildUnnamed1180();
+    o.members = buildUnnamed1384();
     o.nextPageToken = "foo";
   }
   buildCounterZoneViewsListResourcesResponse--;
@@ -330,20 +330,20 @@
 checkZoneViewsListResourcesResponse(api.ZoneViewsListResourcesResponse o) {
   buildCounterZoneViewsListResourcesResponse++;
   if (buildCounterZoneViewsListResourcesResponse < 3) {
-    checkUnnamed1180(o.members);
+    checkUnnamed1384(o.members);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterZoneViewsListResourcesResponse--;
 }
 
-buildUnnamed1181() {
+buildUnnamed1385() {
   var o = new core.List<api.ResourceView>();
   o.add(buildResourceView());
   o.add(buildResourceView());
   return o;
 }
 
-checkUnnamed1181(core.List<api.ResourceView> o) {
+checkUnnamed1385(core.List<api.ResourceView> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceView(o[0]);
   checkResourceView(o[1]);
@@ -355,7 +355,7 @@
   buildCounterZoneViewsListResponse++;
   if (buildCounterZoneViewsListResponse < 3) {
     o.nextPageToken = "foo";
-    o.resourceViews = buildUnnamed1181();
+    o.resourceViews = buildUnnamed1385();
   }
   buildCounterZoneViewsListResponse--;
   return o;
@@ -365,19 +365,19 @@
   buildCounterZoneViewsListResponse++;
   if (buildCounterZoneViewsListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1181(o.resourceViews);
+    checkUnnamed1385(o.resourceViews);
   }
   buildCounterZoneViewsListResponse--;
 }
 
-buildUnnamed1182() {
+buildUnnamed1386() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1182(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'));
@@ -388,7 +388,7 @@
   var o = new api.ZoneViewsRemoveResourcesRequest();
   buildCounterZoneViewsRemoveResourcesRequest++;
   if (buildCounterZoneViewsRemoveResourcesRequest < 3) {
-    o.resources = buildUnnamed1182();
+    o.resources = buildUnnamed1386();
   }
   buildCounterZoneViewsRemoveResourcesRequest--;
   return o;
@@ -397,7 +397,7 @@
 checkZoneViewsRemoveResourcesRequest(api.ZoneViewsRemoveResourcesRequest o) {
   buildCounterZoneViewsRemoveResourcesRequest++;
   if (buildCounterZoneViewsRemoveResourcesRequest < 3) {
-    checkUnnamed1182(o.resources);
+    checkUnnamed1386(o.resources);
   }
   buildCounterZoneViewsRemoveResourcesRequest--;
 }
diff --git a/generated/googleapis_beta/test/resourceviews/v1beta2_test.dart b/generated/googleapis_beta/test/resourceviews/v1beta2_test.dart
index c028e94..3bd2606 100644
--- a/generated/googleapis_beta/test/resourceviews/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/resourceviews/v1beta2_test.dart
@@ -37,30 +37,30 @@
   buildCounterLabel--;
 }
 
-buildUnnamed1135() {
+buildUnnamed1387() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed1135(core.List<core.int> o) {
+checkUnnamed1387(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));
 }
 
-buildUnnamed1136() {
+buildUnnamed1388() {
   var o = new core.Map<core.String, core.List<core.int>>();
-  o["x"] = buildUnnamed1135();
-  o["y"] = buildUnnamed1135();
+  o["x"] = buildUnnamed1387();
+  o["y"] = buildUnnamed1387();
   return o;
 }
 
-checkUnnamed1136(core.Map<core.String, core.List<core.int>> o) {
+checkUnnamed1388(core.Map<core.String, core.List<core.int>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1135(o["x"]);
-  checkUnnamed1135(o["y"]);
+  checkUnnamed1387(o["x"]);
+  checkUnnamed1387(o["y"]);
 }
 
 core.int buildCounterListResourceResponseItem = 0;
@@ -68,7 +68,7 @@
   var o = new api.ListResourceResponseItem();
   buildCounterListResourceResponseItem++;
   if (buildCounterListResourceResponseItem < 3) {
-    o.endpoints = buildUnnamed1136();
+    o.endpoints = buildUnnamed1388();
     o.resource = "foo";
   }
   buildCounterListResourceResponseItem--;
@@ -78,7 +78,7 @@
 checkListResourceResponseItem(api.ListResourceResponseItem o) {
   buildCounterListResourceResponseItem++;
   if (buildCounterListResourceResponseItem < 3) {
-    checkUnnamed1136(o.endpoints);
+    checkUnnamed1388(o.endpoints);
     unittest.expect(o.resource, unittest.equals('foo'));
   }
   buildCounterListResourceResponseItem--;
@@ -107,14 +107,14 @@
   buildCounterOperationErrorErrors--;
 }
 
-buildUnnamed1137() {
+buildUnnamed1389() {
   var o = new core.List<api.OperationErrorErrors>();
   o.add(buildOperationErrorErrors());
   o.add(buildOperationErrorErrors());
   return o;
 }
 
-checkUnnamed1137(core.List<api.OperationErrorErrors> o) {
+checkUnnamed1389(core.List<api.OperationErrorErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationErrorErrors(o[0]);
   checkOperationErrorErrors(o[1]);
@@ -125,7 +125,7 @@
   var o = new api.OperationError();
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    o.errors = buildUnnamed1137();
+    o.errors = buildUnnamed1389();
   }
   buildCounterOperationError--;
   return o;
@@ -134,7 +134,7 @@
 checkOperationError(api.OperationError o) {
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    checkUnnamed1137(o.errors);
+    checkUnnamed1389(o.errors);
   }
   buildCounterOperationError--;
 }
@@ -160,14 +160,14 @@
   buildCounterOperationWarningsData--;
 }
 
-buildUnnamed1138() {
+buildUnnamed1390() {
   var o = new core.List<api.OperationWarningsData>();
   o.add(buildOperationWarningsData());
   o.add(buildOperationWarningsData());
   return o;
 }
 
-checkUnnamed1138(core.List<api.OperationWarningsData> o) {
+checkUnnamed1390(core.List<api.OperationWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarningsData(o[0]);
   checkOperationWarningsData(o[1]);
@@ -179,7 +179,7 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed1138();
+    o.data = buildUnnamed1390();
     o.message = "foo";
   }
   buildCounterOperationWarnings--;
@@ -190,20 +190,20 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed1138(o.data);
+    checkUnnamed1390(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterOperationWarnings--;
 }
 
-buildUnnamed1139() {
+buildUnnamed1391() {
   var o = new core.List<api.OperationWarnings>();
   o.add(buildOperationWarnings());
   o.add(buildOperationWarnings());
   return o;
 }
 
-checkUnnamed1139(core.List<api.OperationWarnings> o) {
+checkUnnamed1391(core.List<api.OperationWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarnings(o[0]);
   checkOperationWarnings(o[1]);
@@ -234,7 +234,7 @@
     o.targetId = "foo";
     o.targetLink = "foo";
     o.user = "foo";
-    o.warnings = buildUnnamed1139();
+    o.warnings = buildUnnamed1391();
     o.zone = "foo";
   }
   buildCounterOperation--;
@@ -264,20 +264,20 @@
     unittest.expect(o.targetId, unittest.equals('foo'));
     unittest.expect(o.targetLink, unittest.equals('foo'));
     unittest.expect(o.user, unittest.equals('foo'));
-    checkUnnamed1139(o.warnings);
+    checkUnnamed1391(o.warnings);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterOperation--;
 }
 
-buildUnnamed1140() {
+buildUnnamed1392() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed1140(core.List<api.Operation> o) {
+checkUnnamed1392(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -289,7 +289,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed1140();
+    o.items = buildUnnamed1392();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -302,7 +302,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1140(o.items);
+    checkUnnamed1392(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -310,40 +310,40 @@
   buildCounterOperationList--;
 }
 
-buildUnnamed1141() {
+buildUnnamed1393() {
   var o = new core.List<api.ServiceEndpoint>();
   o.add(buildServiceEndpoint());
   o.add(buildServiceEndpoint());
   return o;
 }
 
-checkUnnamed1141(core.List<api.ServiceEndpoint> o) {
+checkUnnamed1393(core.List<api.ServiceEndpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceEndpoint(o[0]);
   checkServiceEndpoint(o[1]);
 }
 
-buildUnnamed1142() {
+buildUnnamed1394() {
   var o = new core.List<api.Label>();
   o.add(buildLabel());
   o.add(buildLabel());
   return o;
 }
 
-checkUnnamed1142(core.List<api.Label> o) {
+checkUnnamed1394(core.List<api.Label> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabel(o[0]);
   checkLabel(o[1]);
 }
 
-buildUnnamed1143() {
+buildUnnamed1395() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1143(core.List<core.String> o) {
+checkUnnamed1395(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -356,14 +356,14 @@
   if (buildCounterResourceView < 3) {
     o.creationTimestamp = "foo";
     o.description = "foo";
-    o.endpoints = buildUnnamed1141();
+    o.endpoints = buildUnnamed1393();
     o.fingerprint = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed1142();
+    o.labels = buildUnnamed1394();
     o.name = "foo";
     o.network = "foo";
-    o.resources = buildUnnamed1143();
+    o.resources = buildUnnamed1395();
     o.selfLink = "foo";
     o.size = 42;
   }
@@ -376,14 +376,14 @@
   if (buildCounterResourceView < 3) {
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1141(o.endpoints);
+    checkUnnamed1393(o.endpoints);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1142(o.labels);
+    checkUnnamed1394(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
-    checkUnnamed1143(o.resources);
+    checkUnnamed1395(o.resources);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.size, unittest.equals(42));
   }
@@ -411,14 +411,14 @@
   buildCounterServiceEndpoint--;
 }
 
-buildUnnamed1144() {
+buildUnnamed1396() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1144(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'));
@@ -429,7 +429,7 @@
   var o = new api.ZoneViewsAddResourcesRequest();
   buildCounterZoneViewsAddResourcesRequest++;
   if (buildCounterZoneViewsAddResourcesRequest < 3) {
-    o.resources = buildUnnamed1144();
+    o.resources = buildUnnamed1396();
   }
   buildCounterZoneViewsAddResourcesRequest--;
   return o;
@@ -438,19 +438,19 @@
 checkZoneViewsAddResourcesRequest(api.ZoneViewsAddResourcesRequest o) {
   buildCounterZoneViewsAddResourcesRequest++;
   if (buildCounterZoneViewsAddResourcesRequest < 3) {
-    checkUnnamed1144(o.resources);
+    checkUnnamed1396(o.resources);
   }
   buildCounterZoneViewsAddResourcesRequest--;
 }
 
-buildUnnamed1145() {
+buildUnnamed1397() {
   var o = new core.List<api.ServiceEndpoint>();
   o.add(buildServiceEndpoint());
   o.add(buildServiceEndpoint());
   return o;
 }
 
-checkUnnamed1145(core.List<api.ServiceEndpoint> o) {
+checkUnnamed1397(core.List<api.ServiceEndpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceEndpoint(o[0]);
   checkServiceEndpoint(o[1]);
@@ -461,7 +461,7 @@
   var o = new api.ZoneViewsGetServiceResponse();
   buildCounterZoneViewsGetServiceResponse++;
   if (buildCounterZoneViewsGetServiceResponse < 3) {
-    o.endpoints = buildUnnamed1145();
+    o.endpoints = buildUnnamed1397();
     o.fingerprint = "foo";
   }
   buildCounterZoneViewsGetServiceResponse--;
@@ -471,20 +471,20 @@
 checkZoneViewsGetServiceResponse(api.ZoneViewsGetServiceResponse o) {
   buildCounterZoneViewsGetServiceResponse++;
   if (buildCounterZoneViewsGetServiceResponse < 3) {
-    checkUnnamed1145(o.endpoints);
+    checkUnnamed1397(o.endpoints);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
   }
   buildCounterZoneViewsGetServiceResponse--;
 }
 
-buildUnnamed1146() {
+buildUnnamed1398() {
   var o = new core.List<api.ResourceView>();
   o.add(buildResourceView());
   o.add(buildResourceView());
   return o;
 }
 
-checkUnnamed1146(core.List<api.ResourceView> o) {
+checkUnnamed1398(core.List<api.ResourceView> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceView(o[0]);
   checkResourceView(o[1]);
@@ -495,7 +495,7 @@
   var o = new api.ZoneViewsList();
   buildCounterZoneViewsList++;
   if (buildCounterZoneViewsList < 3) {
-    o.items = buildUnnamed1146();
+    o.items = buildUnnamed1398();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -507,7 +507,7 @@
 checkZoneViewsList(api.ZoneViewsList o) {
   buildCounterZoneViewsList++;
   if (buildCounterZoneViewsList < 3) {
-    checkUnnamed1146(o.items);
+    checkUnnamed1398(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -515,14 +515,14 @@
   buildCounterZoneViewsList--;
 }
 
-buildUnnamed1147() {
+buildUnnamed1399() {
   var o = new core.List<api.ListResourceResponseItem>();
   o.add(buildListResourceResponseItem());
   o.add(buildListResourceResponseItem());
   return o;
 }
 
-checkUnnamed1147(core.List<api.ListResourceResponseItem> o) {
+checkUnnamed1399(core.List<api.ListResourceResponseItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkListResourceResponseItem(o[0]);
   checkListResourceResponseItem(o[1]);
@@ -533,7 +533,7 @@
   var o = new api.ZoneViewsListResourcesResponse();
   buildCounterZoneViewsListResourcesResponse++;
   if (buildCounterZoneViewsListResourcesResponse < 3) {
-    o.items = buildUnnamed1147();
+    o.items = buildUnnamed1399();
     o.network = "foo";
     o.nextPageToken = "foo";
   }
@@ -544,21 +544,21 @@
 checkZoneViewsListResourcesResponse(api.ZoneViewsListResourcesResponse o) {
   buildCounterZoneViewsListResourcesResponse++;
   if (buildCounterZoneViewsListResourcesResponse < 3) {
-    checkUnnamed1147(o.items);
+    checkUnnamed1399(o.items);
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterZoneViewsListResourcesResponse--;
 }
 
-buildUnnamed1148() {
+buildUnnamed1400() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1148(core.List<core.String> o) {
+checkUnnamed1400(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -569,7 +569,7 @@
   var o = new api.ZoneViewsRemoveResourcesRequest();
   buildCounterZoneViewsRemoveResourcesRequest++;
   if (buildCounterZoneViewsRemoveResourcesRequest < 3) {
-    o.resources = buildUnnamed1148();
+    o.resources = buildUnnamed1400();
   }
   buildCounterZoneViewsRemoveResourcesRequest--;
   return o;
@@ -578,19 +578,19 @@
 checkZoneViewsRemoveResourcesRequest(api.ZoneViewsRemoveResourcesRequest o) {
   buildCounterZoneViewsRemoveResourcesRequest++;
   if (buildCounterZoneViewsRemoveResourcesRequest < 3) {
-    checkUnnamed1148(o.resources);
+    checkUnnamed1400(o.resources);
   }
   buildCounterZoneViewsRemoveResourcesRequest--;
 }
 
-buildUnnamed1149() {
+buildUnnamed1401() {
   var o = new core.List<api.ServiceEndpoint>();
   o.add(buildServiceEndpoint());
   o.add(buildServiceEndpoint());
   return o;
 }
 
-checkUnnamed1149(core.List<api.ServiceEndpoint> o) {
+checkUnnamed1401(core.List<api.ServiceEndpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceEndpoint(o[0]);
   checkServiceEndpoint(o[1]);
@@ -601,7 +601,7 @@
   var o = new api.ZoneViewsSetServiceRequest();
   buildCounterZoneViewsSetServiceRequest++;
   if (buildCounterZoneViewsSetServiceRequest < 3) {
-    o.endpoints = buildUnnamed1149();
+    o.endpoints = buildUnnamed1401();
     o.fingerprint = "foo";
     o.resourceName = "foo";
   }
@@ -612,7 +612,7 @@
 checkZoneViewsSetServiceRequest(api.ZoneViewsSetServiceRequest o) {
   buildCounterZoneViewsSetServiceRequest++;
   if (buildCounterZoneViewsSetServiceRequest < 3) {
-    checkUnnamed1149(o.endpoints);
+    checkUnnamed1401(o.endpoints);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     unittest.expect(o.resourceName, unittest.equals('foo'));
   }
diff --git a/generated/googleapis_beta/test/sqladmin/v1beta3_test.dart b/generated/googleapis_beta/test/sqladmin/v1beta3_test.dart
index 7a90e66..16ddaef 100644
--- a/generated/googleapis_beta/test/sqladmin/v1beta3_test.dart
+++ b/generated/googleapis_beta/test/sqladmin/v1beta3_test.dart
@@ -78,14 +78,14 @@
   buildCounterBackupRun--;
 }
 
-buildUnnamed1109() {
+buildUnnamed1402() {
   var o = new core.List<api.BackupRun>();
   o.add(buildBackupRun());
   o.add(buildBackupRun());
   return o;
 }
 
-checkUnnamed1109(core.List<api.BackupRun> o) {
+checkUnnamed1402(core.List<api.BackupRun> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackupRun(o[0]);
   checkBackupRun(o[1]);
@@ -96,7 +96,7 @@
   var o = new api.BackupRunsListResponse();
   buildCounterBackupRunsListResponse++;
   if (buildCounterBackupRunsListResponse < 3) {
-    o.items = buildUnnamed1109();
+    o.items = buildUnnamed1402();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -107,7 +107,7 @@
 checkBackupRunsListResponse(api.BackupRunsListResponse o) {
   buildCounterBackupRunsListResponse++;
   if (buildCounterBackupRunsListResponse < 3) {
-    checkUnnamed1109(o.items);
+    checkUnnamed1402(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -183,27 +183,27 @@
   buildCounterDatabaseFlags--;
 }
 
-buildUnnamed1110() {
+buildUnnamed1403() {
   var o = new core.List<api.IpMapping>();
   o.add(buildIpMapping());
   o.add(buildIpMapping());
   return o;
 }
 
-checkUnnamed1110(core.List<api.IpMapping> o) {
+checkUnnamed1403(core.List<api.IpMapping> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkIpMapping(o[0]);
   checkIpMapping(o[1]);
 }
 
-buildUnnamed1111() {
+buildUnnamed1404() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1111(core.List<core.String> 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'));
@@ -219,13 +219,14 @@
     o.etag = "foo";
     o.instance = "foo";
     o.instanceType = "foo";
-    o.ipAddresses = buildUnnamed1110();
+    o.ipAddresses = buildUnnamed1403();
+    o.ipv6Address = "foo";
     o.kind = "foo";
     o.masterInstanceName = "foo";
     o.maxDiskSize = "foo";
     o.project = "foo";
     o.region = "foo";
-    o.replicaNames = buildUnnamed1111();
+    o.replicaNames = buildUnnamed1404();
     o.serverCaCert = buildSslCert();
     o.settings = buildSettings();
     o.state = "foo";
@@ -242,13 +243,14 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.instance, unittest.equals('foo'));
     unittest.expect(o.instanceType, unittest.equals('foo'));
-    checkUnnamed1110(o.ipAddresses);
+    checkUnnamed1403(o.ipAddresses);
+    unittest.expect(o.ipv6Address, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.masterInstanceName, unittest.equals('foo'));
     unittest.expect(o.maxDiskSize, unittest.equals('foo'));
     unittest.expect(o.project, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
-    checkUnnamed1111(o.replicaNames);
+    checkUnnamed1404(o.replicaNames);
     checkSslCert(o.serverCaCert);
     checkSettings(o.settings);
     unittest.expect(o.state, unittest.equals('foo'));
@@ -256,27 +258,27 @@
   buildCounterDatabaseInstance--;
 }
 
-buildUnnamed1112() {
+buildUnnamed1405() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1112(core.List<core.String> 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'));
 }
 
-buildUnnamed1113() {
+buildUnnamed1406() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1113(core.List<core.String> o) {
+checkUnnamed1406(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -287,9 +289,9 @@
   var o = new api.ExportContext();
   buildCounterExportContext++;
   if (buildCounterExportContext < 3) {
-    o.database = buildUnnamed1112();
+    o.database = buildUnnamed1405();
     o.kind = "foo";
-    o.table = buildUnnamed1113();
+    o.table = buildUnnamed1406();
     o.uri = "foo";
   }
   buildCounterExportContext--;
@@ -299,35 +301,35 @@
 checkExportContext(api.ExportContext o) {
   buildCounterExportContext++;
   if (buildCounterExportContext < 3) {
-    checkUnnamed1112(o.database);
+    checkUnnamed1405(o.database);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1113(o.table);
+    checkUnnamed1406(o.table);
     unittest.expect(o.uri, unittest.equals('foo'));
   }
   buildCounterExportContext--;
 }
 
-buildUnnamed1114() {
+buildUnnamed1407() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1114(core.List<core.String> o) {
+checkUnnamed1407(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1115() {
+buildUnnamed1408() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1115(core.List<core.String> o) {
+checkUnnamed1408(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -338,8 +340,8 @@
   var o = new api.Flag();
   buildCounterFlag++;
   if (buildCounterFlag < 3) {
-    o.allowedStringValues = buildUnnamed1114();
-    o.appliesTo = buildUnnamed1115();
+    o.allowedStringValues = buildUnnamed1407();
+    o.appliesTo = buildUnnamed1408();
     o.kind = "foo";
     o.maxValue = "foo";
     o.minValue = "foo";
@@ -353,8 +355,8 @@
 checkFlag(api.Flag o) {
   buildCounterFlag++;
   if (buildCounterFlag < 3) {
-    checkUnnamed1114(o.allowedStringValues);
-    checkUnnamed1115(o.appliesTo);
+    checkUnnamed1407(o.allowedStringValues);
+    checkUnnamed1408(o.appliesTo);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.maxValue, unittest.equals('foo'));
     unittest.expect(o.minValue, unittest.equals('foo'));
@@ -364,14 +366,14 @@
   buildCounterFlag--;
 }
 
-buildUnnamed1116() {
+buildUnnamed1409() {
   var o = new core.List<api.Flag>();
   o.add(buildFlag());
   o.add(buildFlag());
   return o;
 }
 
-checkUnnamed1116(core.List<api.Flag> o) {
+checkUnnamed1409(core.List<api.Flag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFlag(o[0]);
   checkFlag(o[1]);
@@ -382,7 +384,7 @@
   var o = new api.FlagsListResponse();
   buildCounterFlagsListResponse++;
   if (buildCounterFlagsListResponse < 3) {
-    o.items = buildUnnamed1116();
+    o.items = buildUnnamed1409();
     o.kind = "foo";
   }
   buildCounterFlagsListResponse--;
@@ -392,20 +394,20 @@
 checkFlagsListResponse(api.FlagsListResponse o) {
   buildCounterFlagsListResponse++;
   if (buildCounterFlagsListResponse < 3) {
-    checkUnnamed1116(o.items);
+    checkUnnamed1409(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterFlagsListResponse--;
 }
 
-buildUnnamed1117() {
+buildUnnamed1410() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1117(core.List<core.String> o) {
+checkUnnamed1410(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -418,7 +420,7 @@
   if (buildCounterImportContext < 3) {
     o.database = "foo";
     o.kind = "foo";
-    o.uri = buildUnnamed1117();
+    o.uri = buildUnnamed1410();
   }
   buildCounterImportContext--;
   return o;
@@ -429,19 +431,19 @@
   if (buildCounterImportContext < 3) {
     unittest.expect(o.database, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1117(o.uri);
+    checkUnnamed1410(o.uri);
   }
   buildCounterImportContext--;
 }
 
-buildUnnamed1118() {
+buildUnnamed1411() {
   var o = new core.List<api.OperationError>();
   o.add(buildOperationError());
   o.add(buildOperationError());
   return o;
 }
 
-checkUnnamed1118(core.List<api.OperationError> o) {
+checkUnnamed1411(core.List<api.OperationError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationError(o[0]);
   checkOperationError(o[1]);
@@ -454,7 +456,7 @@
   if (buildCounterInstanceOperation < 3) {
     o.endTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.enqueuedTime = core.DateTime.parse("2002-02-27T14:01:02");
-    o.error = buildUnnamed1118();
+    o.error = buildUnnamed1411();
     o.exportContext = buildExportContext();
     o.importContext = buildImportContext();
     o.instance = "foo";
@@ -474,7 +476,7 @@
   if (buildCounterInstanceOperation < 3) {
     unittest.expect(o.endTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.enqueuedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed1118(o.error);
+    checkUnnamed1411(o.error);
     checkExportContext(o.exportContext);
     checkImportContext(o.importContext);
     unittest.expect(o.instance, unittest.equals('foo'));
@@ -669,14 +671,14 @@
   buildCounterInstancesInsertResponse--;
 }
 
-buildUnnamed1119() {
+buildUnnamed1412() {
   var o = new core.List<api.DatabaseInstance>();
   o.add(buildDatabaseInstance());
   o.add(buildDatabaseInstance());
   return o;
 }
 
-checkUnnamed1119(core.List<api.DatabaseInstance> o) {
+checkUnnamed1412(core.List<api.DatabaseInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatabaseInstance(o[0]);
   checkDatabaseInstance(o[1]);
@@ -687,7 +689,7 @@
   var o = new api.InstancesListResponse();
   buildCounterInstancesListResponse++;
   if (buildCounterInstancesListResponse < 3) {
-    o.items = buildUnnamed1119();
+    o.items = buildUnnamed1412();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -698,7 +700,7 @@
 checkInstancesListResponse(api.InstancesListResponse o) {
   buildCounterInstancesListResponse++;
   if (buildCounterInstancesListResponse < 3) {
-    checkUnnamed1119(o.items);
+    checkUnnamed1412(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -831,14 +833,14 @@
   buildCounterInstancesUpdateResponse--;
 }
 
-buildUnnamed1120() {
+buildUnnamed1413() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1120(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'));
@@ -849,8 +851,9 @@
   var o = new api.IpConfiguration();
   buildCounterIpConfiguration++;
   if (buildCounterIpConfiguration < 3) {
-    o.authorizedNetworks = buildUnnamed1120();
+    o.authorizedNetworks = buildUnnamed1413();
     o.enabled = true;
+    o.kind = "foo";
     o.requireSsl = true;
   }
   buildCounterIpConfiguration--;
@@ -860,8 +863,9 @@
 checkIpConfiguration(api.IpConfiguration o) {
   buildCounterIpConfiguration++;
   if (buildCounterIpConfiguration < 3) {
-    checkUnnamed1120(o.authorizedNetworks);
+    checkUnnamed1413(o.authorizedNetworks);
     unittest.expect(o.enabled, unittest.isTrue);
+    unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.requireSsl, unittest.isTrue);
   }
   buildCounterIpConfiguration--;
@@ -932,14 +936,14 @@
   buildCounterOperationError--;
 }
 
-buildUnnamed1121() {
+buildUnnamed1414() {
   var o = new core.List<api.InstanceOperation>();
   o.add(buildInstanceOperation());
   o.add(buildInstanceOperation());
   return o;
 }
 
-checkUnnamed1121(core.List<api.InstanceOperation> o) {
+checkUnnamed1414(core.List<api.InstanceOperation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceOperation(o[0]);
   checkInstanceOperation(o[1]);
@@ -950,7 +954,7 @@
   var o = new api.OperationsListResponse();
   buildCounterOperationsListResponse++;
   if (buildCounterOperationsListResponse < 3) {
-    o.items = buildUnnamed1121();
+    o.items = buildUnnamed1414();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -961,7 +965,7 @@
 checkOperationsListResponse(api.OperationsListResponse o) {
   buildCounterOperationsListResponse++;
   if (buildCounterOperationsListResponse < 3) {
-    checkUnnamed1121(o.items);
+    checkUnnamed1414(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -989,40 +993,40 @@
   buildCounterSetRootPasswordContext--;
 }
 
-buildUnnamed1122() {
+buildUnnamed1415() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1122(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'));
 }
 
-buildUnnamed1123() {
+buildUnnamed1416() {
   var o = new core.List<api.BackupConfiguration>();
   o.add(buildBackupConfiguration());
   o.add(buildBackupConfiguration());
   return o;
 }
 
-checkUnnamed1123(core.List<api.BackupConfiguration> o) {
+checkUnnamed1416(core.List<api.BackupConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackupConfiguration(o[0]);
   checkBackupConfiguration(o[1]);
 }
 
-buildUnnamed1124() {
+buildUnnamed1417() {
   var o = new core.List<api.DatabaseFlags>();
   o.add(buildDatabaseFlags());
   o.add(buildDatabaseFlags());
   return o;
 }
 
-checkUnnamed1124(core.List<api.DatabaseFlags> o) {
+checkUnnamed1417(core.List<api.DatabaseFlags> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatabaseFlags(o[0]);
   checkDatabaseFlags(o[1]);
@@ -1034,9 +1038,9 @@
   buildCounterSettings++;
   if (buildCounterSettings < 3) {
     o.activationPolicy = "foo";
-    o.authorizedGaeApplications = buildUnnamed1122();
-    o.backupConfiguration = buildUnnamed1123();
-    o.databaseFlags = buildUnnamed1124();
+    o.authorizedGaeApplications = buildUnnamed1415();
+    o.backupConfiguration = buildUnnamed1416();
+    o.databaseFlags = buildUnnamed1417();
     o.databaseReplicationEnabled = true;
     o.ipConfiguration = buildIpConfiguration();
     o.kind = "foo";
@@ -1054,9 +1058,9 @@
   buildCounterSettings++;
   if (buildCounterSettings < 3) {
     unittest.expect(o.activationPolicy, unittest.equals('foo'));
-    checkUnnamed1122(o.authorizedGaeApplications);
-    checkUnnamed1123(o.backupConfiguration);
-    checkUnnamed1124(o.databaseFlags);
+    checkUnnamed1415(o.authorizedGaeApplications);
+    checkUnnamed1416(o.backupConfiguration);
+    checkUnnamed1417(o.databaseFlags);
     unittest.expect(o.databaseReplicationEnabled, unittest.isTrue);
     checkIpConfiguration(o.ipConfiguration);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -1186,14 +1190,14 @@
   buildCounterSslCertsInsertResponse--;
 }
 
-buildUnnamed1125() {
+buildUnnamed1418() {
   var o = new core.List<api.SslCert>();
   o.add(buildSslCert());
   o.add(buildSslCert());
   return o;
 }
 
-checkUnnamed1125(core.List<api.SslCert> o) {
+checkUnnamed1418(core.List<api.SslCert> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSslCert(o[0]);
   checkSslCert(o[1]);
@@ -1204,7 +1208,7 @@
   var o = new api.SslCertsListResponse();
   buildCounterSslCertsListResponse++;
   if (buildCounterSslCertsListResponse < 3) {
-    o.items = buildUnnamed1125();
+    o.items = buildUnnamed1418();
     o.kind = "foo";
   }
   buildCounterSslCertsListResponse--;
@@ -1214,20 +1218,20 @@
 checkSslCertsListResponse(api.SslCertsListResponse o) {
   buildCounterSslCertsListResponse++;
   if (buildCounterSslCertsListResponse < 3) {
-    checkUnnamed1125(o.items);
+    checkUnnamed1418(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterSslCertsListResponse--;
 }
 
-buildUnnamed1126() {
+buildUnnamed1419() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1126(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'));
@@ -1241,7 +1245,7 @@
     o.DiskQuota = "foo";
     o.RAM = "foo";
     o.kind = "foo";
-    o.region = buildUnnamed1126();
+    o.region = buildUnnamed1419();
     o.tier = "foo";
   }
   buildCounterTier--;
@@ -1254,20 +1258,20 @@
     unittest.expect(o.DiskQuota, unittest.equals('foo'));
     unittest.expect(o.RAM, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1126(o.region);
+    checkUnnamed1419(o.region);
     unittest.expect(o.tier, unittest.equals('foo'));
   }
   buildCounterTier--;
 }
 
-buildUnnamed1127() {
+buildUnnamed1420() {
   var o = new core.List<api.Tier>();
   o.add(buildTier());
   o.add(buildTier());
   return o;
 }
 
-checkUnnamed1127(core.List<api.Tier> o) {
+checkUnnamed1420(core.List<api.Tier> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTier(o[0]);
   checkTier(o[1]);
@@ -1278,7 +1282,7 @@
   var o = new api.TiersListResponse();
   buildCounterTiersListResponse++;
   if (buildCounterTiersListResponse < 3) {
-    o.items = buildUnnamed1127();
+    o.items = buildUnnamed1420();
     o.kind = "foo";
   }
   buildCounterTiersListResponse--;
@@ -1288,7 +1292,7 @@
 checkTiersListResponse(api.TiersListResponse o) {
   buildCounterTiersListResponse++;
   if (buildCounterTiersListResponse < 3) {
-    checkUnnamed1127(o.items);
+    checkUnnamed1420(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTiersListResponse--;
diff --git a/generated/googleapis_beta/test/taskqueue/v1beta2_test.dart b/generated/googleapis_beta/test/taskqueue/v1beta2_test.dart
index 3061855..05445ec 100644
--- a/generated/googleapis_beta/test/taskqueue/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/taskqueue/v1beta2_test.dart
@@ -49,40 +49,40 @@
   buildCounterTask--;
 }
 
-buildUnnamed1168() {
+buildUnnamed1421() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1168(core.List<core.String> o) {
+checkUnnamed1421(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1169() {
+buildUnnamed1422() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1169(core.List<core.String> o) {
+checkUnnamed1422(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1170() {
+buildUnnamed1423() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1170(core.List<core.String> o) {
+checkUnnamed1423(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -93,9 +93,9 @@
   var o = new api.TaskQueueAcl();
   buildCounterTaskQueueAcl++;
   if (buildCounterTaskQueueAcl < 3) {
-    o.adminEmails = buildUnnamed1168();
-    o.consumerEmails = buildUnnamed1169();
-    o.producerEmails = buildUnnamed1170();
+    o.adminEmails = buildUnnamed1421();
+    o.consumerEmails = buildUnnamed1422();
+    o.producerEmails = buildUnnamed1423();
   }
   buildCounterTaskQueueAcl--;
   return o;
@@ -104,9 +104,9 @@
 checkTaskQueueAcl(api.TaskQueueAcl o) {
   buildCounterTaskQueueAcl++;
   if (buildCounterTaskQueueAcl < 3) {
-    checkUnnamed1168(o.adminEmails);
-    checkUnnamed1169(o.consumerEmails);
-    checkUnnamed1170(o.producerEmails);
+    checkUnnamed1421(o.adminEmails);
+    checkUnnamed1422(o.consumerEmails);
+    checkUnnamed1423(o.producerEmails);
   }
   buildCounterTaskQueueAcl--;
 }
@@ -163,14 +163,14 @@
   buildCounterTaskQueue--;
 }
 
-buildUnnamed1171() {
+buildUnnamed1424() {
   var o = new core.List<api.Task>();
   o.add(buildTask());
   o.add(buildTask());
   return o;
 }
 
-checkUnnamed1171(core.List<api.Task> o) {
+checkUnnamed1424(core.List<api.Task> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTask(o[0]);
   checkTask(o[1]);
@@ -181,7 +181,7 @@
   var o = new api.Tasks();
   buildCounterTasks++;
   if (buildCounterTasks < 3) {
-    o.items = buildUnnamed1171();
+    o.items = buildUnnamed1424();
     o.kind = "foo";
   }
   buildCounterTasks--;
@@ -191,20 +191,20 @@
 checkTasks(api.Tasks o) {
   buildCounterTasks++;
   if (buildCounterTasks < 3) {
-    checkUnnamed1171(o.items);
+    checkUnnamed1424(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTasks--;
 }
 
-buildUnnamed1172() {
+buildUnnamed1425() {
   var o = new core.List<api.Task>();
   o.add(buildTask());
   o.add(buildTask());
   return o;
 }
 
-checkUnnamed1172(core.List<api.Task> o) {
+checkUnnamed1425(core.List<api.Task> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTask(o[0]);
   checkTask(o[1]);
@@ -215,7 +215,7 @@
   var o = new api.Tasks2();
   buildCounterTasks2++;
   if (buildCounterTasks2 < 3) {
-    o.items = buildUnnamed1172();
+    o.items = buildUnnamed1425();
     o.kind = "foo";
   }
   buildCounterTasks2--;
@@ -225,7 +225,7 @@
 checkTasks2(api.Tasks2 o) {
   buildCounterTasks2++;
   if (buildCounterTasks2 < 3) {
-    checkUnnamed1172(o.items);
+    checkUnnamed1425(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTasks2--;
diff --git a/pubspec.lock b/pubspec.lock
index 1a3c3c2..354d334 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -43,7 +43,7 @@
   string_scanner:
     description: string_scanner
     source: hosted
-    version: "0.1.0"
+    version: "0.1.1"
   yaml:
     description: yaml
     source: hosted
diff --git a/resources/googleapis/CHANGELOG.md b/resources/googleapis/CHANGELOG.md
index 5aea4eb..6a934a1 100644
--- a/resources/googleapis/CHANGELOG.md
+++ b/resources/googleapis/CHANGELOG.md
@@ -1,3 +1,21 @@
+## 0.4.0
+
+* [apis-new] fitness:v1: API added
+* [apis-new] tagmanager:v1: API added
+* [apis] adexchangebuyer:v1.3: schema changes
+* [apis] calendar:v3: schema changes
+* [apis] civicinfo:us_v1: schema changes
+* [apis] civicinfo:v1: schema changes
+* [apis] civicinfo:v2: schema changes
+* [apis] compute:v1: schema changes
+* [apis] content:v2: schema/method changes
+* [apis] drive:v2: schema/method changes
+* [apis] games:v1: schema changes
+* [apis] gamesManagement:v1management: schema/method changes
+* [apis] gmail:v1: method changes
+* [apis] mapsengine:v1: schema changes
+* [apis-breaking] prediction:v1.6: String -> double change
+
 ## 0.3.1
 
 * [apis] admin_directory:v1: additional schema/methods
diff --git a/resources/googleapis_beta/CHANGELOG.md b/resources/googleapis_beta/CHANGELOG.md
index 7e49e42..04fc182 100644
--- a/resources/googleapis_beta/CHANGELOG.md
+++ b/resources/googleapis_beta/CHANGELOG.md
@@ -1,3 +1,14 @@
+## 0.5.0
+
+* [apis-new] container:v1beta1: API added
+* [apis-new] genomics:v1beta2: API added
+* [apis-new] replicapool:v1beta2: API added
+* [apis-new] replicapoolupdater:v1beta1: API added
+* [apis] autoscaler:v1beta2: additional schemas/methods
+* [apis] qladmin:v1beta3: schema changes
+* [apis-breaking] genomics:v1beta: removed methods
+* [apis-removed] replicapool:v1beta1: removed (Deprecated)
+
 ## 0.4.0
 
 * [apis] cloudmonitoring:v2beta1: additional schemas/methods
