// Copyright 2022 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/
(function(global, factory) { /* global define, require, module */

    /* AMD */ if (typeof define === 'function' && define.amd)
        define(["protobufjs/minimal"], factory);

    /* CommonJS */ else if (typeof require === 'function' && typeof module === 'object' && module && module.exports)
        module.exports = factory(require("google-gax").protobufMinimal);

})(this, function($protobuf) {
    "use strict";

    // Common aliases
    var $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util;
    
    // Exported root namespace
    var $root = $protobuf.roots._google_cloud_logging_protos || ($protobuf.roots._google_cloud_logging_protos = {});
    
    $root.google = (function() {
    
        /**
         * Namespace google.
         * @exports google
         * @namespace
         */
        var google = {};
    
        google.protobuf = (function() {
    
            /**
             * Namespace protobuf.
             * @memberof google
             * @namespace
             */
            var protobuf = {};
    
            protobuf.Duration = (function() {
    
                /**
                 * Properties of a Duration.
                 * @memberof google.protobuf
                 * @interface IDuration
                 * @property {number|Long|null} [seconds] Duration seconds
                 * @property {number|null} [nanos] Duration nanos
                 */
    
                /**
                 * Constructs a new Duration.
                 * @memberof google.protobuf
                 * @classdesc Represents a Duration.
                 * @implements IDuration
                 * @constructor
                 * @param {google.protobuf.IDuration=} [properties] Properties to set
                 */
                function Duration(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * Duration seconds.
                 * @member {number|Long} seconds
                 * @memberof google.protobuf.Duration
                 * @instance
                 */
                Duration.prototype.seconds = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                /**
                 * Duration nanos.
                 * @member {number} nanos
                 * @memberof google.protobuf.Duration
                 * @instance
                 */
                Duration.prototype.nanos = 0;
    
                /**
                 * Creates a new Duration instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.Duration
                 * @static
                 * @param {google.protobuf.IDuration=} [properties] Properties to set
                 * @returns {google.protobuf.Duration} Duration instance
                 */
                Duration.create = function create(properties) {
                    return new Duration(properties);
                };
    
                /**
                 * Encodes the specified Duration message. Does not implicitly {@link google.protobuf.Duration.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.Duration
                 * @static
                 * @param {google.protobuf.IDuration} message Duration message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Duration.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.seconds != null && Object.hasOwnProperty.call(message, "seconds"))
                        writer.uint32(/* id 1, wireType 0 =*/8).int64(message.seconds);
                    if (message.nanos != null && Object.hasOwnProperty.call(message, "nanos"))
                        writer.uint32(/* id 2, wireType 0 =*/16).int32(message.nanos);
                    return writer;
                };
    
                /**
                 * Encodes the specified Duration message, length delimited. Does not implicitly {@link google.protobuf.Duration.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.Duration
                 * @static
                 * @param {google.protobuf.IDuration} message Duration message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Duration.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a Duration message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.Duration
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.Duration} Duration
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Duration.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.Duration();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.seconds = reader.int64();
                            break;
                        case 2:
                            message.nanos = reader.int32();
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a Duration message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.Duration
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.Duration} Duration
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Duration.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a Duration message.
                 * @function verify
                 * @memberof google.protobuf.Duration
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                Duration.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.seconds != null && message.hasOwnProperty("seconds"))
                        if (!$util.isInteger(message.seconds) && !(message.seconds && $util.isInteger(message.seconds.low) && $util.isInteger(message.seconds.high)))
                            return "seconds: integer|Long expected";
                    if (message.nanos != null && message.hasOwnProperty("nanos"))
                        if (!$util.isInteger(message.nanos))
                            return "nanos: integer expected";
                    return null;
                };
    
                /**
                 * Creates a Duration message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.Duration
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.Duration} Duration
                 */
                Duration.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.Duration)
                        return object;
                    var message = new $root.google.protobuf.Duration();
                    if (object.seconds != null)
                        if ($util.Long)
                            (message.seconds = $util.Long.fromValue(object.seconds)).unsigned = false;
                        else if (typeof object.seconds === "string")
                            message.seconds = parseInt(object.seconds, 10);
                        else if (typeof object.seconds === "number")
                            message.seconds = object.seconds;
                        else if (typeof object.seconds === "object")
                            message.seconds = new $util.LongBits(object.seconds.low >>> 0, object.seconds.high >>> 0).toNumber();
                    if (object.nanos != null)
                        message.nanos = object.nanos | 0;
                    return message;
                };
    
                /**
                 * Creates a plain object from a Duration message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.Duration
                 * @static
                 * @param {google.protobuf.Duration} message Duration
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                Duration.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        if ($util.Long) {
                            var long = new $util.Long(0, 0, false);
                            object.seconds = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                        } else
                            object.seconds = options.longs === String ? "0" : 0;
                        object.nanos = 0;
                    }
                    if (message.seconds != null && message.hasOwnProperty("seconds"))
                        if (typeof message.seconds === "number")
                            object.seconds = options.longs === String ? String(message.seconds) : message.seconds;
                        else
                            object.seconds = options.longs === String ? $util.Long.prototype.toString.call(message.seconds) : options.longs === Number ? new $util.LongBits(message.seconds.low >>> 0, message.seconds.high >>> 0).toNumber() : message.seconds;
                    if (message.nanos != null && message.hasOwnProperty("nanos"))
                        object.nanos = message.nanos;
                    return object;
                };
    
                /**
                 * Converts this Duration to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.Duration
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                Duration.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return Duration;
            })();
    
            protobuf.FileDescriptorSet = (function() {
    
                /**
                 * Properties of a FileDescriptorSet.
                 * @memberof google.protobuf
                 * @interface IFileDescriptorSet
                 * @property {Array.<google.protobuf.IFileDescriptorProto>|null} [file] FileDescriptorSet file
                 */
    
                /**
                 * Constructs a new FileDescriptorSet.
                 * @memberof google.protobuf
                 * @classdesc Represents a FileDescriptorSet.
                 * @implements IFileDescriptorSet
                 * @constructor
                 * @param {google.protobuf.IFileDescriptorSet=} [properties] Properties to set
                 */
                function FileDescriptorSet(properties) {
                    this.file = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * FileDescriptorSet file.
                 * @member {Array.<google.protobuf.IFileDescriptorProto>} file
                 * @memberof google.protobuf.FileDescriptorSet
                 * @instance
                 */
                FileDescriptorSet.prototype.file = $util.emptyArray;
    
                /**
                 * Creates a new FileDescriptorSet instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.FileDescriptorSet
                 * @static
                 * @param {google.protobuf.IFileDescriptorSet=} [properties] Properties to set
                 * @returns {google.protobuf.FileDescriptorSet} FileDescriptorSet instance
                 */
                FileDescriptorSet.create = function create(properties) {
                    return new FileDescriptorSet(properties);
                };
    
                /**
                 * Encodes the specified FileDescriptorSet message. Does not implicitly {@link google.protobuf.FileDescriptorSet.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.FileDescriptorSet
                 * @static
                 * @param {google.protobuf.IFileDescriptorSet} message FileDescriptorSet message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FileDescriptorSet.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.file != null && message.file.length)
                        for (var i = 0; i < message.file.length; ++i)
                            $root.google.protobuf.FileDescriptorProto.encode(message.file[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified FileDescriptorSet message, length delimited. Does not implicitly {@link google.protobuf.FileDescriptorSet.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.FileDescriptorSet
                 * @static
                 * @param {google.protobuf.IFileDescriptorSet} message FileDescriptorSet message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FileDescriptorSet.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a FileDescriptorSet message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.FileDescriptorSet
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.FileDescriptorSet} FileDescriptorSet
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FileDescriptorSet.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.FileDescriptorSet();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            if (!(message.file && message.file.length))
                                message.file = [];
                            message.file.push($root.google.protobuf.FileDescriptorProto.decode(reader, reader.uint32()));
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a FileDescriptorSet message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.FileDescriptorSet
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.FileDescriptorSet} FileDescriptorSet
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FileDescriptorSet.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a FileDescriptorSet message.
                 * @function verify
                 * @memberof google.protobuf.FileDescriptorSet
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                FileDescriptorSet.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.file != null && message.hasOwnProperty("file")) {
                        if (!Array.isArray(message.file))
                            return "file: array expected";
                        for (var i = 0; i < message.file.length; ++i) {
                            var error = $root.google.protobuf.FileDescriptorProto.verify(message.file[i]);
                            if (error)
                                return "file." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates a FileDescriptorSet message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.FileDescriptorSet
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.FileDescriptorSet} FileDescriptorSet
                 */
                FileDescriptorSet.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.FileDescriptorSet)
                        return object;
                    var message = new $root.google.protobuf.FileDescriptorSet();
                    if (object.file) {
                        if (!Array.isArray(object.file))
                            throw TypeError(".google.protobuf.FileDescriptorSet.file: array expected");
                        message.file = [];
                        for (var i = 0; i < object.file.length; ++i) {
                            if (typeof object.file[i] !== "object")
                                throw TypeError(".google.protobuf.FileDescriptorSet.file: object expected");
                            message.file[i] = $root.google.protobuf.FileDescriptorProto.fromObject(object.file[i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a FileDescriptorSet message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.FileDescriptorSet
                 * @static
                 * @param {google.protobuf.FileDescriptorSet} message FileDescriptorSet
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                FileDescriptorSet.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.file = [];
                    if (message.file && message.file.length) {
                        object.file = [];
                        for (var j = 0; j < message.file.length; ++j)
                            object.file[j] = $root.google.protobuf.FileDescriptorProto.toObject(message.file[j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this FileDescriptorSet to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.FileDescriptorSet
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                FileDescriptorSet.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return FileDescriptorSet;
            })();
    
            protobuf.FileDescriptorProto = (function() {
    
                /**
                 * Properties of a FileDescriptorProto.
                 * @memberof google.protobuf
                 * @interface IFileDescriptorProto
                 * @property {string|null} [name] FileDescriptorProto name
                 * @property {string|null} ["package"] FileDescriptorProto package
                 * @property {Array.<string>|null} [dependency] FileDescriptorProto dependency
                 * @property {Array.<number>|null} [publicDependency] FileDescriptorProto publicDependency
                 * @property {Array.<number>|null} [weakDependency] FileDescriptorProto weakDependency
                 * @property {Array.<google.protobuf.IDescriptorProto>|null} [messageType] FileDescriptorProto messageType
                 * @property {Array.<google.protobuf.IEnumDescriptorProto>|null} [enumType] FileDescriptorProto enumType
                 * @property {Array.<google.protobuf.IServiceDescriptorProto>|null} [service] FileDescriptorProto service
                 * @property {Array.<google.protobuf.IFieldDescriptorProto>|null} [extension] FileDescriptorProto extension
                 * @property {google.protobuf.IFileOptions|null} [options] FileDescriptorProto options
                 * @property {google.protobuf.ISourceCodeInfo|null} [sourceCodeInfo] FileDescriptorProto sourceCodeInfo
                 * @property {string|null} [syntax] FileDescriptorProto syntax
                 */
    
                /**
                 * Constructs a new FileDescriptorProto.
                 * @memberof google.protobuf
                 * @classdesc Represents a FileDescriptorProto.
                 * @implements IFileDescriptorProto
                 * @constructor
                 * @param {google.protobuf.IFileDescriptorProto=} [properties] Properties to set
                 */
                function FileDescriptorProto(properties) {
                    this.dependency = [];
                    this.publicDependency = [];
                    this.weakDependency = [];
                    this.messageType = [];
                    this.enumType = [];
                    this.service = [];
                    this.extension = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * FileDescriptorProto name.
                 * @member {string} name
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype.name = "";
    
                /**
                 * FileDescriptorProto package.
                 * @member {string} package
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype["package"] = "";
    
                /**
                 * FileDescriptorProto dependency.
                 * @member {Array.<string>} dependency
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype.dependency = $util.emptyArray;
    
                /**
                 * FileDescriptorProto publicDependency.
                 * @member {Array.<number>} publicDependency
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype.publicDependency = $util.emptyArray;
    
                /**
                 * FileDescriptorProto weakDependency.
                 * @member {Array.<number>} weakDependency
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype.weakDependency = $util.emptyArray;
    
                /**
                 * FileDescriptorProto messageType.
                 * @member {Array.<google.protobuf.IDescriptorProto>} messageType
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype.messageType = $util.emptyArray;
    
                /**
                 * FileDescriptorProto enumType.
                 * @member {Array.<google.protobuf.IEnumDescriptorProto>} enumType
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype.enumType = $util.emptyArray;
    
                /**
                 * FileDescriptorProto service.
                 * @member {Array.<google.protobuf.IServiceDescriptorProto>} service
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype.service = $util.emptyArray;
    
                /**
                 * FileDescriptorProto extension.
                 * @member {Array.<google.protobuf.IFieldDescriptorProto>} extension
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype.extension = $util.emptyArray;
    
                /**
                 * FileDescriptorProto options.
                 * @member {google.protobuf.IFileOptions|null|undefined} options
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype.options = null;
    
                /**
                 * FileDescriptorProto sourceCodeInfo.
                 * @member {google.protobuf.ISourceCodeInfo|null|undefined} sourceCodeInfo
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype.sourceCodeInfo = null;
    
                /**
                 * FileDescriptorProto syntax.
                 * @member {string} syntax
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 */
                FileDescriptorProto.prototype.syntax = "";
    
                /**
                 * Creates a new FileDescriptorProto instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.FileDescriptorProto
                 * @static
                 * @param {google.protobuf.IFileDescriptorProto=} [properties] Properties to set
                 * @returns {google.protobuf.FileDescriptorProto} FileDescriptorProto instance
                 */
                FileDescriptorProto.create = function create(properties) {
                    return new FileDescriptorProto(properties);
                };
    
                /**
                 * Encodes the specified FileDescriptorProto message. Does not implicitly {@link google.protobuf.FileDescriptorProto.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.FileDescriptorProto
                 * @static
                 * @param {google.protobuf.IFileDescriptorProto} message FileDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FileDescriptorProto.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    if (message["package"] != null && Object.hasOwnProperty.call(message, "package"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message["package"]);
                    if (message.dependency != null && message.dependency.length)
                        for (var i = 0; i < message.dependency.length; ++i)
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.dependency[i]);
                    if (message.messageType != null && message.messageType.length)
                        for (var i = 0; i < message.messageType.length; ++i)
                            $root.google.protobuf.DescriptorProto.encode(message.messageType[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                    if (message.enumType != null && message.enumType.length)
                        for (var i = 0; i < message.enumType.length; ++i)
                            $root.google.protobuf.EnumDescriptorProto.encode(message.enumType[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                    if (message.service != null && message.service.length)
                        for (var i = 0; i < message.service.length; ++i)
                            $root.google.protobuf.ServiceDescriptorProto.encode(message.service[i], writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                    if (message.extension != null && message.extension.length)
                        for (var i = 0; i < message.extension.length; ++i)
                            $root.google.protobuf.FieldDescriptorProto.encode(message.extension[i], writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
                    if (message.options != null && Object.hasOwnProperty.call(message, "options"))
                        $root.google.protobuf.FileOptions.encode(message.options, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
                    if (message.sourceCodeInfo != null && Object.hasOwnProperty.call(message, "sourceCodeInfo"))
                        $root.google.protobuf.SourceCodeInfo.encode(message.sourceCodeInfo, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();
                    if (message.publicDependency != null && message.publicDependency.length)
                        for (var i = 0; i < message.publicDependency.length; ++i)
                            writer.uint32(/* id 10, wireType 0 =*/80).int32(message.publicDependency[i]);
                    if (message.weakDependency != null && message.weakDependency.length)
                        for (var i = 0; i < message.weakDependency.length; ++i)
                            writer.uint32(/* id 11, wireType 0 =*/88).int32(message.weakDependency[i]);
                    if (message.syntax != null && Object.hasOwnProperty.call(message, "syntax"))
                        writer.uint32(/* id 12, wireType 2 =*/98).string(message.syntax);
                    return writer;
                };
    
                /**
                 * Encodes the specified FileDescriptorProto message, length delimited. Does not implicitly {@link google.protobuf.FileDescriptorProto.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.FileDescriptorProto
                 * @static
                 * @param {google.protobuf.IFileDescriptorProto} message FileDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FileDescriptorProto.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a FileDescriptorProto message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.FileDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.FileDescriptorProto} FileDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FileDescriptorProto.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.FileDescriptorProto();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.name = reader.string();
                            break;
                        case 2:
                            message["package"] = reader.string();
                            break;
                        case 3:
                            if (!(message.dependency && message.dependency.length))
                                message.dependency = [];
                            message.dependency.push(reader.string());
                            break;
                        case 10:
                            if (!(message.publicDependency && message.publicDependency.length))
                                message.publicDependency = [];
                            if ((tag & 7) === 2) {
                                var end2 = reader.uint32() + reader.pos;
                                while (reader.pos < end2)
                                    message.publicDependency.push(reader.int32());
                            } else
                                message.publicDependency.push(reader.int32());
                            break;
                        case 11:
                            if (!(message.weakDependency && message.weakDependency.length))
                                message.weakDependency = [];
                            if ((tag & 7) === 2) {
                                var end2 = reader.uint32() + reader.pos;
                                while (reader.pos < end2)
                                    message.weakDependency.push(reader.int32());
                            } else
                                message.weakDependency.push(reader.int32());
                            break;
                        case 4:
                            if (!(message.messageType && message.messageType.length))
                                message.messageType = [];
                            message.messageType.push($root.google.protobuf.DescriptorProto.decode(reader, reader.uint32()));
                            break;
                        case 5:
                            if (!(message.enumType && message.enumType.length))
                                message.enumType = [];
                            message.enumType.push($root.google.protobuf.EnumDescriptorProto.decode(reader, reader.uint32()));
                            break;
                        case 6:
                            if (!(message.service && message.service.length))
                                message.service = [];
                            message.service.push($root.google.protobuf.ServiceDescriptorProto.decode(reader, reader.uint32()));
                            break;
                        case 7:
                            if (!(message.extension && message.extension.length))
                                message.extension = [];
                            message.extension.push($root.google.protobuf.FieldDescriptorProto.decode(reader, reader.uint32()));
                            break;
                        case 8:
                            message.options = $root.google.protobuf.FileOptions.decode(reader, reader.uint32());
                            break;
                        case 9:
                            message.sourceCodeInfo = $root.google.protobuf.SourceCodeInfo.decode(reader, reader.uint32());
                            break;
                        case 12:
                            message.syntax = reader.string();
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a FileDescriptorProto message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.FileDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.FileDescriptorProto} FileDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FileDescriptorProto.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a FileDescriptorProto message.
                 * @function verify
                 * @memberof google.protobuf.FileDescriptorProto
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                FileDescriptorProto.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    if (message["package"] != null && message.hasOwnProperty("package"))
                        if (!$util.isString(message["package"]))
                            return "package: string expected";
                    if (message.dependency != null && message.hasOwnProperty("dependency")) {
                        if (!Array.isArray(message.dependency))
                            return "dependency: array expected";
                        for (var i = 0; i < message.dependency.length; ++i)
                            if (!$util.isString(message.dependency[i]))
                                return "dependency: string[] expected";
                    }
                    if (message.publicDependency != null && message.hasOwnProperty("publicDependency")) {
                        if (!Array.isArray(message.publicDependency))
                            return "publicDependency: array expected";
                        for (var i = 0; i < message.publicDependency.length; ++i)
                            if (!$util.isInteger(message.publicDependency[i]))
                                return "publicDependency: integer[] expected";
                    }
                    if (message.weakDependency != null && message.hasOwnProperty("weakDependency")) {
                        if (!Array.isArray(message.weakDependency))
                            return "weakDependency: array expected";
                        for (var i = 0; i < message.weakDependency.length; ++i)
                            if (!$util.isInteger(message.weakDependency[i]))
                                return "weakDependency: integer[] expected";
                    }
                    if (message.messageType != null && message.hasOwnProperty("messageType")) {
                        if (!Array.isArray(message.messageType))
                            return "messageType: array expected";
                        for (var i = 0; i < message.messageType.length; ++i) {
                            var error = $root.google.protobuf.DescriptorProto.verify(message.messageType[i]);
                            if (error)
                                return "messageType." + error;
                        }
                    }
                    if (message.enumType != null && message.hasOwnProperty("enumType")) {
                        if (!Array.isArray(message.enumType))
                            return "enumType: array expected";
                        for (var i = 0; i < message.enumType.length; ++i) {
                            var error = $root.google.protobuf.EnumDescriptorProto.verify(message.enumType[i]);
                            if (error)
                                return "enumType." + error;
                        }
                    }
                    if (message.service != null && message.hasOwnProperty("service")) {
                        if (!Array.isArray(message.service))
                            return "service: array expected";
                        for (var i = 0; i < message.service.length; ++i) {
                            var error = $root.google.protobuf.ServiceDescriptorProto.verify(message.service[i]);
                            if (error)
                                return "service." + error;
                        }
                    }
                    if (message.extension != null && message.hasOwnProperty("extension")) {
                        if (!Array.isArray(message.extension))
                            return "extension: array expected";
                        for (var i = 0; i < message.extension.length; ++i) {
                            var error = $root.google.protobuf.FieldDescriptorProto.verify(message.extension[i]);
                            if (error)
                                return "extension." + error;
                        }
                    }
                    if (message.options != null && message.hasOwnProperty("options")) {
                        var error = $root.google.protobuf.FileOptions.verify(message.options);
                        if (error)
                            return "options." + error;
                    }
                    if (message.sourceCodeInfo != null && message.hasOwnProperty("sourceCodeInfo")) {
                        var error = $root.google.protobuf.SourceCodeInfo.verify(message.sourceCodeInfo);
                        if (error)
                            return "sourceCodeInfo." + error;
                    }
                    if (message.syntax != null && message.hasOwnProperty("syntax"))
                        if (!$util.isString(message.syntax))
                            return "syntax: string expected";
                    return null;
                };
    
                /**
                 * Creates a FileDescriptorProto message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.FileDescriptorProto
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.FileDescriptorProto} FileDescriptorProto
                 */
                FileDescriptorProto.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.FileDescriptorProto)
                        return object;
                    var message = new $root.google.protobuf.FileDescriptorProto();
                    if (object.name != null)
                        message.name = String(object.name);
                    if (object["package"] != null)
                        message["package"] = String(object["package"]);
                    if (object.dependency) {
                        if (!Array.isArray(object.dependency))
                            throw TypeError(".google.protobuf.FileDescriptorProto.dependency: array expected");
                        message.dependency = [];
                        for (var i = 0; i < object.dependency.length; ++i)
                            message.dependency[i] = String(object.dependency[i]);
                    }
                    if (object.publicDependency) {
                        if (!Array.isArray(object.publicDependency))
                            throw TypeError(".google.protobuf.FileDescriptorProto.publicDependency: array expected");
                        message.publicDependency = [];
                        for (var i = 0; i < object.publicDependency.length; ++i)
                            message.publicDependency[i] = object.publicDependency[i] | 0;
                    }
                    if (object.weakDependency) {
                        if (!Array.isArray(object.weakDependency))
                            throw TypeError(".google.protobuf.FileDescriptorProto.weakDependency: array expected");
                        message.weakDependency = [];
                        for (var i = 0; i < object.weakDependency.length; ++i)
                            message.weakDependency[i] = object.weakDependency[i] | 0;
                    }
                    if (object.messageType) {
                        if (!Array.isArray(object.messageType))
                            throw TypeError(".google.protobuf.FileDescriptorProto.messageType: array expected");
                        message.messageType = [];
                        for (var i = 0; i < object.messageType.length; ++i) {
                            if (typeof object.messageType[i] !== "object")
                                throw TypeError(".google.protobuf.FileDescriptorProto.messageType: object expected");
                            message.messageType[i] = $root.google.protobuf.DescriptorProto.fromObject(object.messageType[i]);
                        }
                    }
                    if (object.enumType) {
                        if (!Array.isArray(object.enumType))
                            throw TypeError(".google.protobuf.FileDescriptorProto.enumType: array expected");
                        message.enumType = [];
                        for (var i = 0; i < object.enumType.length; ++i) {
                            if (typeof object.enumType[i] !== "object")
                                throw TypeError(".google.protobuf.FileDescriptorProto.enumType: object expected");
                            message.enumType[i] = $root.google.protobuf.EnumDescriptorProto.fromObject(object.enumType[i]);
                        }
                    }
                    if (object.service) {
                        if (!Array.isArray(object.service))
                            throw TypeError(".google.protobuf.FileDescriptorProto.service: array expected");
                        message.service = [];
                        for (var i = 0; i < object.service.length; ++i) {
                            if (typeof object.service[i] !== "object")
                                throw TypeError(".google.protobuf.FileDescriptorProto.service: object expected");
                            message.service[i] = $root.google.protobuf.ServiceDescriptorProto.fromObject(object.service[i]);
                        }
                    }
                    if (object.extension) {
                        if (!Array.isArray(object.extension))
                            throw TypeError(".google.protobuf.FileDescriptorProto.extension: array expected");
                        message.extension = [];
                        for (var i = 0; i < object.extension.length; ++i) {
                            if (typeof object.extension[i] !== "object")
                                throw TypeError(".google.protobuf.FileDescriptorProto.extension: object expected");
                            message.extension[i] = $root.google.protobuf.FieldDescriptorProto.fromObject(object.extension[i]);
                        }
                    }
                    if (object.options != null) {
                        if (typeof object.options !== "object")
                            throw TypeError(".google.protobuf.FileDescriptorProto.options: object expected");
                        message.options = $root.google.protobuf.FileOptions.fromObject(object.options);
                    }
                    if (object.sourceCodeInfo != null) {
                        if (typeof object.sourceCodeInfo !== "object")
                            throw TypeError(".google.protobuf.FileDescriptorProto.sourceCodeInfo: object expected");
                        message.sourceCodeInfo = $root.google.protobuf.SourceCodeInfo.fromObject(object.sourceCodeInfo);
                    }
                    if (object.syntax != null)
                        message.syntax = String(object.syntax);
                    return message;
                };
    
                /**
                 * Creates a plain object from a FileDescriptorProto message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.FileDescriptorProto
                 * @static
                 * @param {google.protobuf.FileDescriptorProto} message FileDescriptorProto
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                FileDescriptorProto.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults) {
                        object.dependency = [];
                        object.messageType = [];
                        object.enumType = [];
                        object.service = [];
                        object.extension = [];
                        object.publicDependency = [];
                        object.weakDependency = [];
                    }
                    if (options.defaults) {
                        object.name = "";
                        object["package"] = "";
                        object.options = null;
                        object.sourceCodeInfo = null;
                        object.syntax = "";
                    }
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    if (message["package"] != null && message.hasOwnProperty("package"))
                        object["package"] = message["package"];
                    if (message.dependency && message.dependency.length) {
                        object.dependency = [];
                        for (var j = 0; j < message.dependency.length; ++j)
                            object.dependency[j] = message.dependency[j];
                    }
                    if (message.messageType && message.messageType.length) {
                        object.messageType = [];
                        for (var j = 0; j < message.messageType.length; ++j)
                            object.messageType[j] = $root.google.protobuf.DescriptorProto.toObject(message.messageType[j], options);
                    }
                    if (message.enumType && message.enumType.length) {
                        object.enumType = [];
                        for (var j = 0; j < message.enumType.length; ++j)
                            object.enumType[j] = $root.google.protobuf.EnumDescriptorProto.toObject(message.enumType[j], options);
                    }
                    if (message.service && message.service.length) {
                        object.service = [];
                        for (var j = 0; j < message.service.length; ++j)
                            object.service[j] = $root.google.protobuf.ServiceDescriptorProto.toObject(message.service[j], options);
                    }
                    if (message.extension && message.extension.length) {
                        object.extension = [];
                        for (var j = 0; j < message.extension.length; ++j)
                            object.extension[j] = $root.google.protobuf.FieldDescriptorProto.toObject(message.extension[j], options);
                    }
                    if (message.options != null && message.hasOwnProperty("options"))
                        object.options = $root.google.protobuf.FileOptions.toObject(message.options, options);
                    if (message.sourceCodeInfo != null && message.hasOwnProperty("sourceCodeInfo"))
                        object.sourceCodeInfo = $root.google.protobuf.SourceCodeInfo.toObject(message.sourceCodeInfo, options);
                    if (message.publicDependency && message.publicDependency.length) {
                        object.publicDependency = [];
                        for (var j = 0; j < message.publicDependency.length; ++j)
                            object.publicDependency[j] = message.publicDependency[j];
                    }
                    if (message.weakDependency && message.weakDependency.length) {
                        object.weakDependency = [];
                        for (var j = 0; j < message.weakDependency.length; ++j)
                            object.weakDependency[j] = message.weakDependency[j];
                    }
                    if (message.syntax != null && message.hasOwnProperty("syntax"))
                        object.syntax = message.syntax;
                    return object;
                };
    
                /**
                 * Converts this FileDescriptorProto to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.FileDescriptorProto
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                FileDescriptorProto.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return FileDescriptorProto;
            })();
    
            protobuf.DescriptorProto = (function() {
    
                /**
                 * Properties of a DescriptorProto.
                 * @memberof google.protobuf
                 * @interface IDescriptorProto
                 * @property {string|null} [name] DescriptorProto name
                 * @property {Array.<google.protobuf.IFieldDescriptorProto>|null} [field] DescriptorProto field
                 * @property {Array.<google.protobuf.IFieldDescriptorProto>|null} [extension] DescriptorProto extension
                 * @property {Array.<google.protobuf.IDescriptorProto>|null} [nestedType] DescriptorProto nestedType
                 * @property {Array.<google.protobuf.IEnumDescriptorProto>|null} [enumType] DescriptorProto enumType
                 * @property {Array.<google.protobuf.DescriptorProto.IExtensionRange>|null} [extensionRange] DescriptorProto extensionRange
                 * @property {Array.<google.protobuf.IOneofDescriptorProto>|null} [oneofDecl] DescriptorProto oneofDecl
                 * @property {google.protobuf.IMessageOptions|null} [options] DescriptorProto options
                 * @property {Array.<google.protobuf.DescriptorProto.IReservedRange>|null} [reservedRange] DescriptorProto reservedRange
                 * @property {Array.<string>|null} [reservedName] DescriptorProto reservedName
                 */
    
                /**
                 * Constructs a new DescriptorProto.
                 * @memberof google.protobuf
                 * @classdesc Represents a DescriptorProto.
                 * @implements IDescriptorProto
                 * @constructor
                 * @param {google.protobuf.IDescriptorProto=} [properties] Properties to set
                 */
                function DescriptorProto(properties) {
                    this.field = [];
                    this.extension = [];
                    this.nestedType = [];
                    this.enumType = [];
                    this.extensionRange = [];
                    this.oneofDecl = [];
                    this.reservedRange = [];
                    this.reservedName = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * DescriptorProto name.
                 * @member {string} name
                 * @memberof google.protobuf.DescriptorProto
                 * @instance
                 */
                DescriptorProto.prototype.name = "";
    
                /**
                 * DescriptorProto field.
                 * @member {Array.<google.protobuf.IFieldDescriptorProto>} field
                 * @memberof google.protobuf.DescriptorProto
                 * @instance
                 */
                DescriptorProto.prototype.field = $util.emptyArray;
    
                /**
                 * DescriptorProto extension.
                 * @member {Array.<google.protobuf.IFieldDescriptorProto>} extension
                 * @memberof google.protobuf.DescriptorProto
                 * @instance
                 */
                DescriptorProto.prototype.extension = $util.emptyArray;
    
                /**
                 * DescriptorProto nestedType.
                 * @member {Array.<google.protobuf.IDescriptorProto>} nestedType
                 * @memberof google.protobuf.DescriptorProto
                 * @instance
                 */
                DescriptorProto.prototype.nestedType = $util.emptyArray;
    
                /**
                 * DescriptorProto enumType.
                 * @member {Array.<google.protobuf.IEnumDescriptorProto>} enumType
                 * @memberof google.protobuf.DescriptorProto
                 * @instance
                 */
                DescriptorProto.prototype.enumType = $util.emptyArray;
    
                /**
                 * DescriptorProto extensionRange.
                 * @member {Array.<google.protobuf.DescriptorProto.IExtensionRange>} extensionRange
                 * @memberof google.protobuf.DescriptorProto
                 * @instance
                 */
                DescriptorProto.prototype.extensionRange = $util.emptyArray;
    
                /**
                 * DescriptorProto oneofDecl.
                 * @member {Array.<google.protobuf.IOneofDescriptorProto>} oneofDecl
                 * @memberof google.protobuf.DescriptorProto
                 * @instance
                 */
                DescriptorProto.prototype.oneofDecl = $util.emptyArray;
    
                /**
                 * DescriptorProto options.
                 * @member {google.protobuf.IMessageOptions|null|undefined} options
                 * @memberof google.protobuf.DescriptorProto
                 * @instance
                 */
                DescriptorProto.prototype.options = null;
    
                /**
                 * DescriptorProto reservedRange.
                 * @member {Array.<google.protobuf.DescriptorProto.IReservedRange>} reservedRange
                 * @memberof google.protobuf.DescriptorProto
                 * @instance
                 */
                DescriptorProto.prototype.reservedRange = $util.emptyArray;
    
                /**
                 * DescriptorProto reservedName.
                 * @member {Array.<string>} reservedName
                 * @memberof google.protobuf.DescriptorProto
                 * @instance
                 */
                DescriptorProto.prototype.reservedName = $util.emptyArray;
    
                /**
                 * Creates a new DescriptorProto instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.DescriptorProto
                 * @static
                 * @param {google.protobuf.IDescriptorProto=} [properties] Properties to set
                 * @returns {google.protobuf.DescriptorProto} DescriptorProto instance
                 */
                DescriptorProto.create = function create(properties) {
                    return new DescriptorProto(properties);
                };
    
                /**
                 * Encodes the specified DescriptorProto message. Does not implicitly {@link google.protobuf.DescriptorProto.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.DescriptorProto
                 * @static
                 * @param {google.protobuf.IDescriptorProto} message DescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                DescriptorProto.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    if (message.field != null && message.field.length)
                        for (var i = 0; i < message.field.length; ++i)
                            $root.google.protobuf.FieldDescriptorProto.encode(message.field[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                    if (message.nestedType != null && message.nestedType.length)
                        for (var i = 0; i < message.nestedType.length; ++i)
                            $root.google.protobuf.DescriptorProto.encode(message.nestedType[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                    if (message.enumType != null && message.enumType.length)
                        for (var i = 0; i < message.enumType.length; ++i)
                            $root.google.protobuf.EnumDescriptorProto.encode(message.enumType[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                    if (message.extensionRange != null && message.extensionRange.length)
                        for (var i = 0; i < message.extensionRange.length; ++i)
                            $root.google.protobuf.DescriptorProto.ExtensionRange.encode(message.extensionRange[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                    if (message.extension != null && message.extension.length)
                        for (var i = 0; i < message.extension.length; ++i)
                            $root.google.protobuf.FieldDescriptorProto.encode(message.extension[i], writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                    if (message.options != null && Object.hasOwnProperty.call(message, "options"))
                        $root.google.protobuf.MessageOptions.encode(message.options, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
                    if (message.oneofDecl != null && message.oneofDecl.length)
                        for (var i = 0; i < message.oneofDecl.length; ++i)
                            $root.google.protobuf.OneofDescriptorProto.encode(message.oneofDecl[i], writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
                    if (message.reservedRange != null && message.reservedRange.length)
                        for (var i = 0; i < message.reservedRange.length; ++i)
                            $root.google.protobuf.DescriptorProto.ReservedRange.encode(message.reservedRange[i], writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();
                    if (message.reservedName != null && message.reservedName.length)
                        for (var i = 0; i < message.reservedName.length; ++i)
                            writer.uint32(/* id 10, wireType 2 =*/82).string(message.reservedName[i]);
                    return writer;
                };
    
                /**
                 * Encodes the specified DescriptorProto message, length delimited. Does not implicitly {@link google.protobuf.DescriptorProto.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.DescriptorProto
                 * @static
                 * @param {google.protobuf.IDescriptorProto} message DescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                DescriptorProto.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a DescriptorProto message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.DescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.DescriptorProto} DescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                DescriptorProto.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.DescriptorProto();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.name = reader.string();
                            break;
                        case 2:
                            if (!(message.field && message.field.length))
                                message.field = [];
                            message.field.push($root.google.protobuf.FieldDescriptorProto.decode(reader, reader.uint32()));
                            break;
                        case 6:
                            if (!(message.extension && message.extension.length))
                                message.extension = [];
                            message.extension.push($root.google.protobuf.FieldDescriptorProto.decode(reader, reader.uint32()));
                            break;
                        case 3:
                            if (!(message.nestedType && message.nestedType.length))
                                message.nestedType = [];
                            message.nestedType.push($root.google.protobuf.DescriptorProto.decode(reader, reader.uint32()));
                            break;
                        case 4:
                            if (!(message.enumType && message.enumType.length))
                                message.enumType = [];
                            message.enumType.push($root.google.protobuf.EnumDescriptorProto.decode(reader, reader.uint32()));
                            break;
                        case 5:
                            if (!(message.extensionRange && message.extensionRange.length))
                                message.extensionRange = [];
                            message.extensionRange.push($root.google.protobuf.DescriptorProto.ExtensionRange.decode(reader, reader.uint32()));
                            break;
                        case 8:
                            if (!(message.oneofDecl && message.oneofDecl.length))
                                message.oneofDecl = [];
                            message.oneofDecl.push($root.google.protobuf.OneofDescriptorProto.decode(reader, reader.uint32()));
                            break;
                        case 7:
                            message.options = $root.google.protobuf.MessageOptions.decode(reader, reader.uint32());
                            break;
                        case 9:
                            if (!(message.reservedRange && message.reservedRange.length))
                                message.reservedRange = [];
                            message.reservedRange.push($root.google.protobuf.DescriptorProto.ReservedRange.decode(reader, reader.uint32()));
                            break;
                        case 10:
                            if (!(message.reservedName && message.reservedName.length))
                                message.reservedName = [];
                            message.reservedName.push(reader.string());
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a DescriptorProto message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.DescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.DescriptorProto} DescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                DescriptorProto.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a DescriptorProto message.
                 * @function verify
                 * @memberof google.protobuf.DescriptorProto
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                DescriptorProto.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    if (message.field != null && message.hasOwnProperty("field")) {
                        if (!Array.isArray(message.field))
                            return "field: array expected";
                        for (var i = 0; i < message.field.length; ++i) {
                            var error = $root.google.protobuf.FieldDescriptorProto.verify(message.field[i]);
                            if (error)
                                return "field." + error;
                        }
                    }
                    if (message.extension != null && message.hasOwnProperty("extension")) {
                        if (!Array.isArray(message.extension))
                            return "extension: array expected";
                        for (var i = 0; i < message.extension.length; ++i) {
                            var error = $root.google.protobuf.FieldDescriptorProto.verify(message.extension[i]);
                            if (error)
                                return "extension." + error;
                        }
                    }
                    if (message.nestedType != null && message.hasOwnProperty("nestedType")) {
                        if (!Array.isArray(message.nestedType))
                            return "nestedType: array expected";
                        for (var i = 0; i < message.nestedType.length; ++i) {
                            var error = $root.google.protobuf.DescriptorProto.verify(message.nestedType[i]);
                            if (error)
                                return "nestedType." + error;
                        }
                    }
                    if (message.enumType != null && message.hasOwnProperty("enumType")) {
                        if (!Array.isArray(message.enumType))
                            return "enumType: array expected";
                        for (var i = 0; i < message.enumType.length; ++i) {
                            var error = $root.google.protobuf.EnumDescriptorProto.verify(message.enumType[i]);
                            if (error)
                                return "enumType." + error;
                        }
                    }
                    if (message.extensionRange != null && message.hasOwnProperty("extensionRange")) {
                        if (!Array.isArray(message.extensionRange))
                            return "extensionRange: array expected";
                        for (var i = 0; i < message.extensionRange.length; ++i) {
                            var error = $root.google.protobuf.DescriptorProto.ExtensionRange.verify(message.extensionRange[i]);
                            if (error)
                                return "extensionRange." + error;
                        }
                    }
                    if (message.oneofDecl != null && message.hasOwnProperty("oneofDecl")) {
                        if (!Array.isArray(message.oneofDecl))
                            return "oneofDecl: array expected";
                        for (var i = 0; i < message.oneofDecl.length; ++i) {
                            var error = $root.google.protobuf.OneofDescriptorProto.verify(message.oneofDecl[i]);
                            if (error)
                                return "oneofDecl." + error;
                        }
                    }
                    if (message.options != null && message.hasOwnProperty("options")) {
                        var error = $root.google.protobuf.MessageOptions.verify(message.options);
                        if (error)
                            return "options." + error;
                    }
                    if (message.reservedRange != null && message.hasOwnProperty("reservedRange")) {
                        if (!Array.isArray(message.reservedRange))
                            return "reservedRange: array expected";
                        for (var i = 0; i < message.reservedRange.length; ++i) {
                            var error = $root.google.protobuf.DescriptorProto.ReservedRange.verify(message.reservedRange[i]);
                            if (error)
                                return "reservedRange." + error;
                        }
                    }
                    if (message.reservedName != null && message.hasOwnProperty("reservedName")) {
                        if (!Array.isArray(message.reservedName))
                            return "reservedName: array expected";
                        for (var i = 0; i < message.reservedName.length; ++i)
                            if (!$util.isString(message.reservedName[i]))
                                return "reservedName: string[] expected";
                    }
                    return null;
                };
    
                /**
                 * Creates a DescriptorProto message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.DescriptorProto
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.DescriptorProto} DescriptorProto
                 */
                DescriptorProto.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.DescriptorProto)
                        return object;
                    var message = new $root.google.protobuf.DescriptorProto();
                    if (object.name != null)
                        message.name = String(object.name);
                    if (object.field) {
                        if (!Array.isArray(object.field))
                            throw TypeError(".google.protobuf.DescriptorProto.field: array expected");
                        message.field = [];
                        for (var i = 0; i < object.field.length; ++i) {
                            if (typeof object.field[i] !== "object")
                                throw TypeError(".google.protobuf.DescriptorProto.field: object expected");
                            message.field[i] = $root.google.protobuf.FieldDescriptorProto.fromObject(object.field[i]);
                        }
                    }
                    if (object.extension) {
                        if (!Array.isArray(object.extension))
                            throw TypeError(".google.protobuf.DescriptorProto.extension: array expected");
                        message.extension = [];
                        for (var i = 0; i < object.extension.length; ++i) {
                            if (typeof object.extension[i] !== "object")
                                throw TypeError(".google.protobuf.DescriptorProto.extension: object expected");
                            message.extension[i] = $root.google.protobuf.FieldDescriptorProto.fromObject(object.extension[i]);
                        }
                    }
                    if (object.nestedType) {
                        if (!Array.isArray(object.nestedType))
                            throw TypeError(".google.protobuf.DescriptorProto.nestedType: array expected");
                        message.nestedType = [];
                        for (var i = 0; i < object.nestedType.length; ++i) {
                            if (typeof object.nestedType[i] !== "object")
                                throw TypeError(".google.protobuf.DescriptorProto.nestedType: object expected");
                            message.nestedType[i] = $root.google.protobuf.DescriptorProto.fromObject(object.nestedType[i]);
                        }
                    }
                    if (object.enumType) {
                        if (!Array.isArray(object.enumType))
                            throw TypeError(".google.protobuf.DescriptorProto.enumType: array expected");
                        message.enumType = [];
                        for (var i = 0; i < object.enumType.length; ++i) {
                            if (typeof object.enumType[i] !== "object")
                                throw TypeError(".google.protobuf.DescriptorProto.enumType: object expected");
                            message.enumType[i] = $root.google.protobuf.EnumDescriptorProto.fromObject(object.enumType[i]);
                        }
                    }
                    if (object.extensionRange) {
                        if (!Array.isArray(object.extensionRange))
                            throw TypeError(".google.protobuf.DescriptorProto.extensionRange: array expected");
                        message.extensionRange = [];
                        for (var i = 0; i < object.extensionRange.length; ++i) {
                            if (typeof object.extensionRange[i] !== "object")
                                throw TypeError(".google.protobuf.DescriptorProto.extensionRange: object expected");
                            message.extensionRange[i] = $root.google.protobuf.DescriptorProto.ExtensionRange.fromObject(object.extensionRange[i]);
                        }
                    }
                    if (object.oneofDecl) {
                        if (!Array.isArray(object.oneofDecl))
                            throw TypeError(".google.protobuf.DescriptorProto.oneofDecl: array expected");
                        message.oneofDecl = [];
                        for (var i = 0; i < object.oneofDecl.length; ++i) {
                            if (typeof object.oneofDecl[i] !== "object")
                                throw TypeError(".google.protobuf.DescriptorProto.oneofDecl: object expected");
                            message.oneofDecl[i] = $root.google.protobuf.OneofDescriptorProto.fromObject(object.oneofDecl[i]);
                        }
                    }
                    if (object.options != null) {
                        if (typeof object.options !== "object")
                            throw TypeError(".google.protobuf.DescriptorProto.options: object expected");
                        message.options = $root.google.protobuf.MessageOptions.fromObject(object.options);
                    }
                    if (object.reservedRange) {
                        if (!Array.isArray(object.reservedRange))
                            throw TypeError(".google.protobuf.DescriptorProto.reservedRange: array expected");
                        message.reservedRange = [];
                        for (var i = 0; i < object.reservedRange.length; ++i) {
                            if (typeof object.reservedRange[i] !== "object")
                                throw TypeError(".google.protobuf.DescriptorProto.reservedRange: object expected");
                            message.reservedRange[i] = $root.google.protobuf.DescriptorProto.ReservedRange.fromObject(object.reservedRange[i]);
                        }
                    }
                    if (object.reservedName) {
                        if (!Array.isArray(object.reservedName))
                            throw TypeError(".google.protobuf.DescriptorProto.reservedName: array expected");
                        message.reservedName = [];
                        for (var i = 0; i < object.reservedName.length; ++i)
                            message.reservedName[i] = String(object.reservedName[i]);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a DescriptorProto message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.DescriptorProto
                 * @static
                 * @param {google.protobuf.DescriptorProto} message DescriptorProto
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                DescriptorProto.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults) {
                        object.field = [];
                        object.nestedType = [];
                        object.enumType = [];
                        object.extensionRange = [];
                        object.extension = [];
                        object.oneofDecl = [];
                        object.reservedRange = [];
                        object.reservedName = [];
                    }
                    if (options.defaults) {
                        object.name = "";
                        object.options = null;
                    }
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    if (message.field && message.field.length) {
                        object.field = [];
                        for (var j = 0; j < message.field.length; ++j)
                            object.field[j] = $root.google.protobuf.FieldDescriptorProto.toObject(message.field[j], options);
                    }
                    if (message.nestedType && message.nestedType.length) {
                        object.nestedType = [];
                        for (var j = 0; j < message.nestedType.length; ++j)
                            object.nestedType[j] = $root.google.protobuf.DescriptorProto.toObject(message.nestedType[j], options);
                    }
                    if (message.enumType && message.enumType.length) {
                        object.enumType = [];
                        for (var j = 0; j < message.enumType.length; ++j)
                            object.enumType[j] = $root.google.protobuf.EnumDescriptorProto.toObject(message.enumType[j], options);
                    }
                    if (message.extensionRange && message.extensionRange.length) {
                        object.extensionRange = [];
                        for (var j = 0; j < message.extensionRange.length; ++j)
                            object.extensionRange[j] = $root.google.protobuf.DescriptorProto.ExtensionRange.toObject(message.extensionRange[j], options);
                    }
                    if (message.extension && message.extension.length) {
                        object.extension = [];
                        for (var j = 0; j < message.extension.length; ++j)
                            object.extension[j] = $root.google.protobuf.FieldDescriptorProto.toObject(message.extension[j], options);
                    }
                    if (message.options != null && message.hasOwnProperty("options"))
                        object.options = $root.google.protobuf.MessageOptions.toObject(message.options, options);
                    if (message.oneofDecl && message.oneofDecl.length) {
                        object.oneofDecl = [];
                        for (var j = 0; j < message.oneofDecl.length; ++j)
                            object.oneofDecl[j] = $root.google.protobuf.OneofDescriptorProto.toObject(message.oneofDecl[j], options);
                    }
                    if (message.reservedRange && message.reservedRange.length) {
                        object.reservedRange = [];
                        for (var j = 0; j < message.reservedRange.length; ++j)
                            object.reservedRange[j] = $root.google.protobuf.DescriptorProto.ReservedRange.toObject(message.reservedRange[j], options);
                    }
                    if (message.reservedName && message.reservedName.length) {
                        object.reservedName = [];
                        for (var j = 0; j < message.reservedName.length; ++j)
                            object.reservedName[j] = message.reservedName[j];
                    }
                    return object;
                };
    
                /**
                 * Converts this DescriptorProto to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.DescriptorProto
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                DescriptorProto.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                DescriptorProto.ExtensionRange = (function() {
    
                    /**
                     * Properties of an ExtensionRange.
                     * @memberof google.protobuf.DescriptorProto
                     * @interface IExtensionRange
                     * @property {number|null} [start] ExtensionRange start
                     * @property {number|null} [end] ExtensionRange end
                     * @property {google.protobuf.IExtensionRangeOptions|null} [options] ExtensionRange options
                     */
    
                    /**
                     * Constructs a new ExtensionRange.
                     * @memberof google.protobuf.DescriptorProto
                     * @classdesc Represents an ExtensionRange.
                     * @implements IExtensionRange
                     * @constructor
                     * @param {google.protobuf.DescriptorProto.IExtensionRange=} [properties] Properties to set
                     */
                    function ExtensionRange(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ExtensionRange start.
                     * @member {number} start
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @instance
                     */
                    ExtensionRange.prototype.start = 0;
    
                    /**
                     * ExtensionRange end.
                     * @member {number} end
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @instance
                     */
                    ExtensionRange.prototype.end = 0;
    
                    /**
                     * ExtensionRange options.
                     * @member {google.protobuf.IExtensionRangeOptions|null|undefined} options
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @instance
                     */
                    ExtensionRange.prototype.options = null;
    
                    /**
                     * Creates a new ExtensionRange instance using the specified properties.
                     * @function create
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @static
                     * @param {google.protobuf.DescriptorProto.IExtensionRange=} [properties] Properties to set
                     * @returns {google.protobuf.DescriptorProto.ExtensionRange} ExtensionRange instance
                     */
                    ExtensionRange.create = function create(properties) {
                        return new ExtensionRange(properties);
                    };
    
                    /**
                     * Encodes the specified ExtensionRange message. Does not implicitly {@link google.protobuf.DescriptorProto.ExtensionRange.verify|verify} messages.
                     * @function encode
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @static
                     * @param {google.protobuf.DescriptorProto.IExtensionRange} message ExtensionRange message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ExtensionRange.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                            writer.uint32(/* id 1, wireType 0 =*/8).int32(message.start);
                        if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                            writer.uint32(/* id 2, wireType 0 =*/16).int32(message.end);
                        if (message.options != null && Object.hasOwnProperty.call(message, "options"))
                            $root.google.protobuf.ExtensionRangeOptions.encode(message.options, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ExtensionRange message, length delimited. Does not implicitly {@link google.protobuf.DescriptorProto.ExtensionRange.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @static
                     * @param {google.protobuf.DescriptorProto.IExtensionRange} message ExtensionRange message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ExtensionRange.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes an ExtensionRange message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.protobuf.DescriptorProto.ExtensionRange} ExtensionRange
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ExtensionRange.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.DescriptorProto.ExtensionRange();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.start = reader.int32();
                                break;
                            case 2:
                                message.end = reader.int32();
                                break;
                            case 3:
                                message.options = $root.google.protobuf.ExtensionRangeOptions.decode(reader, reader.uint32());
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes an ExtensionRange message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.protobuf.DescriptorProto.ExtensionRange} ExtensionRange
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ExtensionRange.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies an ExtensionRange message.
                     * @function verify
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ExtensionRange.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.start != null && message.hasOwnProperty("start"))
                            if (!$util.isInteger(message.start))
                                return "start: integer expected";
                        if (message.end != null && message.hasOwnProperty("end"))
                            if (!$util.isInteger(message.end))
                                return "end: integer expected";
                        if (message.options != null && message.hasOwnProperty("options")) {
                            var error = $root.google.protobuf.ExtensionRangeOptions.verify(message.options);
                            if (error)
                                return "options." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates an ExtensionRange message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.protobuf.DescriptorProto.ExtensionRange} ExtensionRange
                     */
                    ExtensionRange.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.protobuf.DescriptorProto.ExtensionRange)
                            return object;
                        var message = new $root.google.protobuf.DescriptorProto.ExtensionRange();
                        if (object.start != null)
                            message.start = object.start | 0;
                        if (object.end != null)
                            message.end = object.end | 0;
                        if (object.options != null) {
                            if (typeof object.options !== "object")
                                throw TypeError(".google.protobuf.DescriptorProto.ExtensionRange.options: object expected");
                            message.options = $root.google.protobuf.ExtensionRangeOptions.fromObject(object.options);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from an ExtensionRange message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @static
                     * @param {google.protobuf.DescriptorProto.ExtensionRange} message ExtensionRange
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ExtensionRange.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.start = 0;
                            object.end = 0;
                            object.options = null;
                        }
                        if (message.start != null && message.hasOwnProperty("start"))
                            object.start = message.start;
                        if (message.end != null && message.hasOwnProperty("end"))
                            object.end = message.end;
                        if (message.options != null && message.hasOwnProperty("options"))
                            object.options = $root.google.protobuf.ExtensionRangeOptions.toObject(message.options, options);
                        return object;
                    };
    
                    /**
                     * Converts this ExtensionRange to JSON.
                     * @function toJSON
                     * @memberof google.protobuf.DescriptorProto.ExtensionRange
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ExtensionRange.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return ExtensionRange;
                })();
    
                DescriptorProto.ReservedRange = (function() {
    
                    /**
                     * Properties of a ReservedRange.
                     * @memberof google.protobuf.DescriptorProto
                     * @interface IReservedRange
                     * @property {number|null} [start] ReservedRange start
                     * @property {number|null} [end] ReservedRange end
                     */
    
                    /**
                     * Constructs a new ReservedRange.
                     * @memberof google.protobuf.DescriptorProto
                     * @classdesc Represents a ReservedRange.
                     * @implements IReservedRange
                     * @constructor
                     * @param {google.protobuf.DescriptorProto.IReservedRange=} [properties] Properties to set
                     */
                    function ReservedRange(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ReservedRange start.
                     * @member {number} start
                     * @memberof google.protobuf.DescriptorProto.ReservedRange
                     * @instance
                     */
                    ReservedRange.prototype.start = 0;
    
                    /**
                     * ReservedRange end.
                     * @member {number} end
                     * @memberof google.protobuf.DescriptorProto.ReservedRange
                     * @instance
                     */
                    ReservedRange.prototype.end = 0;
    
                    /**
                     * Creates a new ReservedRange instance using the specified properties.
                     * @function create
                     * @memberof google.protobuf.DescriptorProto.ReservedRange
                     * @static
                     * @param {google.protobuf.DescriptorProto.IReservedRange=} [properties] Properties to set
                     * @returns {google.protobuf.DescriptorProto.ReservedRange} ReservedRange instance
                     */
                    ReservedRange.create = function create(properties) {
                        return new ReservedRange(properties);
                    };
    
                    /**
                     * Encodes the specified ReservedRange message. Does not implicitly {@link google.protobuf.DescriptorProto.ReservedRange.verify|verify} messages.
                     * @function encode
                     * @memberof google.protobuf.DescriptorProto.ReservedRange
                     * @static
                     * @param {google.protobuf.DescriptorProto.IReservedRange} message ReservedRange message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ReservedRange.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                            writer.uint32(/* id 1, wireType 0 =*/8).int32(message.start);
                        if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                            writer.uint32(/* id 2, wireType 0 =*/16).int32(message.end);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ReservedRange message, length delimited. Does not implicitly {@link google.protobuf.DescriptorProto.ReservedRange.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.protobuf.DescriptorProto.ReservedRange
                     * @static
                     * @param {google.protobuf.DescriptorProto.IReservedRange} message ReservedRange message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ReservedRange.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ReservedRange message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.protobuf.DescriptorProto.ReservedRange
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.protobuf.DescriptorProto.ReservedRange} ReservedRange
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ReservedRange.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.DescriptorProto.ReservedRange();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.start = reader.int32();
                                break;
                            case 2:
                                message.end = reader.int32();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ReservedRange message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.protobuf.DescriptorProto.ReservedRange
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.protobuf.DescriptorProto.ReservedRange} ReservedRange
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ReservedRange.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ReservedRange message.
                     * @function verify
                     * @memberof google.protobuf.DescriptorProto.ReservedRange
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ReservedRange.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.start != null && message.hasOwnProperty("start"))
                            if (!$util.isInteger(message.start))
                                return "start: integer expected";
                        if (message.end != null && message.hasOwnProperty("end"))
                            if (!$util.isInteger(message.end))
                                return "end: integer expected";
                        return null;
                    };
    
                    /**
                     * Creates a ReservedRange message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.protobuf.DescriptorProto.ReservedRange
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.protobuf.DescriptorProto.ReservedRange} ReservedRange
                     */
                    ReservedRange.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.protobuf.DescriptorProto.ReservedRange)
                            return object;
                        var message = new $root.google.protobuf.DescriptorProto.ReservedRange();
                        if (object.start != null)
                            message.start = object.start | 0;
                        if (object.end != null)
                            message.end = object.end | 0;
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ReservedRange message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.protobuf.DescriptorProto.ReservedRange
                     * @static
                     * @param {google.protobuf.DescriptorProto.ReservedRange} message ReservedRange
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ReservedRange.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.start = 0;
                            object.end = 0;
                        }
                        if (message.start != null && message.hasOwnProperty("start"))
                            object.start = message.start;
                        if (message.end != null && message.hasOwnProperty("end"))
                            object.end = message.end;
                        return object;
                    };
    
                    /**
                     * Converts this ReservedRange to JSON.
                     * @function toJSON
                     * @memberof google.protobuf.DescriptorProto.ReservedRange
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ReservedRange.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return ReservedRange;
                })();
    
                return DescriptorProto;
            })();
    
            protobuf.ExtensionRangeOptions = (function() {
    
                /**
                 * Properties of an ExtensionRangeOptions.
                 * @memberof google.protobuf
                 * @interface IExtensionRangeOptions
                 * @property {Array.<google.protobuf.IUninterpretedOption>|null} [uninterpretedOption] ExtensionRangeOptions uninterpretedOption
                 */
    
                /**
                 * Constructs a new ExtensionRangeOptions.
                 * @memberof google.protobuf
                 * @classdesc Represents an ExtensionRangeOptions.
                 * @implements IExtensionRangeOptions
                 * @constructor
                 * @param {google.protobuf.IExtensionRangeOptions=} [properties] Properties to set
                 */
                function ExtensionRangeOptions(properties) {
                    this.uninterpretedOption = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * ExtensionRangeOptions uninterpretedOption.
                 * @member {Array.<google.protobuf.IUninterpretedOption>} uninterpretedOption
                 * @memberof google.protobuf.ExtensionRangeOptions
                 * @instance
                 */
                ExtensionRangeOptions.prototype.uninterpretedOption = $util.emptyArray;
    
                /**
                 * Creates a new ExtensionRangeOptions instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.ExtensionRangeOptions
                 * @static
                 * @param {google.protobuf.IExtensionRangeOptions=} [properties] Properties to set
                 * @returns {google.protobuf.ExtensionRangeOptions} ExtensionRangeOptions instance
                 */
                ExtensionRangeOptions.create = function create(properties) {
                    return new ExtensionRangeOptions(properties);
                };
    
                /**
                 * Encodes the specified ExtensionRangeOptions message. Does not implicitly {@link google.protobuf.ExtensionRangeOptions.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.ExtensionRangeOptions
                 * @static
                 * @param {google.protobuf.IExtensionRangeOptions} message ExtensionRangeOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ExtensionRangeOptions.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.uninterpretedOption != null && message.uninterpretedOption.length)
                        for (var i = 0; i < message.uninterpretedOption.length; ++i)
                            $root.google.protobuf.UninterpretedOption.encode(message.uninterpretedOption[i], writer.uint32(/* id 999, wireType 2 =*/7994).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified ExtensionRangeOptions message, length delimited. Does not implicitly {@link google.protobuf.ExtensionRangeOptions.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.ExtensionRangeOptions
                 * @static
                 * @param {google.protobuf.IExtensionRangeOptions} message ExtensionRangeOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ExtensionRangeOptions.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an ExtensionRangeOptions message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.ExtensionRangeOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.ExtensionRangeOptions} ExtensionRangeOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ExtensionRangeOptions.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.ExtensionRangeOptions();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 999:
                            if (!(message.uninterpretedOption && message.uninterpretedOption.length))
                                message.uninterpretedOption = [];
                            message.uninterpretedOption.push($root.google.protobuf.UninterpretedOption.decode(reader, reader.uint32()));
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an ExtensionRangeOptions message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.ExtensionRangeOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.ExtensionRangeOptions} ExtensionRangeOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ExtensionRangeOptions.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an ExtensionRangeOptions message.
                 * @function verify
                 * @memberof google.protobuf.ExtensionRangeOptions
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                ExtensionRangeOptions.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.uninterpretedOption != null && message.hasOwnProperty("uninterpretedOption")) {
                        if (!Array.isArray(message.uninterpretedOption))
                            return "uninterpretedOption: array expected";
                        for (var i = 0; i < message.uninterpretedOption.length; ++i) {
                            var error = $root.google.protobuf.UninterpretedOption.verify(message.uninterpretedOption[i]);
                            if (error)
                                return "uninterpretedOption." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates an ExtensionRangeOptions message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.ExtensionRangeOptions
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.ExtensionRangeOptions} ExtensionRangeOptions
                 */
                ExtensionRangeOptions.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.ExtensionRangeOptions)
                        return object;
                    var message = new $root.google.protobuf.ExtensionRangeOptions();
                    if (object.uninterpretedOption) {
                        if (!Array.isArray(object.uninterpretedOption))
                            throw TypeError(".google.protobuf.ExtensionRangeOptions.uninterpretedOption: array expected");
                        message.uninterpretedOption = [];
                        for (var i = 0; i < object.uninterpretedOption.length; ++i) {
                            if (typeof object.uninterpretedOption[i] !== "object")
                                throw TypeError(".google.protobuf.ExtensionRangeOptions.uninterpretedOption: object expected");
                            message.uninterpretedOption[i] = $root.google.protobuf.UninterpretedOption.fromObject(object.uninterpretedOption[i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from an ExtensionRangeOptions message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.ExtensionRangeOptions
                 * @static
                 * @param {google.protobuf.ExtensionRangeOptions} message ExtensionRangeOptions
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                ExtensionRangeOptions.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.uninterpretedOption = [];
                    if (message.uninterpretedOption && message.uninterpretedOption.length) {
                        object.uninterpretedOption = [];
                        for (var j = 0; j < message.uninterpretedOption.length; ++j)
                            object.uninterpretedOption[j] = $root.google.protobuf.UninterpretedOption.toObject(message.uninterpretedOption[j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this ExtensionRangeOptions to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.ExtensionRangeOptions
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                ExtensionRangeOptions.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return ExtensionRangeOptions;
            })();
    
            protobuf.FieldDescriptorProto = (function() {
    
                /**
                 * Properties of a FieldDescriptorProto.
                 * @memberof google.protobuf
                 * @interface IFieldDescriptorProto
                 * @property {string|null} [name] FieldDescriptorProto name
                 * @property {number|null} [number] FieldDescriptorProto number
                 * @property {google.protobuf.FieldDescriptorProto.Label|null} [label] FieldDescriptorProto label
                 * @property {google.protobuf.FieldDescriptorProto.Type|null} [type] FieldDescriptorProto type
                 * @property {string|null} [typeName] FieldDescriptorProto typeName
                 * @property {string|null} [extendee] FieldDescriptorProto extendee
                 * @property {string|null} [defaultValue] FieldDescriptorProto defaultValue
                 * @property {number|null} [oneofIndex] FieldDescriptorProto oneofIndex
                 * @property {string|null} [jsonName] FieldDescriptorProto jsonName
                 * @property {google.protobuf.IFieldOptions|null} [options] FieldDescriptorProto options
                 * @property {boolean|null} [proto3Optional] FieldDescriptorProto proto3Optional
                 */
    
                /**
                 * Constructs a new FieldDescriptorProto.
                 * @memberof google.protobuf
                 * @classdesc Represents a FieldDescriptorProto.
                 * @implements IFieldDescriptorProto
                 * @constructor
                 * @param {google.protobuf.IFieldDescriptorProto=} [properties] Properties to set
                 */
                function FieldDescriptorProto(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * FieldDescriptorProto name.
                 * @member {string} name
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @instance
                 */
                FieldDescriptorProto.prototype.name = "";
    
                /**
                 * FieldDescriptorProto number.
                 * @member {number} number
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @instance
                 */
                FieldDescriptorProto.prototype.number = 0;
    
                /**
                 * FieldDescriptorProto label.
                 * @member {google.protobuf.FieldDescriptorProto.Label} label
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @instance
                 */
                FieldDescriptorProto.prototype.label = 1;
    
                /**
                 * FieldDescriptorProto type.
                 * @member {google.protobuf.FieldDescriptorProto.Type} type
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @instance
                 */
                FieldDescriptorProto.prototype.type = 1;
    
                /**
                 * FieldDescriptorProto typeName.
                 * @member {string} typeName
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @instance
                 */
                FieldDescriptorProto.prototype.typeName = "";
    
                /**
                 * FieldDescriptorProto extendee.
                 * @member {string} extendee
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @instance
                 */
                FieldDescriptorProto.prototype.extendee = "";
    
                /**
                 * FieldDescriptorProto defaultValue.
                 * @member {string} defaultValue
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @instance
                 */
                FieldDescriptorProto.prototype.defaultValue = "";
    
                /**
                 * FieldDescriptorProto oneofIndex.
                 * @member {number} oneofIndex
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @instance
                 */
                FieldDescriptorProto.prototype.oneofIndex = 0;
    
                /**
                 * FieldDescriptorProto jsonName.
                 * @member {string} jsonName
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @instance
                 */
                FieldDescriptorProto.prototype.jsonName = "";
    
                /**
                 * FieldDescriptorProto options.
                 * @member {google.protobuf.IFieldOptions|null|undefined} options
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @instance
                 */
                FieldDescriptorProto.prototype.options = null;
    
                /**
                 * FieldDescriptorProto proto3Optional.
                 * @member {boolean} proto3Optional
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @instance
                 */
                FieldDescriptorProto.prototype.proto3Optional = false;
    
                /**
                 * Creates a new FieldDescriptorProto instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @static
                 * @param {google.protobuf.IFieldDescriptorProto=} [properties] Properties to set
                 * @returns {google.protobuf.FieldDescriptorProto} FieldDescriptorProto instance
                 */
                FieldDescriptorProto.create = function create(properties) {
                    return new FieldDescriptorProto(properties);
                };
    
                /**
                 * Encodes the specified FieldDescriptorProto message. Does not implicitly {@link google.protobuf.FieldDescriptorProto.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @static
                 * @param {google.protobuf.IFieldDescriptorProto} message FieldDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FieldDescriptorProto.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    if (message.extendee != null && Object.hasOwnProperty.call(message, "extendee"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.extendee);
                    if (message.number != null && Object.hasOwnProperty.call(message, "number"))
                        writer.uint32(/* id 3, wireType 0 =*/24).int32(message.number);
                    if (message.label != null && Object.hasOwnProperty.call(message, "label"))
                        writer.uint32(/* id 4, wireType 0 =*/32).int32(message.label);
                    if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                        writer.uint32(/* id 5, wireType 0 =*/40).int32(message.type);
                    if (message.typeName != null && Object.hasOwnProperty.call(message, "typeName"))
                        writer.uint32(/* id 6, wireType 2 =*/50).string(message.typeName);
                    if (message.defaultValue != null && Object.hasOwnProperty.call(message, "defaultValue"))
                        writer.uint32(/* id 7, wireType 2 =*/58).string(message.defaultValue);
                    if (message.options != null && Object.hasOwnProperty.call(message, "options"))
                        $root.google.protobuf.FieldOptions.encode(message.options, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
                    if (message.oneofIndex != null && Object.hasOwnProperty.call(message, "oneofIndex"))
                        writer.uint32(/* id 9, wireType 0 =*/72).int32(message.oneofIndex);
                    if (message.jsonName != null && Object.hasOwnProperty.call(message, "jsonName"))
                        writer.uint32(/* id 10, wireType 2 =*/82).string(message.jsonName);
                    if (message.proto3Optional != null && Object.hasOwnProperty.call(message, "proto3Optional"))
                        writer.uint32(/* id 17, wireType 0 =*/136).bool(message.proto3Optional);
                    return writer;
                };
    
                /**
                 * Encodes the specified FieldDescriptorProto message, length delimited. Does not implicitly {@link google.protobuf.FieldDescriptorProto.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @static
                 * @param {google.protobuf.IFieldDescriptorProto} message FieldDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FieldDescriptorProto.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a FieldDescriptorProto message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.FieldDescriptorProto} FieldDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FieldDescriptorProto.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.FieldDescriptorProto();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.name = reader.string();
                            break;
                        case 3:
                            message.number = reader.int32();
                            break;
                        case 4:
                            message.label = reader.int32();
                            break;
                        case 5:
                            message.type = reader.int32();
                            break;
                        case 6:
                            message.typeName = reader.string();
                            break;
                        case 2:
                            message.extendee = reader.string();
                            break;
                        case 7:
                            message.defaultValue = reader.string();
                            break;
                        case 9:
                            message.oneofIndex = reader.int32();
                            break;
                        case 10:
                            message.jsonName = reader.string();
                            break;
                        case 8:
                            message.options = $root.google.protobuf.FieldOptions.decode(reader, reader.uint32());
                            break;
                        case 17:
                            message.proto3Optional = reader.bool();
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a FieldDescriptorProto message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.FieldDescriptorProto} FieldDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FieldDescriptorProto.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a FieldDescriptorProto message.
                 * @function verify
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                FieldDescriptorProto.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    if (message.number != null && message.hasOwnProperty("number"))
                        if (!$util.isInteger(message.number))
                            return "number: integer expected";
                    if (message.label != null && message.hasOwnProperty("label"))
                        switch (message.label) {
                        default:
                            return "label: enum value expected";
                        case 1:
                        case 2:
                        case 3:
                            break;
                        }
                    if (message.type != null && message.hasOwnProperty("type"))
                        switch (message.type) {
                        default:
                            return "type: enum value expected";
                        case 1:
                        case 2:
                        case 3:
                        case 4:
                        case 5:
                        case 6:
                        case 7:
                        case 8:
                        case 9:
                        case 10:
                        case 11:
                        case 12:
                        case 13:
                        case 14:
                        case 15:
                        case 16:
                        case 17:
                        case 18:
                            break;
                        }
                    if (message.typeName != null && message.hasOwnProperty("typeName"))
                        if (!$util.isString(message.typeName))
                            return "typeName: string expected";
                    if (message.extendee != null && message.hasOwnProperty("extendee"))
                        if (!$util.isString(message.extendee))
                            return "extendee: string expected";
                    if (message.defaultValue != null && message.hasOwnProperty("defaultValue"))
                        if (!$util.isString(message.defaultValue))
                            return "defaultValue: string expected";
                    if (message.oneofIndex != null && message.hasOwnProperty("oneofIndex"))
                        if (!$util.isInteger(message.oneofIndex))
                            return "oneofIndex: integer expected";
                    if (message.jsonName != null && message.hasOwnProperty("jsonName"))
                        if (!$util.isString(message.jsonName))
                            return "jsonName: string expected";
                    if (message.options != null && message.hasOwnProperty("options")) {
                        var error = $root.google.protobuf.FieldOptions.verify(message.options);
                        if (error)
                            return "options." + error;
                    }
                    if (message.proto3Optional != null && message.hasOwnProperty("proto3Optional"))
                        if (typeof message.proto3Optional !== "boolean")
                            return "proto3Optional: boolean expected";
                    return null;
                };
    
                /**
                 * Creates a FieldDescriptorProto message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.FieldDescriptorProto} FieldDescriptorProto
                 */
                FieldDescriptorProto.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.FieldDescriptorProto)
                        return object;
                    var message = new $root.google.protobuf.FieldDescriptorProto();
                    if (object.name != null)
                        message.name = String(object.name);
                    if (object.number != null)
                        message.number = object.number | 0;
                    switch (object.label) {
                    case "LABEL_OPTIONAL":
                    case 1:
                        message.label = 1;
                        break;
                    case "LABEL_REQUIRED":
                    case 2:
                        message.label = 2;
                        break;
                    case "LABEL_REPEATED":
                    case 3:
                        message.label = 3;
                        break;
                    }
                    switch (object.type) {
                    case "TYPE_DOUBLE":
                    case 1:
                        message.type = 1;
                        break;
                    case "TYPE_FLOAT":
                    case 2:
                        message.type = 2;
                        break;
                    case "TYPE_INT64":
                    case 3:
                        message.type = 3;
                        break;
                    case "TYPE_UINT64":
                    case 4:
                        message.type = 4;
                        break;
                    case "TYPE_INT32":
                    case 5:
                        message.type = 5;
                        break;
                    case "TYPE_FIXED64":
                    case 6:
                        message.type = 6;
                        break;
                    case "TYPE_FIXED32":
                    case 7:
                        message.type = 7;
                        break;
                    case "TYPE_BOOL":
                    case 8:
                        message.type = 8;
                        break;
                    case "TYPE_STRING":
                    case 9:
                        message.type = 9;
                        break;
                    case "TYPE_GROUP":
                    case 10:
                        message.type = 10;
                        break;
                    case "TYPE_MESSAGE":
                    case 11:
                        message.type = 11;
                        break;
                    case "TYPE_BYTES":
                    case 12:
                        message.type = 12;
                        break;
                    case "TYPE_UINT32":
                    case 13:
                        message.type = 13;
                        break;
                    case "TYPE_ENUM":
                    case 14:
                        message.type = 14;
                        break;
                    case "TYPE_SFIXED32":
                    case 15:
                        message.type = 15;
                        break;
                    case "TYPE_SFIXED64":
                    case 16:
                        message.type = 16;
                        break;
                    case "TYPE_SINT32":
                    case 17:
                        message.type = 17;
                        break;
                    case "TYPE_SINT64":
                    case 18:
                        message.type = 18;
                        break;
                    }
                    if (object.typeName != null)
                        message.typeName = String(object.typeName);
                    if (object.extendee != null)
                        message.extendee = String(object.extendee);
                    if (object.defaultValue != null)
                        message.defaultValue = String(object.defaultValue);
                    if (object.oneofIndex != null)
                        message.oneofIndex = object.oneofIndex | 0;
                    if (object.jsonName != null)
                        message.jsonName = String(object.jsonName);
                    if (object.options != null) {
                        if (typeof object.options !== "object")
                            throw TypeError(".google.protobuf.FieldDescriptorProto.options: object expected");
                        message.options = $root.google.protobuf.FieldOptions.fromObject(object.options);
                    }
                    if (object.proto3Optional != null)
                        message.proto3Optional = Boolean(object.proto3Optional);
                    return message;
                };
    
                /**
                 * Creates a plain object from a FieldDescriptorProto message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @static
                 * @param {google.protobuf.FieldDescriptorProto} message FieldDescriptorProto
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                FieldDescriptorProto.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.name = "";
                        object.extendee = "";
                        object.number = 0;
                        object.label = options.enums === String ? "LABEL_OPTIONAL" : 1;
                        object.type = options.enums === String ? "TYPE_DOUBLE" : 1;
                        object.typeName = "";
                        object.defaultValue = "";
                        object.options = null;
                        object.oneofIndex = 0;
                        object.jsonName = "";
                        object.proto3Optional = false;
                    }
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    if (message.extendee != null && message.hasOwnProperty("extendee"))
                        object.extendee = message.extendee;
                    if (message.number != null && message.hasOwnProperty("number"))
                        object.number = message.number;
                    if (message.label != null && message.hasOwnProperty("label"))
                        object.label = options.enums === String ? $root.google.protobuf.FieldDescriptorProto.Label[message.label] : message.label;
                    if (message.type != null && message.hasOwnProperty("type"))
                        object.type = options.enums === String ? $root.google.protobuf.FieldDescriptorProto.Type[message.type] : message.type;
                    if (message.typeName != null && message.hasOwnProperty("typeName"))
                        object.typeName = message.typeName;
                    if (message.defaultValue != null && message.hasOwnProperty("defaultValue"))
                        object.defaultValue = message.defaultValue;
                    if (message.options != null && message.hasOwnProperty("options"))
                        object.options = $root.google.protobuf.FieldOptions.toObject(message.options, options);
                    if (message.oneofIndex != null && message.hasOwnProperty("oneofIndex"))
                        object.oneofIndex = message.oneofIndex;
                    if (message.jsonName != null && message.hasOwnProperty("jsonName"))
                        object.jsonName = message.jsonName;
                    if (message.proto3Optional != null && message.hasOwnProperty("proto3Optional"))
                        object.proto3Optional = message.proto3Optional;
                    return object;
                };
    
                /**
                 * Converts this FieldDescriptorProto to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.FieldDescriptorProto
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                FieldDescriptorProto.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * Type enum.
                 * @name google.protobuf.FieldDescriptorProto.Type
                 * @enum {number}
                 * @property {number} TYPE_DOUBLE=1 TYPE_DOUBLE value
                 * @property {number} TYPE_FLOAT=2 TYPE_FLOAT value
                 * @property {number} TYPE_INT64=3 TYPE_INT64 value
                 * @property {number} TYPE_UINT64=4 TYPE_UINT64 value
                 * @property {number} TYPE_INT32=5 TYPE_INT32 value
                 * @property {number} TYPE_FIXED64=6 TYPE_FIXED64 value
                 * @property {number} TYPE_FIXED32=7 TYPE_FIXED32 value
                 * @property {number} TYPE_BOOL=8 TYPE_BOOL value
                 * @property {number} TYPE_STRING=9 TYPE_STRING value
                 * @property {number} TYPE_GROUP=10 TYPE_GROUP value
                 * @property {number} TYPE_MESSAGE=11 TYPE_MESSAGE value
                 * @property {number} TYPE_BYTES=12 TYPE_BYTES value
                 * @property {number} TYPE_UINT32=13 TYPE_UINT32 value
                 * @property {number} TYPE_ENUM=14 TYPE_ENUM value
                 * @property {number} TYPE_SFIXED32=15 TYPE_SFIXED32 value
                 * @property {number} TYPE_SFIXED64=16 TYPE_SFIXED64 value
                 * @property {number} TYPE_SINT32=17 TYPE_SINT32 value
                 * @property {number} TYPE_SINT64=18 TYPE_SINT64 value
                 */
                FieldDescriptorProto.Type = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[1] = "TYPE_DOUBLE"] = 1;
                    values[valuesById[2] = "TYPE_FLOAT"] = 2;
                    values[valuesById[3] = "TYPE_INT64"] = 3;
                    values[valuesById[4] = "TYPE_UINT64"] = 4;
                    values[valuesById[5] = "TYPE_INT32"] = 5;
                    values[valuesById[6] = "TYPE_FIXED64"] = 6;
                    values[valuesById[7] = "TYPE_FIXED32"] = 7;
                    values[valuesById[8] = "TYPE_BOOL"] = 8;
                    values[valuesById[9] = "TYPE_STRING"] = 9;
                    values[valuesById[10] = "TYPE_GROUP"] = 10;
                    values[valuesById[11] = "TYPE_MESSAGE"] = 11;
                    values[valuesById[12] = "TYPE_BYTES"] = 12;
                    values[valuesById[13] = "TYPE_UINT32"] = 13;
                    values[valuesById[14] = "TYPE_ENUM"] = 14;
                    values[valuesById[15] = "TYPE_SFIXED32"] = 15;
                    values[valuesById[16] = "TYPE_SFIXED64"] = 16;
                    values[valuesById[17] = "TYPE_SINT32"] = 17;
                    values[valuesById[18] = "TYPE_SINT64"] = 18;
                    return values;
                })();
    
                /**
                 * Label enum.
                 * @name google.protobuf.FieldDescriptorProto.Label
                 * @enum {number}
                 * @property {number} LABEL_OPTIONAL=1 LABEL_OPTIONAL value
                 * @property {number} LABEL_REQUIRED=2 LABEL_REQUIRED value
                 * @property {number} LABEL_REPEATED=3 LABEL_REPEATED value
                 */
                FieldDescriptorProto.Label = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[1] = "LABEL_OPTIONAL"] = 1;
                    values[valuesById[2] = "LABEL_REQUIRED"] = 2;
                    values[valuesById[3] = "LABEL_REPEATED"] = 3;
                    return values;
                })();
    
                return FieldDescriptorProto;
            })();
    
            protobuf.OneofDescriptorProto = (function() {
    
                /**
                 * Properties of an OneofDescriptorProto.
                 * @memberof google.protobuf
                 * @interface IOneofDescriptorProto
                 * @property {string|null} [name] OneofDescriptorProto name
                 * @property {google.protobuf.IOneofOptions|null} [options] OneofDescriptorProto options
                 */
    
                /**
                 * Constructs a new OneofDescriptorProto.
                 * @memberof google.protobuf
                 * @classdesc Represents an OneofDescriptorProto.
                 * @implements IOneofDescriptorProto
                 * @constructor
                 * @param {google.protobuf.IOneofDescriptorProto=} [properties] Properties to set
                 */
                function OneofDescriptorProto(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * OneofDescriptorProto name.
                 * @member {string} name
                 * @memberof google.protobuf.OneofDescriptorProto
                 * @instance
                 */
                OneofDescriptorProto.prototype.name = "";
    
                /**
                 * OneofDescriptorProto options.
                 * @member {google.protobuf.IOneofOptions|null|undefined} options
                 * @memberof google.protobuf.OneofDescriptorProto
                 * @instance
                 */
                OneofDescriptorProto.prototype.options = null;
    
                /**
                 * Creates a new OneofDescriptorProto instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.OneofDescriptorProto
                 * @static
                 * @param {google.protobuf.IOneofDescriptorProto=} [properties] Properties to set
                 * @returns {google.protobuf.OneofDescriptorProto} OneofDescriptorProto instance
                 */
                OneofDescriptorProto.create = function create(properties) {
                    return new OneofDescriptorProto(properties);
                };
    
                /**
                 * Encodes the specified OneofDescriptorProto message. Does not implicitly {@link google.protobuf.OneofDescriptorProto.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.OneofDescriptorProto
                 * @static
                 * @param {google.protobuf.IOneofDescriptorProto} message OneofDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                OneofDescriptorProto.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    if (message.options != null && Object.hasOwnProperty.call(message, "options"))
                        $root.google.protobuf.OneofOptions.encode(message.options, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified OneofDescriptorProto message, length delimited. Does not implicitly {@link google.protobuf.OneofDescriptorProto.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.OneofDescriptorProto
                 * @static
                 * @param {google.protobuf.IOneofDescriptorProto} message OneofDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                OneofDescriptorProto.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an OneofDescriptorProto message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.OneofDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.OneofDescriptorProto} OneofDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                OneofDescriptorProto.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.OneofDescriptorProto();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.name = reader.string();
                            break;
                        case 2:
                            message.options = $root.google.protobuf.OneofOptions.decode(reader, reader.uint32());
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an OneofDescriptorProto message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.OneofDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.OneofDescriptorProto} OneofDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                OneofDescriptorProto.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an OneofDescriptorProto message.
                 * @function verify
                 * @memberof google.protobuf.OneofDescriptorProto
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                OneofDescriptorProto.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    if (message.options != null && message.hasOwnProperty("options")) {
                        var error = $root.google.protobuf.OneofOptions.verify(message.options);
                        if (error)
                            return "options." + error;
                    }
                    return null;
                };
    
                /**
                 * Creates an OneofDescriptorProto message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.OneofDescriptorProto
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.OneofDescriptorProto} OneofDescriptorProto
                 */
                OneofDescriptorProto.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.OneofDescriptorProto)
                        return object;
                    var message = new $root.google.protobuf.OneofDescriptorProto();
                    if (object.name != null)
                        message.name = String(object.name);
                    if (object.options != null) {
                        if (typeof object.options !== "object")
                            throw TypeError(".google.protobuf.OneofDescriptorProto.options: object expected");
                        message.options = $root.google.protobuf.OneofOptions.fromObject(object.options);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from an OneofDescriptorProto message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.OneofDescriptorProto
                 * @static
                 * @param {google.protobuf.OneofDescriptorProto} message OneofDescriptorProto
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                OneofDescriptorProto.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.name = "";
                        object.options = null;
                    }
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    if (message.options != null && message.hasOwnProperty("options"))
                        object.options = $root.google.protobuf.OneofOptions.toObject(message.options, options);
                    return object;
                };
    
                /**
                 * Converts this OneofDescriptorProto to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.OneofDescriptorProto
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                OneofDescriptorProto.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return OneofDescriptorProto;
            })();
    
            protobuf.EnumDescriptorProto = (function() {
    
                /**
                 * Properties of an EnumDescriptorProto.
                 * @memberof google.protobuf
                 * @interface IEnumDescriptorProto
                 * @property {string|null} [name] EnumDescriptorProto name
                 * @property {Array.<google.protobuf.IEnumValueDescriptorProto>|null} [value] EnumDescriptorProto value
                 * @property {google.protobuf.IEnumOptions|null} [options] EnumDescriptorProto options
                 * @property {Array.<google.protobuf.EnumDescriptorProto.IEnumReservedRange>|null} [reservedRange] EnumDescriptorProto reservedRange
                 * @property {Array.<string>|null} [reservedName] EnumDescriptorProto reservedName
                 */
    
                /**
                 * Constructs a new EnumDescriptorProto.
                 * @memberof google.protobuf
                 * @classdesc Represents an EnumDescriptorProto.
                 * @implements IEnumDescriptorProto
                 * @constructor
                 * @param {google.protobuf.IEnumDescriptorProto=} [properties] Properties to set
                 */
                function EnumDescriptorProto(properties) {
                    this.value = [];
                    this.reservedRange = [];
                    this.reservedName = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * EnumDescriptorProto name.
                 * @member {string} name
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @instance
                 */
                EnumDescriptorProto.prototype.name = "";
    
                /**
                 * EnumDescriptorProto value.
                 * @member {Array.<google.protobuf.IEnumValueDescriptorProto>} value
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @instance
                 */
                EnumDescriptorProto.prototype.value = $util.emptyArray;
    
                /**
                 * EnumDescriptorProto options.
                 * @member {google.protobuf.IEnumOptions|null|undefined} options
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @instance
                 */
                EnumDescriptorProto.prototype.options = null;
    
                /**
                 * EnumDescriptorProto reservedRange.
                 * @member {Array.<google.protobuf.EnumDescriptorProto.IEnumReservedRange>} reservedRange
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @instance
                 */
                EnumDescriptorProto.prototype.reservedRange = $util.emptyArray;
    
                /**
                 * EnumDescriptorProto reservedName.
                 * @member {Array.<string>} reservedName
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @instance
                 */
                EnumDescriptorProto.prototype.reservedName = $util.emptyArray;
    
                /**
                 * Creates a new EnumDescriptorProto instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @static
                 * @param {google.protobuf.IEnumDescriptorProto=} [properties] Properties to set
                 * @returns {google.protobuf.EnumDescriptorProto} EnumDescriptorProto instance
                 */
                EnumDescriptorProto.create = function create(properties) {
                    return new EnumDescriptorProto(properties);
                };
    
                /**
                 * Encodes the specified EnumDescriptorProto message. Does not implicitly {@link google.protobuf.EnumDescriptorProto.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @static
                 * @param {google.protobuf.IEnumDescriptorProto} message EnumDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                EnumDescriptorProto.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    if (message.value != null && message.value.length)
                        for (var i = 0; i < message.value.length; ++i)
                            $root.google.protobuf.EnumValueDescriptorProto.encode(message.value[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                    if (message.options != null && Object.hasOwnProperty.call(message, "options"))
                        $root.google.protobuf.EnumOptions.encode(message.options, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                    if (message.reservedRange != null && message.reservedRange.length)
                        for (var i = 0; i < message.reservedRange.length; ++i)
                            $root.google.protobuf.EnumDescriptorProto.EnumReservedRange.encode(message.reservedRange[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                    if (message.reservedName != null && message.reservedName.length)
                        for (var i = 0; i < message.reservedName.length; ++i)
                            writer.uint32(/* id 5, wireType 2 =*/42).string(message.reservedName[i]);
                    return writer;
                };
    
                /**
                 * Encodes the specified EnumDescriptorProto message, length delimited. Does not implicitly {@link google.protobuf.EnumDescriptorProto.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @static
                 * @param {google.protobuf.IEnumDescriptorProto} message EnumDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                EnumDescriptorProto.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an EnumDescriptorProto message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.EnumDescriptorProto} EnumDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                EnumDescriptorProto.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.EnumDescriptorProto();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.name = reader.string();
                            break;
                        case 2:
                            if (!(message.value && message.value.length))
                                message.value = [];
                            message.value.push($root.google.protobuf.EnumValueDescriptorProto.decode(reader, reader.uint32()));
                            break;
                        case 3:
                            message.options = $root.google.protobuf.EnumOptions.decode(reader, reader.uint32());
                            break;
                        case 4:
                            if (!(message.reservedRange && message.reservedRange.length))
                                message.reservedRange = [];
                            message.reservedRange.push($root.google.protobuf.EnumDescriptorProto.EnumReservedRange.decode(reader, reader.uint32()));
                            break;
                        case 5:
                            if (!(message.reservedName && message.reservedName.length))
                                message.reservedName = [];
                            message.reservedName.push(reader.string());
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an EnumDescriptorProto message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.EnumDescriptorProto} EnumDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                EnumDescriptorProto.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an EnumDescriptorProto message.
                 * @function verify
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                EnumDescriptorProto.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    if (message.value != null && message.hasOwnProperty("value")) {
                        if (!Array.isArray(message.value))
                            return "value: array expected";
                        for (var i = 0; i < message.value.length; ++i) {
                            var error = $root.google.protobuf.EnumValueDescriptorProto.verify(message.value[i]);
                            if (error)
                                return "value." + error;
                        }
                    }
                    if (message.options != null && message.hasOwnProperty("options")) {
                        var error = $root.google.protobuf.EnumOptions.verify(message.options);
                        if (error)
                            return "options." + error;
                    }
                    if (message.reservedRange != null && message.hasOwnProperty("reservedRange")) {
                        if (!Array.isArray(message.reservedRange))
                            return "reservedRange: array expected";
                        for (var i = 0; i < message.reservedRange.length; ++i) {
                            var error = $root.google.protobuf.EnumDescriptorProto.EnumReservedRange.verify(message.reservedRange[i]);
                            if (error)
                                return "reservedRange." + error;
                        }
                    }
                    if (message.reservedName != null && message.hasOwnProperty("reservedName")) {
                        if (!Array.isArray(message.reservedName))
                            return "reservedName: array expected";
                        for (var i = 0; i < message.reservedName.length; ++i)
                            if (!$util.isString(message.reservedName[i]))
                                return "reservedName: string[] expected";
                    }
                    return null;
                };
    
                /**
                 * Creates an EnumDescriptorProto message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.EnumDescriptorProto} EnumDescriptorProto
                 */
                EnumDescriptorProto.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.EnumDescriptorProto)
                        return object;
                    var message = new $root.google.protobuf.EnumDescriptorProto();
                    if (object.name != null)
                        message.name = String(object.name);
                    if (object.value) {
                        if (!Array.isArray(object.value))
                            throw TypeError(".google.protobuf.EnumDescriptorProto.value: array expected");
                        message.value = [];
                        for (var i = 0; i < object.value.length; ++i) {
                            if (typeof object.value[i] !== "object")
                                throw TypeError(".google.protobuf.EnumDescriptorProto.value: object expected");
                            message.value[i] = $root.google.protobuf.EnumValueDescriptorProto.fromObject(object.value[i]);
                        }
                    }
                    if (object.options != null) {
                        if (typeof object.options !== "object")
                            throw TypeError(".google.protobuf.EnumDescriptorProto.options: object expected");
                        message.options = $root.google.protobuf.EnumOptions.fromObject(object.options);
                    }
                    if (object.reservedRange) {
                        if (!Array.isArray(object.reservedRange))
                            throw TypeError(".google.protobuf.EnumDescriptorProto.reservedRange: array expected");
                        message.reservedRange = [];
                        for (var i = 0; i < object.reservedRange.length; ++i) {
                            if (typeof object.reservedRange[i] !== "object")
                                throw TypeError(".google.protobuf.EnumDescriptorProto.reservedRange: object expected");
                            message.reservedRange[i] = $root.google.protobuf.EnumDescriptorProto.EnumReservedRange.fromObject(object.reservedRange[i]);
                        }
                    }
                    if (object.reservedName) {
                        if (!Array.isArray(object.reservedName))
                            throw TypeError(".google.protobuf.EnumDescriptorProto.reservedName: array expected");
                        message.reservedName = [];
                        for (var i = 0; i < object.reservedName.length; ++i)
                            message.reservedName[i] = String(object.reservedName[i]);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from an EnumDescriptorProto message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @static
                 * @param {google.protobuf.EnumDescriptorProto} message EnumDescriptorProto
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                EnumDescriptorProto.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults) {
                        object.value = [];
                        object.reservedRange = [];
                        object.reservedName = [];
                    }
                    if (options.defaults) {
                        object.name = "";
                        object.options = null;
                    }
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    if (message.value && message.value.length) {
                        object.value = [];
                        for (var j = 0; j < message.value.length; ++j)
                            object.value[j] = $root.google.protobuf.EnumValueDescriptorProto.toObject(message.value[j], options);
                    }
                    if (message.options != null && message.hasOwnProperty("options"))
                        object.options = $root.google.protobuf.EnumOptions.toObject(message.options, options);
                    if (message.reservedRange && message.reservedRange.length) {
                        object.reservedRange = [];
                        for (var j = 0; j < message.reservedRange.length; ++j)
                            object.reservedRange[j] = $root.google.protobuf.EnumDescriptorProto.EnumReservedRange.toObject(message.reservedRange[j], options);
                    }
                    if (message.reservedName && message.reservedName.length) {
                        object.reservedName = [];
                        for (var j = 0; j < message.reservedName.length; ++j)
                            object.reservedName[j] = message.reservedName[j];
                    }
                    return object;
                };
    
                /**
                 * Converts this EnumDescriptorProto to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.EnumDescriptorProto
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                EnumDescriptorProto.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                EnumDescriptorProto.EnumReservedRange = (function() {
    
                    /**
                     * Properties of an EnumReservedRange.
                     * @memberof google.protobuf.EnumDescriptorProto
                     * @interface IEnumReservedRange
                     * @property {number|null} [start] EnumReservedRange start
                     * @property {number|null} [end] EnumReservedRange end
                     */
    
                    /**
                     * Constructs a new EnumReservedRange.
                     * @memberof google.protobuf.EnumDescriptorProto
                     * @classdesc Represents an EnumReservedRange.
                     * @implements IEnumReservedRange
                     * @constructor
                     * @param {google.protobuf.EnumDescriptorProto.IEnumReservedRange=} [properties] Properties to set
                     */
                    function EnumReservedRange(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * EnumReservedRange start.
                     * @member {number} start
                     * @memberof google.protobuf.EnumDescriptorProto.EnumReservedRange
                     * @instance
                     */
                    EnumReservedRange.prototype.start = 0;
    
                    /**
                     * EnumReservedRange end.
                     * @member {number} end
                     * @memberof google.protobuf.EnumDescriptorProto.EnumReservedRange
                     * @instance
                     */
                    EnumReservedRange.prototype.end = 0;
    
                    /**
                     * Creates a new EnumReservedRange instance using the specified properties.
                     * @function create
                     * @memberof google.protobuf.EnumDescriptorProto.EnumReservedRange
                     * @static
                     * @param {google.protobuf.EnumDescriptorProto.IEnumReservedRange=} [properties] Properties to set
                     * @returns {google.protobuf.EnumDescriptorProto.EnumReservedRange} EnumReservedRange instance
                     */
                    EnumReservedRange.create = function create(properties) {
                        return new EnumReservedRange(properties);
                    };
    
                    /**
                     * Encodes the specified EnumReservedRange message. Does not implicitly {@link google.protobuf.EnumDescriptorProto.EnumReservedRange.verify|verify} messages.
                     * @function encode
                     * @memberof google.protobuf.EnumDescriptorProto.EnumReservedRange
                     * @static
                     * @param {google.protobuf.EnumDescriptorProto.IEnumReservedRange} message EnumReservedRange message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    EnumReservedRange.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                            writer.uint32(/* id 1, wireType 0 =*/8).int32(message.start);
                        if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                            writer.uint32(/* id 2, wireType 0 =*/16).int32(message.end);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified EnumReservedRange message, length delimited. Does not implicitly {@link google.protobuf.EnumDescriptorProto.EnumReservedRange.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.protobuf.EnumDescriptorProto.EnumReservedRange
                     * @static
                     * @param {google.protobuf.EnumDescriptorProto.IEnumReservedRange} message EnumReservedRange message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    EnumReservedRange.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes an EnumReservedRange message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.protobuf.EnumDescriptorProto.EnumReservedRange
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.protobuf.EnumDescriptorProto.EnumReservedRange} EnumReservedRange
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    EnumReservedRange.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.EnumDescriptorProto.EnumReservedRange();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.start = reader.int32();
                                break;
                            case 2:
                                message.end = reader.int32();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes an EnumReservedRange message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.protobuf.EnumDescriptorProto.EnumReservedRange
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.protobuf.EnumDescriptorProto.EnumReservedRange} EnumReservedRange
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    EnumReservedRange.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies an EnumReservedRange message.
                     * @function verify
                     * @memberof google.protobuf.EnumDescriptorProto.EnumReservedRange
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    EnumReservedRange.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.start != null && message.hasOwnProperty("start"))
                            if (!$util.isInteger(message.start))
                                return "start: integer expected";
                        if (message.end != null && message.hasOwnProperty("end"))
                            if (!$util.isInteger(message.end))
                                return "end: integer expected";
                        return null;
                    };
    
                    /**
                     * Creates an EnumReservedRange message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.protobuf.EnumDescriptorProto.EnumReservedRange
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.protobuf.EnumDescriptorProto.EnumReservedRange} EnumReservedRange
                     */
                    EnumReservedRange.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.protobuf.EnumDescriptorProto.EnumReservedRange)
                            return object;
                        var message = new $root.google.protobuf.EnumDescriptorProto.EnumReservedRange();
                        if (object.start != null)
                            message.start = object.start | 0;
                        if (object.end != null)
                            message.end = object.end | 0;
                        return message;
                    };
    
                    /**
                     * Creates a plain object from an EnumReservedRange message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.protobuf.EnumDescriptorProto.EnumReservedRange
                     * @static
                     * @param {google.protobuf.EnumDescriptorProto.EnumReservedRange} message EnumReservedRange
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    EnumReservedRange.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.start = 0;
                            object.end = 0;
                        }
                        if (message.start != null && message.hasOwnProperty("start"))
                            object.start = message.start;
                        if (message.end != null && message.hasOwnProperty("end"))
                            object.end = message.end;
                        return object;
                    };
    
                    /**
                     * Converts this EnumReservedRange to JSON.
                     * @function toJSON
                     * @memberof google.protobuf.EnumDescriptorProto.EnumReservedRange
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    EnumReservedRange.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return EnumReservedRange;
                })();
    
                return EnumDescriptorProto;
            })();
    
            protobuf.EnumValueDescriptorProto = (function() {
    
                /**
                 * Properties of an EnumValueDescriptorProto.
                 * @memberof google.protobuf
                 * @interface IEnumValueDescriptorProto
                 * @property {string|null} [name] EnumValueDescriptorProto name
                 * @property {number|null} [number] EnumValueDescriptorProto number
                 * @property {google.protobuf.IEnumValueOptions|null} [options] EnumValueDescriptorProto options
                 */
    
                /**
                 * Constructs a new EnumValueDescriptorProto.
                 * @memberof google.protobuf
                 * @classdesc Represents an EnumValueDescriptorProto.
                 * @implements IEnumValueDescriptorProto
                 * @constructor
                 * @param {google.protobuf.IEnumValueDescriptorProto=} [properties] Properties to set
                 */
                function EnumValueDescriptorProto(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * EnumValueDescriptorProto name.
                 * @member {string} name
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @instance
                 */
                EnumValueDescriptorProto.prototype.name = "";
    
                /**
                 * EnumValueDescriptorProto number.
                 * @member {number} number
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @instance
                 */
                EnumValueDescriptorProto.prototype.number = 0;
    
                /**
                 * EnumValueDescriptorProto options.
                 * @member {google.protobuf.IEnumValueOptions|null|undefined} options
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @instance
                 */
                EnumValueDescriptorProto.prototype.options = null;
    
                /**
                 * Creates a new EnumValueDescriptorProto instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @static
                 * @param {google.protobuf.IEnumValueDescriptorProto=} [properties] Properties to set
                 * @returns {google.protobuf.EnumValueDescriptorProto} EnumValueDescriptorProto instance
                 */
                EnumValueDescriptorProto.create = function create(properties) {
                    return new EnumValueDescriptorProto(properties);
                };
    
                /**
                 * Encodes the specified EnumValueDescriptorProto message. Does not implicitly {@link google.protobuf.EnumValueDescriptorProto.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @static
                 * @param {google.protobuf.IEnumValueDescriptorProto} message EnumValueDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                EnumValueDescriptorProto.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    if (message.number != null && Object.hasOwnProperty.call(message, "number"))
                        writer.uint32(/* id 2, wireType 0 =*/16).int32(message.number);
                    if (message.options != null && Object.hasOwnProperty.call(message, "options"))
                        $root.google.protobuf.EnumValueOptions.encode(message.options, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified EnumValueDescriptorProto message, length delimited. Does not implicitly {@link google.protobuf.EnumValueDescriptorProto.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @static
                 * @param {google.protobuf.IEnumValueDescriptorProto} message EnumValueDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                EnumValueDescriptorProto.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an EnumValueDescriptorProto message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.EnumValueDescriptorProto} EnumValueDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                EnumValueDescriptorProto.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.EnumValueDescriptorProto();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.name = reader.string();
                            break;
                        case 2:
                            message.number = reader.int32();
                            break;
                        case 3:
                            message.options = $root.google.protobuf.EnumValueOptions.decode(reader, reader.uint32());
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an EnumValueDescriptorProto message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.EnumValueDescriptorProto} EnumValueDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                EnumValueDescriptorProto.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an EnumValueDescriptorProto message.
                 * @function verify
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                EnumValueDescriptorProto.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    if (message.number != null && message.hasOwnProperty("number"))
                        if (!$util.isInteger(message.number))
                            return "number: integer expected";
                    if (message.options != null && message.hasOwnProperty("options")) {
                        var error = $root.google.protobuf.EnumValueOptions.verify(message.options);
                        if (error)
                            return "options." + error;
                    }
                    return null;
                };
    
                /**
                 * Creates an EnumValueDescriptorProto message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.EnumValueDescriptorProto} EnumValueDescriptorProto
                 */
                EnumValueDescriptorProto.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.EnumValueDescriptorProto)
                        return object;
                    var message = new $root.google.protobuf.EnumValueDescriptorProto();
                    if (object.name != null)
                        message.name = String(object.name);
                    if (object.number != null)
                        message.number = object.number | 0;
                    if (object.options != null) {
                        if (typeof object.options !== "object")
                            throw TypeError(".google.protobuf.EnumValueDescriptorProto.options: object expected");
                        message.options = $root.google.protobuf.EnumValueOptions.fromObject(object.options);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from an EnumValueDescriptorProto message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @static
                 * @param {google.protobuf.EnumValueDescriptorProto} message EnumValueDescriptorProto
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                EnumValueDescriptorProto.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.name = "";
                        object.number = 0;
                        object.options = null;
                    }
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    if (message.number != null && message.hasOwnProperty("number"))
                        object.number = message.number;
                    if (message.options != null && message.hasOwnProperty("options"))
                        object.options = $root.google.protobuf.EnumValueOptions.toObject(message.options, options);
                    return object;
                };
    
                /**
                 * Converts this EnumValueDescriptorProto to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.EnumValueDescriptorProto
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                EnumValueDescriptorProto.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return EnumValueDescriptorProto;
            })();
    
            protobuf.ServiceDescriptorProto = (function() {
    
                /**
                 * Properties of a ServiceDescriptorProto.
                 * @memberof google.protobuf
                 * @interface IServiceDescriptorProto
                 * @property {string|null} [name] ServiceDescriptorProto name
                 * @property {Array.<google.protobuf.IMethodDescriptorProto>|null} [method] ServiceDescriptorProto method
                 * @property {google.protobuf.IServiceOptions|null} [options] ServiceDescriptorProto options
                 */
    
                /**
                 * Constructs a new ServiceDescriptorProto.
                 * @memberof google.protobuf
                 * @classdesc Represents a ServiceDescriptorProto.
                 * @implements IServiceDescriptorProto
                 * @constructor
                 * @param {google.protobuf.IServiceDescriptorProto=} [properties] Properties to set
                 */
                function ServiceDescriptorProto(properties) {
                    this.method = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * ServiceDescriptorProto name.
                 * @member {string} name
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @instance
                 */
                ServiceDescriptorProto.prototype.name = "";
    
                /**
                 * ServiceDescriptorProto method.
                 * @member {Array.<google.protobuf.IMethodDescriptorProto>} method
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @instance
                 */
                ServiceDescriptorProto.prototype.method = $util.emptyArray;
    
                /**
                 * ServiceDescriptorProto options.
                 * @member {google.protobuf.IServiceOptions|null|undefined} options
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @instance
                 */
                ServiceDescriptorProto.prototype.options = null;
    
                /**
                 * Creates a new ServiceDescriptorProto instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @static
                 * @param {google.protobuf.IServiceDescriptorProto=} [properties] Properties to set
                 * @returns {google.protobuf.ServiceDescriptorProto} ServiceDescriptorProto instance
                 */
                ServiceDescriptorProto.create = function create(properties) {
                    return new ServiceDescriptorProto(properties);
                };
    
                /**
                 * Encodes the specified ServiceDescriptorProto message. Does not implicitly {@link google.protobuf.ServiceDescriptorProto.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @static
                 * @param {google.protobuf.IServiceDescriptorProto} message ServiceDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ServiceDescriptorProto.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    if (message.method != null && message.method.length)
                        for (var i = 0; i < message.method.length; ++i)
                            $root.google.protobuf.MethodDescriptorProto.encode(message.method[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                    if (message.options != null && Object.hasOwnProperty.call(message, "options"))
                        $root.google.protobuf.ServiceOptions.encode(message.options, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified ServiceDescriptorProto message, length delimited. Does not implicitly {@link google.protobuf.ServiceDescriptorProto.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @static
                 * @param {google.protobuf.IServiceDescriptorProto} message ServiceDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ServiceDescriptorProto.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a ServiceDescriptorProto message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.ServiceDescriptorProto} ServiceDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ServiceDescriptorProto.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.ServiceDescriptorProto();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.name = reader.string();
                            break;
                        case 2:
                            if (!(message.method && message.method.length))
                                message.method = [];
                            message.method.push($root.google.protobuf.MethodDescriptorProto.decode(reader, reader.uint32()));
                            break;
                        case 3:
                            message.options = $root.google.protobuf.ServiceOptions.decode(reader, reader.uint32());
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a ServiceDescriptorProto message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.ServiceDescriptorProto} ServiceDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ServiceDescriptorProto.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a ServiceDescriptorProto message.
                 * @function verify
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                ServiceDescriptorProto.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    if (message.method != null && message.hasOwnProperty("method")) {
                        if (!Array.isArray(message.method))
                            return "method: array expected";
                        for (var i = 0; i < message.method.length; ++i) {
                            var error = $root.google.protobuf.MethodDescriptorProto.verify(message.method[i]);
                            if (error)
                                return "method." + error;
                        }
                    }
                    if (message.options != null && message.hasOwnProperty("options")) {
                        var error = $root.google.protobuf.ServiceOptions.verify(message.options);
                        if (error)
                            return "options." + error;
                    }
                    return null;
                };
    
                /**
                 * Creates a ServiceDescriptorProto message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.ServiceDescriptorProto} ServiceDescriptorProto
                 */
                ServiceDescriptorProto.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.ServiceDescriptorProto)
                        return object;
                    var message = new $root.google.protobuf.ServiceDescriptorProto();
                    if (object.name != null)
                        message.name = String(object.name);
                    if (object.method) {
                        if (!Array.isArray(object.method))
                            throw TypeError(".google.protobuf.ServiceDescriptorProto.method: array expected");
                        message.method = [];
                        for (var i = 0; i < object.method.length; ++i) {
                            if (typeof object.method[i] !== "object")
                                throw TypeError(".google.protobuf.ServiceDescriptorProto.method: object expected");
                            message.method[i] = $root.google.protobuf.MethodDescriptorProto.fromObject(object.method[i]);
                        }
                    }
                    if (object.options != null) {
                        if (typeof object.options !== "object")
                            throw TypeError(".google.protobuf.ServiceDescriptorProto.options: object expected");
                        message.options = $root.google.protobuf.ServiceOptions.fromObject(object.options);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a ServiceDescriptorProto message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @static
                 * @param {google.protobuf.ServiceDescriptorProto} message ServiceDescriptorProto
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                ServiceDescriptorProto.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.method = [];
                    if (options.defaults) {
                        object.name = "";
                        object.options = null;
                    }
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    if (message.method && message.method.length) {
                        object.method = [];
                        for (var j = 0; j < message.method.length; ++j)
                            object.method[j] = $root.google.protobuf.MethodDescriptorProto.toObject(message.method[j], options);
                    }
                    if (message.options != null && message.hasOwnProperty("options"))
                        object.options = $root.google.protobuf.ServiceOptions.toObject(message.options, options);
                    return object;
                };
    
                /**
                 * Converts this ServiceDescriptorProto to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.ServiceDescriptorProto
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                ServiceDescriptorProto.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return ServiceDescriptorProto;
            })();
    
            protobuf.MethodDescriptorProto = (function() {
    
                /**
                 * Properties of a MethodDescriptorProto.
                 * @memberof google.protobuf
                 * @interface IMethodDescriptorProto
                 * @property {string|null} [name] MethodDescriptorProto name
                 * @property {string|null} [inputType] MethodDescriptorProto inputType
                 * @property {string|null} [outputType] MethodDescriptorProto outputType
                 * @property {google.protobuf.IMethodOptions|null} [options] MethodDescriptorProto options
                 * @property {boolean|null} [clientStreaming] MethodDescriptorProto clientStreaming
                 * @property {boolean|null} [serverStreaming] MethodDescriptorProto serverStreaming
                 */
    
                /**
                 * Constructs a new MethodDescriptorProto.
                 * @memberof google.protobuf
                 * @classdesc Represents a MethodDescriptorProto.
                 * @implements IMethodDescriptorProto
                 * @constructor
                 * @param {google.protobuf.IMethodDescriptorProto=} [properties] Properties to set
                 */
                function MethodDescriptorProto(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * MethodDescriptorProto name.
                 * @member {string} name
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @instance
                 */
                MethodDescriptorProto.prototype.name = "";
    
                /**
                 * MethodDescriptorProto inputType.
                 * @member {string} inputType
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @instance
                 */
                MethodDescriptorProto.prototype.inputType = "";
    
                /**
                 * MethodDescriptorProto outputType.
                 * @member {string} outputType
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @instance
                 */
                MethodDescriptorProto.prototype.outputType = "";
    
                /**
                 * MethodDescriptorProto options.
                 * @member {google.protobuf.IMethodOptions|null|undefined} options
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @instance
                 */
                MethodDescriptorProto.prototype.options = null;
    
                /**
                 * MethodDescriptorProto clientStreaming.
                 * @member {boolean} clientStreaming
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @instance
                 */
                MethodDescriptorProto.prototype.clientStreaming = false;
    
                /**
                 * MethodDescriptorProto serverStreaming.
                 * @member {boolean} serverStreaming
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @instance
                 */
                MethodDescriptorProto.prototype.serverStreaming = false;
    
                /**
                 * Creates a new MethodDescriptorProto instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @static
                 * @param {google.protobuf.IMethodDescriptorProto=} [properties] Properties to set
                 * @returns {google.protobuf.MethodDescriptorProto} MethodDescriptorProto instance
                 */
                MethodDescriptorProto.create = function create(properties) {
                    return new MethodDescriptorProto(properties);
                };
    
                /**
                 * Encodes the specified MethodDescriptorProto message. Does not implicitly {@link google.protobuf.MethodDescriptorProto.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @static
                 * @param {google.protobuf.IMethodDescriptorProto} message MethodDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                MethodDescriptorProto.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    if (message.inputType != null && Object.hasOwnProperty.call(message, "inputType"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.inputType);
                    if (message.outputType != null && Object.hasOwnProperty.call(message, "outputType"))
                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.outputType);
                    if (message.options != null && Object.hasOwnProperty.call(message, "options"))
                        $root.google.protobuf.MethodOptions.encode(message.options, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                    if (message.clientStreaming != null && Object.hasOwnProperty.call(message, "clientStreaming"))
                        writer.uint32(/* id 5, wireType 0 =*/40).bool(message.clientStreaming);
                    if (message.serverStreaming != null && Object.hasOwnProperty.call(message, "serverStreaming"))
                        writer.uint32(/* id 6, wireType 0 =*/48).bool(message.serverStreaming);
                    return writer;
                };
    
                /**
                 * Encodes the specified MethodDescriptorProto message, length delimited. Does not implicitly {@link google.protobuf.MethodDescriptorProto.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @static
                 * @param {google.protobuf.IMethodDescriptorProto} message MethodDescriptorProto message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                MethodDescriptorProto.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a MethodDescriptorProto message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.MethodDescriptorProto} MethodDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                MethodDescriptorProto.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.MethodDescriptorProto();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.name = reader.string();
                            break;
                        case 2:
                            message.inputType = reader.string();
                            break;
                        case 3:
                            message.outputType = reader.string();
                            break;
                        case 4:
                            message.options = $root.google.protobuf.MethodOptions.decode(reader, reader.uint32());
                            break;
                        case 5:
                            message.clientStreaming = reader.bool();
                            break;
                        case 6:
                            message.serverStreaming = reader.bool();
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a MethodDescriptorProto message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.MethodDescriptorProto} MethodDescriptorProto
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                MethodDescriptorProto.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a MethodDescriptorProto message.
                 * @function verify
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                MethodDescriptorProto.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    if (message.inputType != null && message.hasOwnProperty("inputType"))
                        if (!$util.isString(message.inputType))
                            return "inputType: string expected";
                    if (message.outputType != null && message.hasOwnProperty("outputType"))
                        if (!$util.isString(message.outputType))
                            return "outputType: string expected";
                    if (message.options != null && message.hasOwnProperty("options")) {
                        var error = $root.google.protobuf.MethodOptions.verify(message.options);
                        if (error)
                            return "options." + error;
                    }
                    if (message.clientStreaming != null && message.hasOwnProperty("clientStreaming"))
                        if (typeof message.clientStreaming !== "boolean")
                            return "clientStreaming: boolean expected";
                    if (message.serverStreaming != null && message.hasOwnProperty("serverStreaming"))
                        if (typeof message.serverStreaming !== "boolean")
                            return "serverStreaming: boolean expected";
                    return null;
                };
    
                /**
                 * Creates a MethodDescriptorProto message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.MethodDescriptorProto} MethodDescriptorProto
                 */
                MethodDescriptorProto.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.MethodDescriptorProto)
                        return object;
                    var message = new $root.google.protobuf.MethodDescriptorProto();
                    if (object.name != null)
                        message.name = String(object.name);
                    if (object.inputType != null)
                        message.inputType = String(object.inputType);
                    if (object.outputType != null)
                        message.outputType = String(object.outputType);
                    if (object.options != null) {
                        if (typeof object.options !== "object")
                            throw TypeError(".google.protobuf.MethodDescriptorProto.options: object expected");
                        message.options = $root.google.protobuf.MethodOptions.fromObject(object.options);
                    }
                    if (object.clientStreaming != null)
                        message.clientStreaming = Boolean(object.clientStreaming);
                    if (object.serverStreaming != null)
                        message.serverStreaming = Boolean(object.serverStreaming);
                    return message;
                };
    
                /**
                 * Creates a plain object from a MethodDescriptorProto message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @static
                 * @param {google.protobuf.MethodDescriptorProto} message MethodDescriptorProto
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                MethodDescriptorProto.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.name = "";
                        object.inputType = "";
                        object.outputType = "";
                        object.options = null;
                        object.clientStreaming = false;
                        object.serverStreaming = false;
                    }
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    if (message.inputType != null && message.hasOwnProperty("inputType"))
                        object.inputType = message.inputType;
                    if (message.outputType != null && message.hasOwnProperty("outputType"))
                        object.outputType = message.outputType;
                    if (message.options != null && message.hasOwnProperty("options"))
                        object.options = $root.google.protobuf.MethodOptions.toObject(message.options, options);
                    if (message.clientStreaming != null && message.hasOwnProperty("clientStreaming"))
                        object.clientStreaming = message.clientStreaming;
                    if (message.serverStreaming != null && message.hasOwnProperty("serverStreaming"))
                        object.serverStreaming = message.serverStreaming;
                    return object;
                };
    
                /**
                 * Converts this MethodDescriptorProto to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.MethodDescriptorProto
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                MethodDescriptorProto.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return MethodDescriptorProto;
            })();
    
            protobuf.FileOptions = (function() {
    
                /**
                 * Properties of a FileOptions.
                 * @memberof google.protobuf
                 * @interface IFileOptions
                 * @property {string|null} [javaPackage] FileOptions javaPackage
                 * @property {string|null} [javaOuterClassname] FileOptions javaOuterClassname
                 * @property {boolean|null} [javaMultipleFiles] FileOptions javaMultipleFiles
                 * @property {boolean|null} [javaGenerateEqualsAndHash] FileOptions javaGenerateEqualsAndHash
                 * @property {boolean|null} [javaStringCheckUtf8] FileOptions javaStringCheckUtf8
                 * @property {google.protobuf.FileOptions.OptimizeMode|null} [optimizeFor] FileOptions optimizeFor
                 * @property {string|null} [goPackage] FileOptions goPackage
                 * @property {boolean|null} [ccGenericServices] FileOptions ccGenericServices
                 * @property {boolean|null} [javaGenericServices] FileOptions javaGenericServices
                 * @property {boolean|null} [pyGenericServices] FileOptions pyGenericServices
                 * @property {boolean|null} [phpGenericServices] FileOptions phpGenericServices
                 * @property {boolean|null} [deprecated] FileOptions deprecated
                 * @property {boolean|null} [ccEnableArenas] FileOptions ccEnableArenas
                 * @property {string|null} [objcClassPrefix] FileOptions objcClassPrefix
                 * @property {string|null} [csharpNamespace] FileOptions csharpNamespace
                 * @property {string|null} [swiftPrefix] FileOptions swiftPrefix
                 * @property {string|null} [phpClassPrefix] FileOptions phpClassPrefix
                 * @property {string|null} [phpNamespace] FileOptions phpNamespace
                 * @property {string|null} [phpMetadataNamespace] FileOptions phpMetadataNamespace
                 * @property {string|null} [rubyPackage] FileOptions rubyPackage
                 * @property {Array.<google.protobuf.IUninterpretedOption>|null} [uninterpretedOption] FileOptions uninterpretedOption
                 * @property {Array.<google.api.IResourceDescriptor>|null} [".google.api.resourceDefinition"] FileOptions .google.api.resourceDefinition
                 */
    
                /**
                 * Constructs a new FileOptions.
                 * @memberof google.protobuf
                 * @classdesc Represents a FileOptions.
                 * @implements IFileOptions
                 * @constructor
                 * @param {google.protobuf.IFileOptions=} [properties] Properties to set
                 */
                function FileOptions(properties) {
                    this.uninterpretedOption = [];
                    this[".google.api.resourceDefinition"] = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * FileOptions javaPackage.
                 * @member {string} javaPackage
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.javaPackage = "";
    
                /**
                 * FileOptions javaOuterClassname.
                 * @member {string} javaOuterClassname
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.javaOuterClassname = "";
    
                /**
                 * FileOptions javaMultipleFiles.
                 * @member {boolean} javaMultipleFiles
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.javaMultipleFiles = false;
    
                /**
                 * FileOptions javaGenerateEqualsAndHash.
                 * @member {boolean} javaGenerateEqualsAndHash
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.javaGenerateEqualsAndHash = false;
    
                /**
                 * FileOptions javaStringCheckUtf8.
                 * @member {boolean} javaStringCheckUtf8
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.javaStringCheckUtf8 = false;
    
                /**
                 * FileOptions optimizeFor.
                 * @member {google.protobuf.FileOptions.OptimizeMode} optimizeFor
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.optimizeFor = 1;
    
                /**
                 * FileOptions goPackage.
                 * @member {string} goPackage
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.goPackage = "";
    
                /**
                 * FileOptions ccGenericServices.
                 * @member {boolean} ccGenericServices
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.ccGenericServices = false;
    
                /**
                 * FileOptions javaGenericServices.
                 * @member {boolean} javaGenericServices
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.javaGenericServices = false;
    
                /**
                 * FileOptions pyGenericServices.
                 * @member {boolean} pyGenericServices
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.pyGenericServices = false;
    
                /**
                 * FileOptions phpGenericServices.
                 * @member {boolean} phpGenericServices
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.phpGenericServices = false;
    
                /**
                 * FileOptions deprecated.
                 * @member {boolean} deprecated
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.deprecated = false;
    
                /**
                 * FileOptions ccEnableArenas.
                 * @member {boolean} ccEnableArenas
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.ccEnableArenas = true;
    
                /**
                 * FileOptions objcClassPrefix.
                 * @member {string} objcClassPrefix
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.objcClassPrefix = "";
    
                /**
                 * FileOptions csharpNamespace.
                 * @member {string} csharpNamespace
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.csharpNamespace = "";
    
                /**
                 * FileOptions swiftPrefix.
                 * @member {string} swiftPrefix
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.swiftPrefix = "";
    
                /**
                 * FileOptions phpClassPrefix.
                 * @member {string} phpClassPrefix
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.phpClassPrefix = "";
    
                /**
                 * FileOptions phpNamespace.
                 * @member {string} phpNamespace
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.phpNamespace = "";
    
                /**
                 * FileOptions phpMetadataNamespace.
                 * @member {string} phpMetadataNamespace
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.phpMetadataNamespace = "";
    
                /**
                 * FileOptions rubyPackage.
                 * @member {string} rubyPackage
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.rubyPackage = "";
    
                /**
                 * FileOptions uninterpretedOption.
                 * @member {Array.<google.protobuf.IUninterpretedOption>} uninterpretedOption
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype.uninterpretedOption = $util.emptyArray;
    
                /**
                 * FileOptions .google.api.resourceDefinition.
                 * @member {Array.<google.api.IResourceDescriptor>} .google.api.resourceDefinition
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 */
                FileOptions.prototype[".google.api.resourceDefinition"] = $util.emptyArray;
    
                /**
                 * Creates a new FileOptions instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.FileOptions
                 * @static
                 * @param {google.protobuf.IFileOptions=} [properties] Properties to set
                 * @returns {google.protobuf.FileOptions} FileOptions instance
                 */
                FileOptions.create = function create(properties) {
                    return new FileOptions(properties);
                };
    
                /**
                 * Encodes the specified FileOptions message. Does not implicitly {@link google.protobuf.FileOptions.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.FileOptions
                 * @static
                 * @param {google.protobuf.IFileOptions} message FileOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FileOptions.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.javaPackage != null && Object.hasOwnProperty.call(message, "javaPackage"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.javaPackage);
                    if (message.javaOuterClassname != null && Object.hasOwnProperty.call(message, "javaOuterClassname"))
                        writer.uint32(/* id 8, wireType 2 =*/66).string(message.javaOuterClassname);
                    if (message.optimizeFor != null && Object.hasOwnProperty.call(message, "optimizeFor"))
                        writer.uint32(/* id 9, wireType 0 =*/72).int32(message.optimizeFor);
                    if (message.javaMultipleFiles != null && Object.hasOwnProperty.call(message, "javaMultipleFiles"))
                        writer.uint32(/* id 10, wireType 0 =*/80).bool(message.javaMultipleFiles);
                    if (message.goPackage != null && Object.hasOwnProperty.call(message, "goPackage"))
                        writer.uint32(/* id 11, wireType 2 =*/90).string(message.goPackage);
                    if (message.ccGenericServices != null && Object.hasOwnProperty.call(message, "ccGenericServices"))
                        writer.uint32(/* id 16, wireType 0 =*/128).bool(message.ccGenericServices);
                    if (message.javaGenericServices != null && Object.hasOwnProperty.call(message, "javaGenericServices"))
                        writer.uint32(/* id 17, wireType 0 =*/136).bool(message.javaGenericServices);
                    if (message.pyGenericServices != null && Object.hasOwnProperty.call(message, "pyGenericServices"))
                        writer.uint32(/* id 18, wireType 0 =*/144).bool(message.pyGenericServices);
                    if (message.javaGenerateEqualsAndHash != null && Object.hasOwnProperty.call(message, "javaGenerateEqualsAndHash"))
                        writer.uint32(/* id 20, wireType 0 =*/160).bool(message.javaGenerateEqualsAndHash);
                    if (message.deprecated != null && Object.hasOwnProperty.call(message, "deprecated"))
                        writer.uint32(/* id 23, wireType 0 =*/184).bool(message.deprecated);
                    if (message.javaStringCheckUtf8 != null && Object.hasOwnProperty.call(message, "javaStringCheckUtf8"))
                        writer.uint32(/* id 27, wireType 0 =*/216).bool(message.javaStringCheckUtf8);
                    if (message.ccEnableArenas != null && Object.hasOwnProperty.call(message, "ccEnableArenas"))
                        writer.uint32(/* id 31, wireType 0 =*/248).bool(message.ccEnableArenas);
                    if (message.objcClassPrefix != null && Object.hasOwnProperty.call(message, "objcClassPrefix"))
                        writer.uint32(/* id 36, wireType 2 =*/290).string(message.objcClassPrefix);
                    if (message.csharpNamespace != null && Object.hasOwnProperty.call(message, "csharpNamespace"))
                        writer.uint32(/* id 37, wireType 2 =*/298).string(message.csharpNamespace);
                    if (message.swiftPrefix != null && Object.hasOwnProperty.call(message, "swiftPrefix"))
                        writer.uint32(/* id 39, wireType 2 =*/314).string(message.swiftPrefix);
                    if (message.phpClassPrefix != null && Object.hasOwnProperty.call(message, "phpClassPrefix"))
                        writer.uint32(/* id 40, wireType 2 =*/322).string(message.phpClassPrefix);
                    if (message.phpNamespace != null && Object.hasOwnProperty.call(message, "phpNamespace"))
                        writer.uint32(/* id 41, wireType 2 =*/330).string(message.phpNamespace);
                    if (message.phpGenericServices != null && Object.hasOwnProperty.call(message, "phpGenericServices"))
                        writer.uint32(/* id 42, wireType 0 =*/336).bool(message.phpGenericServices);
                    if (message.phpMetadataNamespace != null && Object.hasOwnProperty.call(message, "phpMetadataNamespace"))
                        writer.uint32(/* id 44, wireType 2 =*/354).string(message.phpMetadataNamespace);
                    if (message.rubyPackage != null && Object.hasOwnProperty.call(message, "rubyPackage"))
                        writer.uint32(/* id 45, wireType 2 =*/362).string(message.rubyPackage);
                    if (message.uninterpretedOption != null && message.uninterpretedOption.length)
                        for (var i = 0; i < message.uninterpretedOption.length; ++i)
                            $root.google.protobuf.UninterpretedOption.encode(message.uninterpretedOption[i], writer.uint32(/* id 999, wireType 2 =*/7994).fork()).ldelim();
                    if (message[".google.api.resourceDefinition"] != null && message[".google.api.resourceDefinition"].length)
                        for (var i = 0; i < message[".google.api.resourceDefinition"].length; ++i)
                            $root.google.api.ResourceDescriptor.encode(message[".google.api.resourceDefinition"][i], writer.uint32(/* id 1053, wireType 2 =*/8426).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified FileOptions message, length delimited. Does not implicitly {@link google.protobuf.FileOptions.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.FileOptions
                 * @static
                 * @param {google.protobuf.IFileOptions} message FileOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FileOptions.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a FileOptions message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.FileOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.FileOptions} FileOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FileOptions.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.FileOptions();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.javaPackage = reader.string();
                            break;
                        case 8:
                            message.javaOuterClassname = reader.string();
                            break;
                        case 10:
                            message.javaMultipleFiles = reader.bool();
                            break;
                        case 20:
                            message.javaGenerateEqualsAndHash = reader.bool();
                            break;
                        case 27:
                            message.javaStringCheckUtf8 = reader.bool();
                            break;
                        case 9:
                            message.optimizeFor = reader.int32();
                            break;
                        case 11:
                            message.goPackage = reader.string();
                            break;
                        case 16:
                            message.ccGenericServices = reader.bool();
                            break;
                        case 17:
                            message.javaGenericServices = reader.bool();
                            break;
                        case 18:
                            message.pyGenericServices = reader.bool();
                            break;
                        case 42:
                            message.phpGenericServices = reader.bool();
                            break;
                        case 23:
                            message.deprecated = reader.bool();
                            break;
                        case 31:
                            message.ccEnableArenas = reader.bool();
                            break;
                        case 36:
                            message.objcClassPrefix = reader.string();
                            break;
                        case 37:
                            message.csharpNamespace = reader.string();
                            break;
                        case 39:
                            message.swiftPrefix = reader.string();
                            break;
                        case 40:
                            message.phpClassPrefix = reader.string();
                            break;
                        case 41:
                            message.phpNamespace = reader.string();
                            break;
                        case 44:
                            message.phpMetadataNamespace = reader.string();
                            break;
                        case 45:
                            message.rubyPackage = reader.string();
                            break;
                        case 999:
                            if (!(message.uninterpretedOption && message.uninterpretedOption.length))
                                message.uninterpretedOption = [];
                            message.uninterpretedOption.push($root.google.protobuf.UninterpretedOption.decode(reader, reader.uint32()));
                            break;
                        case 1053:
                            if (!(message[".google.api.resourceDefinition"] && message[".google.api.resourceDefinition"].length))
                                message[".google.api.resourceDefinition"] = [];
                            message[".google.api.resourceDefinition"].push($root.google.api.ResourceDescriptor.decode(reader, reader.uint32()));
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a FileOptions message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.FileOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.FileOptions} FileOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FileOptions.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a FileOptions message.
                 * @function verify
                 * @memberof google.protobuf.FileOptions
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                FileOptions.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.javaPackage != null && message.hasOwnProperty("javaPackage"))
                        if (!$util.isString(message.javaPackage))
                            return "javaPackage: string expected";
                    if (message.javaOuterClassname != null && message.hasOwnProperty("javaOuterClassname"))
                        if (!$util.isString(message.javaOuterClassname))
                            return "javaOuterClassname: string expected";
                    if (message.javaMultipleFiles != null && message.hasOwnProperty("javaMultipleFiles"))
                        if (typeof message.javaMultipleFiles !== "boolean")
                            return "javaMultipleFiles: boolean expected";
                    if (message.javaGenerateEqualsAndHash != null && message.hasOwnProperty("javaGenerateEqualsAndHash"))
                        if (typeof message.javaGenerateEqualsAndHash !== "boolean")
                            return "javaGenerateEqualsAndHash: boolean expected";
                    if (message.javaStringCheckUtf8 != null && message.hasOwnProperty("javaStringCheckUtf8"))
                        if (typeof message.javaStringCheckUtf8 !== "boolean")
                            return "javaStringCheckUtf8: boolean expected";
                    if (message.optimizeFor != null && message.hasOwnProperty("optimizeFor"))
                        switch (message.optimizeFor) {
                        default:
                            return "optimizeFor: enum value expected";
                        case 1:
                        case 2:
                        case 3:
                            break;
                        }
                    if (message.goPackage != null && message.hasOwnProperty("goPackage"))
                        if (!$util.isString(message.goPackage))
                            return "goPackage: string expected";
                    if (message.ccGenericServices != null && message.hasOwnProperty("ccGenericServices"))
                        if (typeof message.ccGenericServices !== "boolean")
                            return "ccGenericServices: boolean expected";
                    if (message.javaGenericServices != null && message.hasOwnProperty("javaGenericServices"))
                        if (typeof message.javaGenericServices !== "boolean")
                            return "javaGenericServices: boolean expected";
                    if (message.pyGenericServices != null && message.hasOwnProperty("pyGenericServices"))
                        if (typeof message.pyGenericServices !== "boolean")
                            return "pyGenericServices: boolean expected";
                    if (message.phpGenericServices != null && message.hasOwnProperty("phpGenericServices"))
                        if (typeof message.phpGenericServices !== "boolean")
                            return "phpGenericServices: boolean expected";
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        if (typeof message.deprecated !== "boolean")
                            return "deprecated: boolean expected";
                    if (message.ccEnableArenas != null && message.hasOwnProperty("ccEnableArenas"))
                        if (typeof message.ccEnableArenas !== "boolean")
                            return "ccEnableArenas: boolean expected";
                    if (message.objcClassPrefix != null && message.hasOwnProperty("objcClassPrefix"))
                        if (!$util.isString(message.objcClassPrefix))
                            return "objcClassPrefix: string expected";
                    if (message.csharpNamespace != null && message.hasOwnProperty("csharpNamespace"))
                        if (!$util.isString(message.csharpNamespace))
                            return "csharpNamespace: string expected";
                    if (message.swiftPrefix != null && message.hasOwnProperty("swiftPrefix"))
                        if (!$util.isString(message.swiftPrefix))
                            return "swiftPrefix: string expected";
                    if (message.phpClassPrefix != null && message.hasOwnProperty("phpClassPrefix"))
                        if (!$util.isString(message.phpClassPrefix))
                            return "phpClassPrefix: string expected";
                    if (message.phpNamespace != null && message.hasOwnProperty("phpNamespace"))
                        if (!$util.isString(message.phpNamespace))
                            return "phpNamespace: string expected";
                    if (message.phpMetadataNamespace != null && message.hasOwnProperty("phpMetadataNamespace"))
                        if (!$util.isString(message.phpMetadataNamespace))
                            return "phpMetadataNamespace: string expected";
                    if (message.rubyPackage != null && message.hasOwnProperty("rubyPackage"))
                        if (!$util.isString(message.rubyPackage))
                            return "rubyPackage: string expected";
                    if (message.uninterpretedOption != null && message.hasOwnProperty("uninterpretedOption")) {
                        if (!Array.isArray(message.uninterpretedOption))
                            return "uninterpretedOption: array expected";
                        for (var i = 0; i < message.uninterpretedOption.length; ++i) {
                            var error = $root.google.protobuf.UninterpretedOption.verify(message.uninterpretedOption[i]);
                            if (error)
                                return "uninterpretedOption." + error;
                        }
                    }
                    if (message[".google.api.resourceDefinition"] != null && message.hasOwnProperty(".google.api.resourceDefinition")) {
                        if (!Array.isArray(message[".google.api.resourceDefinition"]))
                            return ".google.api.resourceDefinition: array expected";
                        for (var i = 0; i < message[".google.api.resourceDefinition"].length; ++i) {
                            var error = $root.google.api.ResourceDescriptor.verify(message[".google.api.resourceDefinition"][i]);
                            if (error)
                                return ".google.api.resourceDefinition." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates a FileOptions message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.FileOptions
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.FileOptions} FileOptions
                 */
                FileOptions.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.FileOptions)
                        return object;
                    var message = new $root.google.protobuf.FileOptions();
                    if (object.javaPackage != null)
                        message.javaPackage = String(object.javaPackage);
                    if (object.javaOuterClassname != null)
                        message.javaOuterClassname = String(object.javaOuterClassname);
                    if (object.javaMultipleFiles != null)
                        message.javaMultipleFiles = Boolean(object.javaMultipleFiles);
                    if (object.javaGenerateEqualsAndHash != null)
                        message.javaGenerateEqualsAndHash = Boolean(object.javaGenerateEqualsAndHash);
                    if (object.javaStringCheckUtf8 != null)
                        message.javaStringCheckUtf8 = Boolean(object.javaStringCheckUtf8);
                    switch (object.optimizeFor) {
                    case "SPEED":
                    case 1:
                        message.optimizeFor = 1;
                        break;
                    case "CODE_SIZE":
                    case 2:
                        message.optimizeFor = 2;
                        break;
                    case "LITE_RUNTIME":
                    case 3:
                        message.optimizeFor = 3;
                        break;
                    }
                    if (object.goPackage != null)
                        message.goPackage = String(object.goPackage);
                    if (object.ccGenericServices != null)
                        message.ccGenericServices = Boolean(object.ccGenericServices);
                    if (object.javaGenericServices != null)
                        message.javaGenericServices = Boolean(object.javaGenericServices);
                    if (object.pyGenericServices != null)
                        message.pyGenericServices = Boolean(object.pyGenericServices);
                    if (object.phpGenericServices != null)
                        message.phpGenericServices = Boolean(object.phpGenericServices);
                    if (object.deprecated != null)
                        message.deprecated = Boolean(object.deprecated);
                    if (object.ccEnableArenas != null)
                        message.ccEnableArenas = Boolean(object.ccEnableArenas);
                    if (object.objcClassPrefix != null)
                        message.objcClassPrefix = String(object.objcClassPrefix);
                    if (object.csharpNamespace != null)
                        message.csharpNamespace = String(object.csharpNamespace);
                    if (object.swiftPrefix != null)
                        message.swiftPrefix = String(object.swiftPrefix);
                    if (object.phpClassPrefix != null)
                        message.phpClassPrefix = String(object.phpClassPrefix);
                    if (object.phpNamespace != null)
                        message.phpNamespace = String(object.phpNamespace);
                    if (object.phpMetadataNamespace != null)
                        message.phpMetadataNamespace = String(object.phpMetadataNamespace);
                    if (object.rubyPackage != null)
                        message.rubyPackage = String(object.rubyPackage);
                    if (object.uninterpretedOption) {
                        if (!Array.isArray(object.uninterpretedOption))
                            throw TypeError(".google.protobuf.FileOptions.uninterpretedOption: array expected");
                        message.uninterpretedOption = [];
                        for (var i = 0; i < object.uninterpretedOption.length; ++i) {
                            if (typeof object.uninterpretedOption[i] !== "object")
                                throw TypeError(".google.protobuf.FileOptions.uninterpretedOption: object expected");
                            message.uninterpretedOption[i] = $root.google.protobuf.UninterpretedOption.fromObject(object.uninterpretedOption[i]);
                        }
                    }
                    if (object[".google.api.resourceDefinition"]) {
                        if (!Array.isArray(object[".google.api.resourceDefinition"]))
                            throw TypeError(".google.protobuf.FileOptions..google.api.resourceDefinition: array expected");
                        message[".google.api.resourceDefinition"] = [];
                        for (var i = 0; i < object[".google.api.resourceDefinition"].length; ++i) {
                            if (typeof object[".google.api.resourceDefinition"][i] !== "object")
                                throw TypeError(".google.protobuf.FileOptions..google.api.resourceDefinition: object expected");
                            message[".google.api.resourceDefinition"][i] = $root.google.api.ResourceDescriptor.fromObject(object[".google.api.resourceDefinition"][i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a FileOptions message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.FileOptions
                 * @static
                 * @param {google.protobuf.FileOptions} message FileOptions
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                FileOptions.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults) {
                        object.uninterpretedOption = [];
                        object[".google.api.resourceDefinition"] = [];
                    }
                    if (options.defaults) {
                        object.javaPackage = "";
                        object.javaOuterClassname = "";
                        object.optimizeFor = options.enums === String ? "SPEED" : 1;
                        object.javaMultipleFiles = false;
                        object.goPackage = "";
                        object.ccGenericServices = false;
                        object.javaGenericServices = false;
                        object.pyGenericServices = false;
                        object.javaGenerateEqualsAndHash = false;
                        object.deprecated = false;
                        object.javaStringCheckUtf8 = false;
                        object.ccEnableArenas = true;
                        object.objcClassPrefix = "";
                        object.csharpNamespace = "";
                        object.swiftPrefix = "";
                        object.phpClassPrefix = "";
                        object.phpNamespace = "";
                        object.phpGenericServices = false;
                        object.phpMetadataNamespace = "";
                        object.rubyPackage = "";
                    }
                    if (message.javaPackage != null && message.hasOwnProperty("javaPackage"))
                        object.javaPackage = message.javaPackage;
                    if (message.javaOuterClassname != null && message.hasOwnProperty("javaOuterClassname"))
                        object.javaOuterClassname = message.javaOuterClassname;
                    if (message.optimizeFor != null && message.hasOwnProperty("optimizeFor"))
                        object.optimizeFor = options.enums === String ? $root.google.protobuf.FileOptions.OptimizeMode[message.optimizeFor] : message.optimizeFor;
                    if (message.javaMultipleFiles != null && message.hasOwnProperty("javaMultipleFiles"))
                        object.javaMultipleFiles = message.javaMultipleFiles;
                    if (message.goPackage != null && message.hasOwnProperty("goPackage"))
                        object.goPackage = message.goPackage;
                    if (message.ccGenericServices != null && message.hasOwnProperty("ccGenericServices"))
                        object.ccGenericServices = message.ccGenericServices;
                    if (message.javaGenericServices != null && message.hasOwnProperty("javaGenericServices"))
                        object.javaGenericServices = message.javaGenericServices;
                    if (message.pyGenericServices != null && message.hasOwnProperty("pyGenericServices"))
                        object.pyGenericServices = message.pyGenericServices;
                    if (message.javaGenerateEqualsAndHash != null && message.hasOwnProperty("javaGenerateEqualsAndHash"))
                        object.javaGenerateEqualsAndHash = message.javaGenerateEqualsAndHash;
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        object.deprecated = message.deprecated;
                    if (message.javaStringCheckUtf8 != null && message.hasOwnProperty("javaStringCheckUtf8"))
                        object.javaStringCheckUtf8 = message.javaStringCheckUtf8;
                    if (message.ccEnableArenas != null && message.hasOwnProperty("ccEnableArenas"))
                        object.ccEnableArenas = message.ccEnableArenas;
                    if (message.objcClassPrefix != null && message.hasOwnProperty("objcClassPrefix"))
                        object.objcClassPrefix = message.objcClassPrefix;
                    if (message.csharpNamespace != null && message.hasOwnProperty("csharpNamespace"))
                        object.csharpNamespace = message.csharpNamespace;
                    if (message.swiftPrefix != null && message.hasOwnProperty("swiftPrefix"))
                        object.swiftPrefix = message.swiftPrefix;
                    if (message.phpClassPrefix != null && message.hasOwnProperty("phpClassPrefix"))
                        object.phpClassPrefix = message.phpClassPrefix;
                    if (message.phpNamespace != null && message.hasOwnProperty("phpNamespace"))
                        object.phpNamespace = message.phpNamespace;
                    if (message.phpGenericServices != null && message.hasOwnProperty("phpGenericServices"))
                        object.phpGenericServices = message.phpGenericServices;
                    if (message.phpMetadataNamespace != null && message.hasOwnProperty("phpMetadataNamespace"))
                        object.phpMetadataNamespace = message.phpMetadataNamespace;
                    if (message.rubyPackage != null && message.hasOwnProperty("rubyPackage"))
                        object.rubyPackage = message.rubyPackage;
                    if (message.uninterpretedOption && message.uninterpretedOption.length) {
                        object.uninterpretedOption = [];
                        for (var j = 0; j < message.uninterpretedOption.length; ++j)
                            object.uninterpretedOption[j] = $root.google.protobuf.UninterpretedOption.toObject(message.uninterpretedOption[j], options);
                    }
                    if (message[".google.api.resourceDefinition"] && message[".google.api.resourceDefinition"].length) {
                        object[".google.api.resourceDefinition"] = [];
                        for (var j = 0; j < message[".google.api.resourceDefinition"].length; ++j)
                            object[".google.api.resourceDefinition"][j] = $root.google.api.ResourceDescriptor.toObject(message[".google.api.resourceDefinition"][j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this FileOptions to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.FileOptions
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                FileOptions.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * OptimizeMode enum.
                 * @name google.protobuf.FileOptions.OptimizeMode
                 * @enum {number}
                 * @property {number} SPEED=1 SPEED value
                 * @property {number} CODE_SIZE=2 CODE_SIZE value
                 * @property {number} LITE_RUNTIME=3 LITE_RUNTIME value
                 */
                FileOptions.OptimizeMode = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[1] = "SPEED"] = 1;
                    values[valuesById[2] = "CODE_SIZE"] = 2;
                    values[valuesById[3] = "LITE_RUNTIME"] = 3;
                    return values;
                })();
    
                return FileOptions;
            })();
    
            protobuf.MessageOptions = (function() {
    
                /**
                 * Properties of a MessageOptions.
                 * @memberof google.protobuf
                 * @interface IMessageOptions
                 * @property {boolean|null} [messageSetWireFormat] MessageOptions messageSetWireFormat
                 * @property {boolean|null} [noStandardDescriptorAccessor] MessageOptions noStandardDescriptorAccessor
                 * @property {boolean|null} [deprecated] MessageOptions deprecated
                 * @property {boolean|null} [mapEntry] MessageOptions mapEntry
                 * @property {Array.<google.protobuf.IUninterpretedOption>|null} [uninterpretedOption] MessageOptions uninterpretedOption
                 * @property {google.api.IResourceDescriptor|null} [".google.api.resource"] MessageOptions .google.api.resource
                 */
    
                /**
                 * Constructs a new MessageOptions.
                 * @memberof google.protobuf
                 * @classdesc Represents a MessageOptions.
                 * @implements IMessageOptions
                 * @constructor
                 * @param {google.protobuf.IMessageOptions=} [properties] Properties to set
                 */
                function MessageOptions(properties) {
                    this.uninterpretedOption = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * MessageOptions messageSetWireFormat.
                 * @member {boolean} messageSetWireFormat
                 * @memberof google.protobuf.MessageOptions
                 * @instance
                 */
                MessageOptions.prototype.messageSetWireFormat = false;
    
                /**
                 * MessageOptions noStandardDescriptorAccessor.
                 * @member {boolean} noStandardDescriptorAccessor
                 * @memberof google.protobuf.MessageOptions
                 * @instance
                 */
                MessageOptions.prototype.noStandardDescriptorAccessor = false;
    
                /**
                 * MessageOptions deprecated.
                 * @member {boolean} deprecated
                 * @memberof google.protobuf.MessageOptions
                 * @instance
                 */
                MessageOptions.prototype.deprecated = false;
    
                /**
                 * MessageOptions mapEntry.
                 * @member {boolean} mapEntry
                 * @memberof google.protobuf.MessageOptions
                 * @instance
                 */
                MessageOptions.prototype.mapEntry = false;
    
                /**
                 * MessageOptions uninterpretedOption.
                 * @member {Array.<google.protobuf.IUninterpretedOption>} uninterpretedOption
                 * @memberof google.protobuf.MessageOptions
                 * @instance
                 */
                MessageOptions.prototype.uninterpretedOption = $util.emptyArray;
    
                /**
                 * MessageOptions .google.api.resource.
                 * @member {google.api.IResourceDescriptor|null|undefined} .google.api.resource
                 * @memberof google.protobuf.MessageOptions
                 * @instance
                 */
                MessageOptions.prototype[".google.api.resource"] = null;
    
                /**
                 * Creates a new MessageOptions instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.MessageOptions
                 * @static
                 * @param {google.protobuf.IMessageOptions=} [properties] Properties to set
                 * @returns {google.protobuf.MessageOptions} MessageOptions instance
                 */
                MessageOptions.create = function create(properties) {
                    return new MessageOptions(properties);
                };
    
                /**
                 * Encodes the specified MessageOptions message. Does not implicitly {@link google.protobuf.MessageOptions.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.MessageOptions
                 * @static
                 * @param {google.protobuf.IMessageOptions} message MessageOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                MessageOptions.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.messageSetWireFormat != null && Object.hasOwnProperty.call(message, "messageSetWireFormat"))
                        writer.uint32(/* id 1, wireType 0 =*/8).bool(message.messageSetWireFormat);
                    if (message.noStandardDescriptorAccessor != null && Object.hasOwnProperty.call(message, "noStandardDescriptorAccessor"))
                        writer.uint32(/* id 2, wireType 0 =*/16).bool(message.noStandardDescriptorAccessor);
                    if (message.deprecated != null && Object.hasOwnProperty.call(message, "deprecated"))
                        writer.uint32(/* id 3, wireType 0 =*/24).bool(message.deprecated);
                    if (message.mapEntry != null && Object.hasOwnProperty.call(message, "mapEntry"))
                        writer.uint32(/* id 7, wireType 0 =*/56).bool(message.mapEntry);
                    if (message.uninterpretedOption != null && message.uninterpretedOption.length)
                        for (var i = 0; i < message.uninterpretedOption.length; ++i)
                            $root.google.protobuf.UninterpretedOption.encode(message.uninterpretedOption[i], writer.uint32(/* id 999, wireType 2 =*/7994).fork()).ldelim();
                    if (message[".google.api.resource"] != null && Object.hasOwnProperty.call(message, ".google.api.resource"))
                        $root.google.api.ResourceDescriptor.encode(message[".google.api.resource"], writer.uint32(/* id 1053, wireType 2 =*/8426).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified MessageOptions message, length delimited. Does not implicitly {@link google.protobuf.MessageOptions.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.MessageOptions
                 * @static
                 * @param {google.protobuf.IMessageOptions} message MessageOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                MessageOptions.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a MessageOptions message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.MessageOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.MessageOptions} MessageOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                MessageOptions.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.MessageOptions();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.messageSetWireFormat = reader.bool();
                            break;
                        case 2:
                            message.noStandardDescriptorAccessor = reader.bool();
                            break;
                        case 3:
                            message.deprecated = reader.bool();
                            break;
                        case 7:
                            message.mapEntry = reader.bool();
                            break;
                        case 999:
                            if (!(message.uninterpretedOption && message.uninterpretedOption.length))
                                message.uninterpretedOption = [];
                            message.uninterpretedOption.push($root.google.protobuf.UninterpretedOption.decode(reader, reader.uint32()));
                            break;
                        case 1053:
                            message[".google.api.resource"] = $root.google.api.ResourceDescriptor.decode(reader, reader.uint32());
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a MessageOptions message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.MessageOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.MessageOptions} MessageOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                MessageOptions.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a MessageOptions message.
                 * @function verify
                 * @memberof google.protobuf.MessageOptions
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                MessageOptions.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.messageSetWireFormat != null && message.hasOwnProperty("messageSetWireFormat"))
                        if (typeof message.messageSetWireFormat !== "boolean")
                            return "messageSetWireFormat: boolean expected";
                    if (message.noStandardDescriptorAccessor != null && message.hasOwnProperty("noStandardDescriptorAccessor"))
                        if (typeof message.noStandardDescriptorAccessor !== "boolean")
                            return "noStandardDescriptorAccessor: boolean expected";
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        if (typeof message.deprecated !== "boolean")
                            return "deprecated: boolean expected";
                    if (message.mapEntry != null && message.hasOwnProperty("mapEntry"))
                        if (typeof message.mapEntry !== "boolean")
                            return "mapEntry: boolean expected";
                    if (message.uninterpretedOption != null && message.hasOwnProperty("uninterpretedOption")) {
                        if (!Array.isArray(message.uninterpretedOption))
                            return "uninterpretedOption: array expected";
                        for (var i = 0; i < message.uninterpretedOption.length; ++i) {
                            var error = $root.google.protobuf.UninterpretedOption.verify(message.uninterpretedOption[i]);
                            if (error)
                                return "uninterpretedOption." + error;
                        }
                    }
                    if (message[".google.api.resource"] != null && message.hasOwnProperty(".google.api.resource")) {
                        var error = $root.google.api.ResourceDescriptor.verify(message[".google.api.resource"]);
                        if (error)
                            return ".google.api.resource." + error;
                    }
                    return null;
                };
    
                /**
                 * Creates a MessageOptions message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.MessageOptions
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.MessageOptions} MessageOptions
                 */
                MessageOptions.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.MessageOptions)
                        return object;
                    var message = new $root.google.protobuf.MessageOptions();
                    if (object.messageSetWireFormat != null)
                        message.messageSetWireFormat = Boolean(object.messageSetWireFormat);
                    if (object.noStandardDescriptorAccessor != null)
                        message.noStandardDescriptorAccessor = Boolean(object.noStandardDescriptorAccessor);
                    if (object.deprecated != null)
                        message.deprecated = Boolean(object.deprecated);
                    if (object.mapEntry != null)
                        message.mapEntry = Boolean(object.mapEntry);
                    if (object.uninterpretedOption) {
                        if (!Array.isArray(object.uninterpretedOption))
                            throw TypeError(".google.protobuf.MessageOptions.uninterpretedOption: array expected");
                        message.uninterpretedOption = [];
                        for (var i = 0; i < object.uninterpretedOption.length; ++i) {
                            if (typeof object.uninterpretedOption[i] !== "object")
                                throw TypeError(".google.protobuf.MessageOptions.uninterpretedOption: object expected");
                            message.uninterpretedOption[i] = $root.google.protobuf.UninterpretedOption.fromObject(object.uninterpretedOption[i]);
                        }
                    }
                    if (object[".google.api.resource"] != null) {
                        if (typeof object[".google.api.resource"] !== "object")
                            throw TypeError(".google.protobuf.MessageOptions..google.api.resource: object expected");
                        message[".google.api.resource"] = $root.google.api.ResourceDescriptor.fromObject(object[".google.api.resource"]);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a MessageOptions message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.MessageOptions
                 * @static
                 * @param {google.protobuf.MessageOptions} message MessageOptions
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                MessageOptions.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.uninterpretedOption = [];
                    if (options.defaults) {
                        object.messageSetWireFormat = false;
                        object.noStandardDescriptorAccessor = false;
                        object.deprecated = false;
                        object.mapEntry = false;
                        object[".google.api.resource"] = null;
                    }
                    if (message.messageSetWireFormat != null && message.hasOwnProperty("messageSetWireFormat"))
                        object.messageSetWireFormat = message.messageSetWireFormat;
                    if (message.noStandardDescriptorAccessor != null && message.hasOwnProperty("noStandardDescriptorAccessor"))
                        object.noStandardDescriptorAccessor = message.noStandardDescriptorAccessor;
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        object.deprecated = message.deprecated;
                    if (message.mapEntry != null && message.hasOwnProperty("mapEntry"))
                        object.mapEntry = message.mapEntry;
                    if (message.uninterpretedOption && message.uninterpretedOption.length) {
                        object.uninterpretedOption = [];
                        for (var j = 0; j < message.uninterpretedOption.length; ++j)
                            object.uninterpretedOption[j] = $root.google.protobuf.UninterpretedOption.toObject(message.uninterpretedOption[j], options);
                    }
                    if (message[".google.api.resource"] != null && message.hasOwnProperty(".google.api.resource"))
                        object[".google.api.resource"] = $root.google.api.ResourceDescriptor.toObject(message[".google.api.resource"], options);
                    return object;
                };
    
                /**
                 * Converts this MessageOptions to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.MessageOptions
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                MessageOptions.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return MessageOptions;
            })();
    
            protobuf.FieldOptions = (function() {
    
                /**
                 * Properties of a FieldOptions.
                 * @memberof google.protobuf
                 * @interface IFieldOptions
                 * @property {google.protobuf.FieldOptions.CType|null} [ctype] FieldOptions ctype
                 * @property {boolean|null} [packed] FieldOptions packed
                 * @property {google.protobuf.FieldOptions.JSType|null} [jstype] FieldOptions jstype
                 * @property {boolean|null} [lazy] FieldOptions lazy
                 * @property {boolean|null} [unverifiedLazy] FieldOptions unverifiedLazy
                 * @property {boolean|null} [deprecated] FieldOptions deprecated
                 * @property {boolean|null} [weak] FieldOptions weak
                 * @property {Array.<google.protobuf.IUninterpretedOption>|null} [uninterpretedOption] FieldOptions uninterpretedOption
                 * @property {Array.<google.api.FieldBehavior>|null} [".google.api.fieldBehavior"] FieldOptions .google.api.fieldBehavior
                 * @property {google.api.IResourceReference|null} [".google.api.resourceReference"] FieldOptions .google.api.resourceReference
                 */
    
                /**
                 * Constructs a new FieldOptions.
                 * @memberof google.protobuf
                 * @classdesc Represents a FieldOptions.
                 * @implements IFieldOptions
                 * @constructor
                 * @param {google.protobuf.IFieldOptions=} [properties] Properties to set
                 */
                function FieldOptions(properties) {
                    this.uninterpretedOption = [];
                    this[".google.api.fieldBehavior"] = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * FieldOptions ctype.
                 * @member {google.protobuf.FieldOptions.CType} ctype
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype.ctype = 0;
    
                /**
                 * FieldOptions packed.
                 * @member {boolean} packed
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype.packed = false;
    
                /**
                 * FieldOptions jstype.
                 * @member {google.protobuf.FieldOptions.JSType} jstype
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype.jstype = 0;
    
                /**
                 * FieldOptions lazy.
                 * @member {boolean} lazy
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype.lazy = false;
    
                /**
                 * FieldOptions unverifiedLazy.
                 * @member {boolean} unverifiedLazy
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype.unverifiedLazy = false;
    
                /**
                 * FieldOptions deprecated.
                 * @member {boolean} deprecated
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype.deprecated = false;
    
                /**
                 * FieldOptions weak.
                 * @member {boolean} weak
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype.weak = false;
    
                /**
                 * FieldOptions uninterpretedOption.
                 * @member {Array.<google.protobuf.IUninterpretedOption>} uninterpretedOption
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype.uninterpretedOption = $util.emptyArray;
    
                /**
                 * FieldOptions .google.api.fieldBehavior.
                 * @member {Array.<google.api.FieldBehavior>} .google.api.fieldBehavior
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype[".google.api.fieldBehavior"] = $util.emptyArray;
    
                /**
                 * FieldOptions .google.api.resourceReference.
                 * @member {google.api.IResourceReference|null|undefined} .google.api.resourceReference
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 */
                FieldOptions.prototype[".google.api.resourceReference"] = null;
    
                /**
                 * Creates a new FieldOptions instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.FieldOptions
                 * @static
                 * @param {google.protobuf.IFieldOptions=} [properties] Properties to set
                 * @returns {google.protobuf.FieldOptions} FieldOptions instance
                 */
                FieldOptions.create = function create(properties) {
                    return new FieldOptions(properties);
                };
    
                /**
                 * Encodes the specified FieldOptions message. Does not implicitly {@link google.protobuf.FieldOptions.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.FieldOptions
                 * @static
                 * @param {google.protobuf.IFieldOptions} message FieldOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FieldOptions.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.ctype != null && Object.hasOwnProperty.call(message, "ctype"))
                        writer.uint32(/* id 1, wireType 0 =*/8).int32(message.ctype);
                    if (message.packed != null && Object.hasOwnProperty.call(message, "packed"))
                        writer.uint32(/* id 2, wireType 0 =*/16).bool(message.packed);
                    if (message.deprecated != null && Object.hasOwnProperty.call(message, "deprecated"))
                        writer.uint32(/* id 3, wireType 0 =*/24).bool(message.deprecated);
                    if (message.lazy != null && Object.hasOwnProperty.call(message, "lazy"))
                        writer.uint32(/* id 5, wireType 0 =*/40).bool(message.lazy);
                    if (message.jstype != null && Object.hasOwnProperty.call(message, "jstype"))
                        writer.uint32(/* id 6, wireType 0 =*/48).int32(message.jstype);
                    if (message.weak != null && Object.hasOwnProperty.call(message, "weak"))
                        writer.uint32(/* id 10, wireType 0 =*/80).bool(message.weak);
                    if (message.unverifiedLazy != null && Object.hasOwnProperty.call(message, "unverifiedLazy"))
                        writer.uint32(/* id 15, wireType 0 =*/120).bool(message.unverifiedLazy);
                    if (message.uninterpretedOption != null && message.uninterpretedOption.length)
                        for (var i = 0; i < message.uninterpretedOption.length; ++i)
                            $root.google.protobuf.UninterpretedOption.encode(message.uninterpretedOption[i], writer.uint32(/* id 999, wireType 2 =*/7994).fork()).ldelim();
                    if (message[".google.api.fieldBehavior"] != null && message[".google.api.fieldBehavior"].length) {
                        writer.uint32(/* id 1052, wireType 2 =*/8418).fork();
                        for (var i = 0; i < message[".google.api.fieldBehavior"].length; ++i)
                            writer.int32(message[".google.api.fieldBehavior"][i]);
                        writer.ldelim();
                    }
                    if (message[".google.api.resourceReference"] != null && Object.hasOwnProperty.call(message, ".google.api.resourceReference"))
                        $root.google.api.ResourceReference.encode(message[".google.api.resourceReference"], writer.uint32(/* id 1055, wireType 2 =*/8442).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified FieldOptions message, length delimited. Does not implicitly {@link google.protobuf.FieldOptions.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.FieldOptions
                 * @static
                 * @param {google.protobuf.IFieldOptions} message FieldOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FieldOptions.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a FieldOptions message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.FieldOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.FieldOptions} FieldOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FieldOptions.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.FieldOptions();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.ctype = reader.int32();
                            break;
                        case 2:
                            message.packed = reader.bool();
                            break;
                        case 6:
                            message.jstype = reader.int32();
                            break;
                        case 5:
                            message.lazy = reader.bool();
                            break;
                        case 15:
                            message.unverifiedLazy = reader.bool();
                            break;
                        case 3:
                            message.deprecated = reader.bool();
                            break;
                        case 10:
                            message.weak = reader.bool();
                            break;
                        case 999:
                            if (!(message.uninterpretedOption && message.uninterpretedOption.length))
                                message.uninterpretedOption = [];
                            message.uninterpretedOption.push($root.google.protobuf.UninterpretedOption.decode(reader, reader.uint32()));
                            break;
                        case 1052:
                            if (!(message[".google.api.fieldBehavior"] && message[".google.api.fieldBehavior"].length))
                                message[".google.api.fieldBehavior"] = [];
                            if ((tag & 7) === 2) {
                                var end2 = reader.uint32() + reader.pos;
                                while (reader.pos < end2)
                                    message[".google.api.fieldBehavior"].push(reader.int32());
                            } else
                                message[".google.api.fieldBehavior"].push(reader.int32());
                            break;
                        case 1055:
                            message[".google.api.resourceReference"] = $root.google.api.ResourceReference.decode(reader, reader.uint32());
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a FieldOptions message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.FieldOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.FieldOptions} FieldOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FieldOptions.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a FieldOptions message.
                 * @function verify
                 * @memberof google.protobuf.FieldOptions
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                FieldOptions.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.ctype != null && message.hasOwnProperty("ctype"))
                        switch (message.ctype) {
                        default:
                            return "ctype: enum value expected";
                        case 0:
                        case 1:
                        case 2:
                            break;
                        }
                    if (message.packed != null && message.hasOwnProperty("packed"))
                        if (typeof message.packed !== "boolean")
                            return "packed: boolean expected";
                    if (message.jstype != null && message.hasOwnProperty("jstype"))
                        switch (message.jstype) {
                        default:
                            return "jstype: enum value expected";
                        case 0:
                        case 1:
                        case 2:
                            break;
                        }
                    if (message.lazy != null && message.hasOwnProperty("lazy"))
                        if (typeof message.lazy !== "boolean")
                            return "lazy: boolean expected";
                    if (message.unverifiedLazy != null && message.hasOwnProperty("unverifiedLazy"))
                        if (typeof message.unverifiedLazy !== "boolean")
                            return "unverifiedLazy: boolean expected";
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        if (typeof message.deprecated !== "boolean")
                            return "deprecated: boolean expected";
                    if (message.weak != null && message.hasOwnProperty("weak"))
                        if (typeof message.weak !== "boolean")
                            return "weak: boolean expected";
                    if (message.uninterpretedOption != null && message.hasOwnProperty("uninterpretedOption")) {
                        if (!Array.isArray(message.uninterpretedOption))
                            return "uninterpretedOption: array expected";
                        for (var i = 0; i < message.uninterpretedOption.length; ++i) {
                            var error = $root.google.protobuf.UninterpretedOption.verify(message.uninterpretedOption[i]);
                            if (error)
                                return "uninterpretedOption." + error;
                        }
                    }
                    if (message[".google.api.fieldBehavior"] != null && message.hasOwnProperty(".google.api.fieldBehavior")) {
                        if (!Array.isArray(message[".google.api.fieldBehavior"]))
                            return ".google.api.fieldBehavior: array expected";
                        for (var i = 0; i < message[".google.api.fieldBehavior"].length; ++i)
                            switch (message[".google.api.fieldBehavior"][i]) {
                            default:
                                return ".google.api.fieldBehavior: enum value[] expected";
                            case 0:
                            case 1:
                            case 2:
                            case 3:
                            case 4:
                            case 5:
                            case 6:
                            case 7:
                                break;
                            }
                    }
                    if (message[".google.api.resourceReference"] != null && message.hasOwnProperty(".google.api.resourceReference")) {
                        var error = $root.google.api.ResourceReference.verify(message[".google.api.resourceReference"]);
                        if (error)
                            return ".google.api.resourceReference." + error;
                    }
                    return null;
                };
    
                /**
                 * Creates a FieldOptions message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.FieldOptions
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.FieldOptions} FieldOptions
                 */
                FieldOptions.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.FieldOptions)
                        return object;
                    var message = new $root.google.protobuf.FieldOptions();
                    switch (object.ctype) {
                    case "STRING":
                    case 0:
                        message.ctype = 0;
                        break;
                    case "CORD":
                    case 1:
                        message.ctype = 1;
                        break;
                    case "STRING_PIECE":
                    case 2:
                        message.ctype = 2;
                        break;
                    }
                    if (object.packed != null)
                        message.packed = Boolean(object.packed);
                    switch (object.jstype) {
                    case "JS_NORMAL":
                    case 0:
                        message.jstype = 0;
                        break;
                    case "JS_STRING":
                    case 1:
                        message.jstype = 1;
                        break;
                    case "JS_NUMBER":
                    case 2:
                        message.jstype = 2;
                        break;
                    }
                    if (object.lazy != null)
                        message.lazy = Boolean(object.lazy);
                    if (object.unverifiedLazy != null)
                        message.unverifiedLazy = Boolean(object.unverifiedLazy);
                    if (object.deprecated != null)
                        message.deprecated = Boolean(object.deprecated);
                    if (object.weak != null)
                        message.weak = Boolean(object.weak);
                    if (object.uninterpretedOption) {
                        if (!Array.isArray(object.uninterpretedOption))
                            throw TypeError(".google.protobuf.FieldOptions.uninterpretedOption: array expected");
                        message.uninterpretedOption = [];
                        for (var i = 0; i < object.uninterpretedOption.length; ++i) {
                            if (typeof object.uninterpretedOption[i] !== "object")
                                throw TypeError(".google.protobuf.FieldOptions.uninterpretedOption: object expected");
                            message.uninterpretedOption[i] = $root.google.protobuf.UninterpretedOption.fromObject(object.uninterpretedOption[i]);
                        }
                    }
                    if (object[".google.api.fieldBehavior"]) {
                        if (!Array.isArray(object[".google.api.fieldBehavior"]))
                            throw TypeError(".google.protobuf.FieldOptions..google.api.fieldBehavior: array expected");
                        message[".google.api.fieldBehavior"] = [];
                        for (var i = 0; i < object[".google.api.fieldBehavior"].length; ++i)
                            switch (object[".google.api.fieldBehavior"][i]) {
                            default:
                            case "FIELD_BEHAVIOR_UNSPECIFIED":
                            case 0:
                                message[".google.api.fieldBehavior"][i] = 0;
                                break;
                            case "OPTIONAL":
                            case 1:
                                message[".google.api.fieldBehavior"][i] = 1;
                                break;
                            case "REQUIRED":
                            case 2:
                                message[".google.api.fieldBehavior"][i] = 2;
                                break;
                            case "OUTPUT_ONLY":
                            case 3:
                                message[".google.api.fieldBehavior"][i] = 3;
                                break;
                            case "INPUT_ONLY":
                            case 4:
                                message[".google.api.fieldBehavior"][i] = 4;
                                break;
                            case "IMMUTABLE":
                            case 5:
                                message[".google.api.fieldBehavior"][i] = 5;
                                break;
                            case "UNORDERED_LIST":
                            case 6:
                                message[".google.api.fieldBehavior"][i] = 6;
                                break;
                            case "NON_EMPTY_DEFAULT":
                            case 7:
                                message[".google.api.fieldBehavior"][i] = 7;
                                break;
                            }
                    }
                    if (object[".google.api.resourceReference"] != null) {
                        if (typeof object[".google.api.resourceReference"] !== "object")
                            throw TypeError(".google.protobuf.FieldOptions..google.api.resourceReference: object expected");
                        message[".google.api.resourceReference"] = $root.google.api.ResourceReference.fromObject(object[".google.api.resourceReference"]);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a FieldOptions message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.FieldOptions
                 * @static
                 * @param {google.protobuf.FieldOptions} message FieldOptions
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                FieldOptions.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults) {
                        object.uninterpretedOption = [];
                        object[".google.api.fieldBehavior"] = [];
                    }
                    if (options.defaults) {
                        object.ctype = options.enums === String ? "STRING" : 0;
                        object.packed = false;
                        object.deprecated = false;
                        object.lazy = false;
                        object.jstype = options.enums === String ? "JS_NORMAL" : 0;
                        object.weak = false;
                        object.unverifiedLazy = false;
                        object[".google.api.resourceReference"] = null;
                    }
                    if (message.ctype != null && message.hasOwnProperty("ctype"))
                        object.ctype = options.enums === String ? $root.google.protobuf.FieldOptions.CType[message.ctype] : message.ctype;
                    if (message.packed != null && message.hasOwnProperty("packed"))
                        object.packed = message.packed;
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        object.deprecated = message.deprecated;
                    if (message.lazy != null && message.hasOwnProperty("lazy"))
                        object.lazy = message.lazy;
                    if (message.jstype != null && message.hasOwnProperty("jstype"))
                        object.jstype = options.enums === String ? $root.google.protobuf.FieldOptions.JSType[message.jstype] : message.jstype;
                    if (message.weak != null && message.hasOwnProperty("weak"))
                        object.weak = message.weak;
                    if (message.unverifiedLazy != null && message.hasOwnProperty("unverifiedLazy"))
                        object.unverifiedLazy = message.unverifiedLazy;
                    if (message.uninterpretedOption && message.uninterpretedOption.length) {
                        object.uninterpretedOption = [];
                        for (var j = 0; j < message.uninterpretedOption.length; ++j)
                            object.uninterpretedOption[j] = $root.google.protobuf.UninterpretedOption.toObject(message.uninterpretedOption[j], options);
                    }
                    if (message[".google.api.fieldBehavior"] && message[".google.api.fieldBehavior"].length) {
                        object[".google.api.fieldBehavior"] = [];
                        for (var j = 0; j < message[".google.api.fieldBehavior"].length; ++j)
                            object[".google.api.fieldBehavior"][j] = options.enums === String ? $root.google.api.FieldBehavior[message[".google.api.fieldBehavior"][j]] : message[".google.api.fieldBehavior"][j];
                    }
                    if (message[".google.api.resourceReference"] != null && message.hasOwnProperty(".google.api.resourceReference"))
                        object[".google.api.resourceReference"] = $root.google.api.ResourceReference.toObject(message[".google.api.resourceReference"], options);
                    return object;
                };
    
                /**
                 * Converts this FieldOptions to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.FieldOptions
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                FieldOptions.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * CType enum.
                 * @name google.protobuf.FieldOptions.CType
                 * @enum {number}
                 * @property {number} STRING=0 STRING value
                 * @property {number} CORD=1 CORD value
                 * @property {number} STRING_PIECE=2 STRING_PIECE value
                 */
                FieldOptions.CType = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "STRING"] = 0;
                    values[valuesById[1] = "CORD"] = 1;
                    values[valuesById[2] = "STRING_PIECE"] = 2;
                    return values;
                })();
    
                /**
                 * JSType enum.
                 * @name google.protobuf.FieldOptions.JSType
                 * @enum {number}
                 * @property {number} JS_NORMAL=0 JS_NORMAL value
                 * @property {number} JS_STRING=1 JS_STRING value
                 * @property {number} JS_NUMBER=2 JS_NUMBER value
                 */
                FieldOptions.JSType = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "JS_NORMAL"] = 0;
                    values[valuesById[1] = "JS_STRING"] = 1;
                    values[valuesById[2] = "JS_NUMBER"] = 2;
                    return values;
                })();
    
                return FieldOptions;
            })();
    
            protobuf.OneofOptions = (function() {
    
                /**
                 * Properties of an OneofOptions.
                 * @memberof google.protobuf
                 * @interface IOneofOptions
                 * @property {Array.<google.protobuf.IUninterpretedOption>|null} [uninterpretedOption] OneofOptions uninterpretedOption
                 */
    
                /**
                 * Constructs a new OneofOptions.
                 * @memberof google.protobuf
                 * @classdesc Represents an OneofOptions.
                 * @implements IOneofOptions
                 * @constructor
                 * @param {google.protobuf.IOneofOptions=} [properties] Properties to set
                 */
                function OneofOptions(properties) {
                    this.uninterpretedOption = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * OneofOptions uninterpretedOption.
                 * @member {Array.<google.protobuf.IUninterpretedOption>} uninterpretedOption
                 * @memberof google.protobuf.OneofOptions
                 * @instance
                 */
                OneofOptions.prototype.uninterpretedOption = $util.emptyArray;
    
                /**
                 * Creates a new OneofOptions instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.OneofOptions
                 * @static
                 * @param {google.protobuf.IOneofOptions=} [properties] Properties to set
                 * @returns {google.protobuf.OneofOptions} OneofOptions instance
                 */
                OneofOptions.create = function create(properties) {
                    return new OneofOptions(properties);
                };
    
                /**
                 * Encodes the specified OneofOptions message. Does not implicitly {@link google.protobuf.OneofOptions.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.OneofOptions
                 * @static
                 * @param {google.protobuf.IOneofOptions} message OneofOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                OneofOptions.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.uninterpretedOption != null && message.uninterpretedOption.length)
                        for (var i = 0; i < message.uninterpretedOption.length; ++i)
                            $root.google.protobuf.UninterpretedOption.encode(message.uninterpretedOption[i], writer.uint32(/* id 999, wireType 2 =*/7994).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified OneofOptions message, length delimited. Does not implicitly {@link google.protobuf.OneofOptions.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.OneofOptions
                 * @static
                 * @param {google.protobuf.IOneofOptions} message OneofOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                OneofOptions.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an OneofOptions message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.OneofOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.OneofOptions} OneofOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                OneofOptions.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.OneofOptions();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 999:
                            if (!(message.uninterpretedOption && message.uninterpretedOption.length))
                                message.uninterpretedOption = [];
                            message.uninterpretedOption.push($root.google.protobuf.UninterpretedOption.decode(reader, reader.uint32()));
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an OneofOptions message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.OneofOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.OneofOptions} OneofOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                OneofOptions.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an OneofOptions message.
                 * @function verify
                 * @memberof google.protobuf.OneofOptions
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                OneofOptions.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.uninterpretedOption != null && message.hasOwnProperty("uninterpretedOption")) {
                        if (!Array.isArray(message.uninterpretedOption))
                            return "uninterpretedOption: array expected";
                        for (var i = 0; i < message.uninterpretedOption.length; ++i) {
                            var error = $root.google.protobuf.UninterpretedOption.verify(message.uninterpretedOption[i]);
                            if (error)
                                return "uninterpretedOption." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates an OneofOptions message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.OneofOptions
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.OneofOptions} OneofOptions
                 */
                OneofOptions.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.OneofOptions)
                        return object;
                    var message = new $root.google.protobuf.OneofOptions();
                    if (object.uninterpretedOption) {
                        if (!Array.isArray(object.uninterpretedOption))
                            throw TypeError(".google.protobuf.OneofOptions.uninterpretedOption: array expected");
                        message.uninterpretedOption = [];
                        for (var i = 0; i < object.uninterpretedOption.length; ++i) {
                            if (typeof object.uninterpretedOption[i] !== "object")
                                throw TypeError(".google.protobuf.OneofOptions.uninterpretedOption: object expected");
                            message.uninterpretedOption[i] = $root.google.protobuf.UninterpretedOption.fromObject(object.uninterpretedOption[i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from an OneofOptions message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.OneofOptions
                 * @static
                 * @param {google.protobuf.OneofOptions} message OneofOptions
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                OneofOptions.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.uninterpretedOption = [];
                    if (message.uninterpretedOption && message.uninterpretedOption.length) {
                        object.uninterpretedOption = [];
                        for (var j = 0; j < message.uninterpretedOption.length; ++j)
                            object.uninterpretedOption[j] = $root.google.protobuf.UninterpretedOption.toObject(message.uninterpretedOption[j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this OneofOptions to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.OneofOptions
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                OneofOptions.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return OneofOptions;
            })();
    
            protobuf.EnumOptions = (function() {
    
                /**
                 * Properties of an EnumOptions.
                 * @memberof google.protobuf
                 * @interface IEnumOptions
                 * @property {boolean|null} [allowAlias] EnumOptions allowAlias
                 * @property {boolean|null} [deprecated] EnumOptions deprecated
                 * @property {Array.<google.protobuf.IUninterpretedOption>|null} [uninterpretedOption] EnumOptions uninterpretedOption
                 */
    
                /**
                 * Constructs a new EnumOptions.
                 * @memberof google.protobuf
                 * @classdesc Represents an EnumOptions.
                 * @implements IEnumOptions
                 * @constructor
                 * @param {google.protobuf.IEnumOptions=} [properties] Properties to set
                 */
                function EnumOptions(properties) {
                    this.uninterpretedOption = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * EnumOptions allowAlias.
                 * @member {boolean} allowAlias
                 * @memberof google.protobuf.EnumOptions
                 * @instance
                 */
                EnumOptions.prototype.allowAlias = false;
    
                /**
                 * EnumOptions deprecated.
                 * @member {boolean} deprecated
                 * @memberof google.protobuf.EnumOptions
                 * @instance
                 */
                EnumOptions.prototype.deprecated = false;
    
                /**
                 * EnumOptions uninterpretedOption.
                 * @member {Array.<google.protobuf.IUninterpretedOption>} uninterpretedOption
                 * @memberof google.protobuf.EnumOptions
                 * @instance
                 */
                EnumOptions.prototype.uninterpretedOption = $util.emptyArray;
    
                /**
                 * Creates a new EnumOptions instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.EnumOptions
                 * @static
                 * @param {google.protobuf.IEnumOptions=} [properties] Properties to set
                 * @returns {google.protobuf.EnumOptions} EnumOptions instance
                 */
                EnumOptions.create = function create(properties) {
                    return new EnumOptions(properties);
                };
    
                /**
                 * Encodes the specified EnumOptions message. Does not implicitly {@link google.protobuf.EnumOptions.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.EnumOptions
                 * @static
                 * @param {google.protobuf.IEnumOptions} message EnumOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                EnumOptions.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.allowAlias != null && Object.hasOwnProperty.call(message, "allowAlias"))
                        writer.uint32(/* id 2, wireType 0 =*/16).bool(message.allowAlias);
                    if (message.deprecated != null && Object.hasOwnProperty.call(message, "deprecated"))
                        writer.uint32(/* id 3, wireType 0 =*/24).bool(message.deprecated);
                    if (message.uninterpretedOption != null && message.uninterpretedOption.length)
                        for (var i = 0; i < message.uninterpretedOption.length; ++i)
                            $root.google.protobuf.UninterpretedOption.encode(message.uninterpretedOption[i], writer.uint32(/* id 999, wireType 2 =*/7994).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified EnumOptions message, length delimited. Does not implicitly {@link google.protobuf.EnumOptions.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.EnumOptions
                 * @static
                 * @param {google.protobuf.IEnumOptions} message EnumOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                EnumOptions.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an EnumOptions message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.EnumOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.EnumOptions} EnumOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                EnumOptions.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.EnumOptions();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 2:
                            message.allowAlias = reader.bool();
                            break;
                        case 3:
                            message.deprecated = reader.bool();
                            break;
                        case 999:
                            if (!(message.uninterpretedOption && message.uninterpretedOption.length))
                                message.uninterpretedOption = [];
                            message.uninterpretedOption.push($root.google.protobuf.UninterpretedOption.decode(reader, reader.uint32()));
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an EnumOptions message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.EnumOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.EnumOptions} EnumOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                EnumOptions.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an EnumOptions message.
                 * @function verify
                 * @memberof google.protobuf.EnumOptions
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                EnumOptions.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.allowAlias != null && message.hasOwnProperty("allowAlias"))
                        if (typeof message.allowAlias !== "boolean")
                            return "allowAlias: boolean expected";
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        if (typeof message.deprecated !== "boolean")
                            return "deprecated: boolean expected";
                    if (message.uninterpretedOption != null && message.hasOwnProperty("uninterpretedOption")) {
                        if (!Array.isArray(message.uninterpretedOption))
                            return "uninterpretedOption: array expected";
                        for (var i = 0; i < message.uninterpretedOption.length; ++i) {
                            var error = $root.google.protobuf.UninterpretedOption.verify(message.uninterpretedOption[i]);
                            if (error)
                                return "uninterpretedOption." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates an EnumOptions message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.EnumOptions
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.EnumOptions} EnumOptions
                 */
                EnumOptions.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.EnumOptions)
                        return object;
                    var message = new $root.google.protobuf.EnumOptions();
                    if (object.allowAlias != null)
                        message.allowAlias = Boolean(object.allowAlias);
                    if (object.deprecated != null)
                        message.deprecated = Boolean(object.deprecated);
                    if (object.uninterpretedOption) {
                        if (!Array.isArray(object.uninterpretedOption))
                            throw TypeError(".google.protobuf.EnumOptions.uninterpretedOption: array expected");
                        message.uninterpretedOption = [];
                        for (var i = 0; i < object.uninterpretedOption.length; ++i) {
                            if (typeof object.uninterpretedOption[i] !== "object")
                                throw TypeError(".google.protobuf.EnumOptions.uninterpretedOption: object expected");
                            message.uninterpretedOption[i] = $root.google.protobuf.UninterpretedOption.fromObject(object.uninterpretedOption[i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from an EnumOptions message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.EnumOptions
                 * @static
                 * @param {google.protobuf.EnumOptions} message EnumOptions
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                EnumOptions.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.uninterpretedOption = [];
                    if (options.defaults) {
                        object.allowAlias = false;
                        object.deprecated = false;
                    }
                    if (message.allowAlias != null && message.hasOwnProperty("allowAlias"))
                        object.allowAlias = message.allowAlias;
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        object.deprecated = message.deprecated;
                    if (message.uninterpretedOption && message.uninterpretedOption.length) {
                        object.uninterpretedOption = [];
                        for (var j = 0; j < message.uninterpretedOption.length; ++j)
                            object.uninterpretedOption[j] = $root.google.protobuf.UninterpretedOption.toObject(message.uninterpretedOption[j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this EnumOptions to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.EnumOptions
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                EnumOptions.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return EnumOptions;
            })();
    
            protobuf.EnumValueOptions = (function() {
    
                /**
                 * Properties of an EnumValueOptions.
                 * @memberof google.protobuf
                 * @interface IEnumValueOptions
                 * @property {boolean|null} [deprecated] EnumValueOptions deprecated
                 * @property {Array.<google.protobuf.IUninterpretedOption>|null} [uninterpretedOption] EnumValueOptions uninterpretedOption
                 */
    
                /**
                 * Constructs a new EnumValueOptions.
                 * @memberof google.protobuf
                 * @classdesc Represents an EnumValueOptions.
                 * @implements IEnumValueOptions
                 * @constructor
                 * @param {google.protobuf.IEnumValueOptions=} [properties] Properties to set
                 */
                function EnumValueOptions(properties) {
                    this.uninterpretedOption = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * EnumValueOptions deprecated.
                 * @member {boolean} deprecated
                 * @memberof google.protobuf.EnumValueOptions
                 * @instance
                 */
                EnumValueOptions.prototype.deprecated = false;
    
                /**
                 * EnumValueOptions uninterpretedOption.
                 * @member {Array.<google.protobuf.IUninterpretedOption>} uninterpretedOption
                 * @memberof google.protobuf.EnumValueOptions
                 * @instance
                 */
                EnumValueOptions.prototype.uninterpretedOption = $util.emptyArray;
    
                /**
                 * Creates a new EnumValueOptions instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.EnumValueOptions
                 * @static
                 * @param {google.protobuf.IEnumValueOptions=} [properties] Properties to set
                 * @returns {google.protobuf.EnumValueOptions} EnumValueOptions instance
                 */
                EnumValueOptions.create = function create(properties) {
                    return new EnumValueOptions(properties);
                };
    
                /**
                 * Encodes the specified EnumValueOptions message. Does not implicitly {@link google.protobuf.EnumValueOptions.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.EnumValueOptions
                 * @static
                 * @param {google.protobuf.IEnumValueOptions} message EnumValueOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                EnumValueOptions.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.deprecated != null && Object.hasOwnProperty.call(message, "deprecated"))
                        writer.uint32(/* id 1, wireType 0 =*/8).bool(message.deprecated);
                    if (message.uninterpretedOption != null && message.uninterpretedOption.length)
                        for (var i = 0; i < message.uninterpretedOption.length; ++i)
                            $root.google.protobuf.UninterpretedOption.encode(message.uninterpretedOption[i], writer.uint32(/* id 999, wireType 2 =*/7994).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified EnumValueOptions message, length delimited. Does not implicitly {@link google.protobuf.EnumValueOptions.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.EnumValueOptions
                 * @static
                 * @param {google.protobuf.IEnumValueOptions} message EnumValueOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                EnumValueOptions.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an EnumValueOptions message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.EnumValueOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.EnumValueOptions} EnumValueOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                EnumValueOptions.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.EnumValueOptions();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.deprecated = reader.bool();
                            break;
                        case 999:
                            if (!(message.uninterpretedOption && message.uninterpretedOption.length))
                                message.uninterpretedOption = [];
                            message.uninterpretedOption.push($root.google.protobuf.UninterpretedOption.decode(reader, reader.uint32()));
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an EnumValueOptions message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.EnumValueOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.EnumValueOptions} EnumValueOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                EnumValueOptions.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an EnumValueOptions message.
                 * @function verify
                 * @memberof google.protobuf.EnumValueOptions
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                EnumValueOptions.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        if (typeof message.deprecated !== "boolean")
                            return "deprecated: boolean expected";
                    if (message.uninterpretedOption != null && message.hasOwnProperty("uninterpretedOption")) {
                        if (!Array.isArray(message.uninterpretedOption))
                            return "uninterpretedOption: array expected";
                        for (var i = 0; i < message.uninterpretedOption.length; ++i) {
                            var error = $root.google.protobuf.UninterpretedOption.verify(message.uninterpretedOption[i]);
                            if (error)
                                return "uninterpretedOption." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates an EnumValueOptions message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.EnumValueOptions
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.EnumValueOptions} EnumValueOptions
                 */
                EnumValueOptions.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.EnumValueOptions)
                        return object;
                    var message = new $root.google.protobuf.EnumValueOptions();
                    if (object.deprecated != null)
                        message.deprecated = Boolean(object.deprecated);
                    if (object.uninterpretedOption) {
                        if (!Array.isArray(object.uninterpretedOption))
                            throw TypeError(".google.protobuf.EnumValueOptions.uninterpretedOption: array expected");
                        message.uninterpretedOption = [];
                        for (var i = 0; i < object.uninterpretedOption.length; ++i) {
                            if (typeof object.uninterpretedOption[i] !== "object")
                                throw TypeError(".google.protobuf.EnumValueOptions.uninterpretedOption: object expected");
                            message.uninterpretedOption[i] = $root.google.protobuf.UninterpretedOption.fromObject(object.uninterpretedOption[i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from an EnumValueOptions message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.EnumValueOptions
                 * @static
                 * @param {google.protobuf.EnumValueOptions} message EnumValueOptions
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                EnumValueOptions.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.uninterpretedOption = [];
                    if (options.defaults)
                        object.deprecated = false;
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        object.deprecated = message.deprecated;
                    if (message.uninterpretedOption && message.uninterpretedOption.length) {
                        object.uninterpretedOption = [];
                        for (var j = 0; j < message.uninterpretedOption.length; ++j)
                            object.uninterpretedOption[j] = $root.google.protobuf.UninterpretedOption.toObject(message.uninterpretedOption[j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this EnumValueOptions to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.EnumValueOptions
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                EnumValueOptions.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return EnumValueOptions;
            })();
    
            protobuf.ServiceOptions = (function() {
    
                /**
                 * Properties of a ServiceOptions.
                 * @memberof google.protobuf
                 * @interface IServiceOptions
                 * @property {boolean|null} [deprecated] ServiceOptions deprecated
                 * @property {Array.<google.protobuf.IUninterpretedOption>|null} [uninterpretedOption] ServiceOptions uninterpretedOption
                 * @property {string|null} [".google.api.defaultHost"] ServiceOptions .google.api.defaultHost
                 * @property {string|null} [".google.api.oauthScopes"] ServiceOptions .google.api.oauthScopes
                 */
    
                /**
                 * Constructs a new ServiceOptions.
                 * @memberof google.protobuf
                 * @classdesc Represents a ServiceOptions.
                 * @implements IServiceOptions
                 * @constructor
                 * @param {google.protobuf.IServiceOptions=} [properties] Properties to set
                 */
                function ServiceOptions(properties) {
                    this.uninterpretedOption = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * ServiceOptions deprecated.
                 * @member {boolean} deprecated
                 * @memberof google.protobuf.ServiceOptions
                 * @instance
                 */
                ServiceOptions.prototype.deprecated = false;
    
                /**
                 * ServiceOptions uninterpretedOption.
                 * @member {Array.<google.protobuf.IUninterpretedOption>} uninterpretedOption
                 * @memberof google.protobuf.ServiceOptions
                 * @instance
                 */
                ServiceOptions.prototype.uninterpretedOption = $util.emptyArray;
    
                /**
                 * ServiceOptions .google.api.defaultHost.
                 * @member {string} .google.api.defaultHost
                 * @memberof google.protobuf.ServiceOptions
                 * @instance
                 */
                ServiceOptions.prototype[".google.api.defaultHost"] = "";
    
                /**
                 * ServiceOptions .google.api.oauthScopes.
                 * @member {string} .google.api.oauthScopes
                 * @memberof google.protobuf.ServiceOptions
                 * @instance
                 */
                ServiceOptions.prototype[".google.api.oauthScopes"] = "";
    
                /**
                 * Creates a new ServiceOptions instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.ServiceOptions
                 * @static
                 * @param {google.protobuf.IServiceOptions=} [properties] Properties to set
                 * @returns {google.protobuf.ServiceOptions} ServiceOptions instance
                 */
                ServiceOptions.create = function create(properties) {
                    return new ServiceOptions(properties);
                };
    
                /**
                 * Encodes the specified ServiceOptions message. Does not implicitly {@link google.protobuf.ServiceOptions.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.ServiceOptions
                 * @static
                 * @param {google.protobuf.IServiceOptions} message ServiceOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ServiceOptions.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.deprecated != null && Object.hasOwnProperty.call(message, "deprecated"))
                        writer.uint32(/* id 33, wireType 0 =*/264).bool(message.deprecated);
                    if (message.uninterpretedOption != null && message.uninterpretedOption.length)
                        for (var i = 0; i < message.uninterpretedOption.length; ++i)
                            $root.google.protobuf.UninterpretedOption.encode(message.uninterpretedOption[i], writer.uint32(/* id 999, wireType 2 =*/7994).fork()).ldelim();
                    if (message[".google.api.defaultHost"] != null && Object.hasOwnProperty.call(message, ".google.api.defaultHost"))
                        writer.uint32(/* id 1049, wireType 2 =*/8394).string(message[".google.api.defaultHost"]);
                    if (message[".google.api.oauthScopes"] != null && Object.hasOwnProperty.call(message, ".google.api.oauthScopes"))
                        writer.uint32(/* id 1050, wireType 2 =*/8402).string(message[".google.api.oauthScopes"]);
                    return writer;
                };
    
                /**
                 * Encodes the specified ServiceOptions message, length delimited. Does not implicitly {@link google.protobuf.ServiceOptions.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.ServiceOptions
                 * @static
                 * @param {google.protobuf.IServiceOptions} message ServiceOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ServiceOptions.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a ServiceOptions message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.ServiceOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.ServiceOptions} ServiceOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ServiceOptions.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.ServiceOptions();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 33:
                            message.deprecated = reader.bool();
                            break;
                        case 999:
                            if (!(message.uninterpretedOption && message.uninterpretedOption.length))
                                message.uninterpretedOption = [];
                            message.uninterpretedOption.push($root.google.protobuf.UninterpretedOption.decode(reader, reader.uint32()));
                            break;
                        case 1049:
                            message[".google.api.defaultHost"] = reader.string();
                            break;
                        case 1050:
                            message[".google.api.oauthScopes"] = reader.string();
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a ServiceOptions message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.ServiceOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.ServiceOptions} ServiceOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ServiceOptions.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a ServiceOptions message.
                 * @function verify
                 * @memberof google.protobuf.ServiceOptions
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                ServiceOptions.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        if (typeof message.deprecated !== "boolean")
                            return "deprecated: boolean expected";
                    if (message.uninterpretedOption != null && message.hasOwnProperty("uninterpretedOption")) {
                        if (!Array.isArray(message.uninterpretedOption))
                            return "uninterpretedOption: array expected";
                        for (var i = 0; i < message.uninterpretedOption.length; ++i) {
                            var error = $root.google.protobuf.UninterpretedOption.verify(message.uninterpretedOption[i]);
                            if (error)
                                return "uninterpretedOption." + error;
                        }
                    }
                    if (message[".google.api.defaultHost"] != null && message.hasOwnProperty(".google.api.defaultHost"))
                        if (!$util.isString(message[".google.api.defaultHost"]))
                            return ".google.api.defaultHost: string expected";
                    if (message[".google.api.oauthScopes"] != null && message.hasOwnProperty(".google.api.oauthScopes"))
                        if (!$util.isString(message[".google.api.oauthScopes"]))
                            return ".google.api.oauthScopes: string expected";
                    return null;
                };
    
                /**
                 * Creates a ServiceOptions message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.ServiceOptions
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.ServiceOptions} ServiceOptions
                 */
                ServiceOptions.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.ServiceOptions)
                        return object;
                    var message = new $root.google.protobuf.ServiceOptions();
                    if (object.deprecated != null)
                        message.deprecated = Boolean(object.deprecated);
                    if (object.uninterpretedOption) {
                        if (!Array.isArray(object.uninterpretedOption))
                            throw TypeError(".google.protobuf.ServiceOptions.uninterpretedOption: array expected");
                        message.uninterpretedOption = [];
                        for (var i = 0; i < object.uninterpretedOption.length; ++i) {
                            if (typeof object.uninterpretedOption[i] !== "object")
                                throw TypeError(".google.protobuf.ServiceOptions.uninterpretedOption: object expected");
                            message.uninterpretedOption[i] = $root.google.protobuf.UninterpretedOption.fromObject(object.uninterpretedOption[i]);
                        }
                    }
                    if (object[".google.api.defaultHost"] != null)
                        message[".google.api.defaultHost"] = String(object[".google.api.defaultHost"]);
                    if (object[".google.api.oauthScopes"] != null)
                        message[".google.api.oauthScopes"] = String(object[".google.api.oauthScopes"]);
                    return message;
                };
    
                /**
                 * Creates a plain object from a ServiceOptions message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.ServiceOptions
                 * @static
                 * @param {google.protobuf.ServiceOptions} message ServiceOptions
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                ServiceOptions.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.uninterpretedOption = [];
                    if (options.defaults) {
                        object.deprecated = false;
                        object[".google.api.defaultHost"] = "";
                        object[".google.api.oauthScopes"] = "";
                    }
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        object.deprecated = message.deprecated;
                    if (message.uninterpretedOption && message.uninterpretedOption.length) {
                        object.uninterpretedOption = [];
                        for (var j = 0; j < message.uninterpretedOption.length; ++j)
                            object.uninterpretedOption[j] = $root.google.protobuf.UninterpretedOption.toObject(message.uninterpretedOption[j], options);
                    }
                    if (message[".google.api.defaultHost"] != null && message.hasOwnProperty(".google.api.defaultHost"))
                        object[".google.api.defaultHost"] = message[".google.api.defaultHost"];
                    if (message[".google.api.oauthScopes"] != null && message.hasOwnProperty(".google.api.oauthScopes"))
                        object[".google.api.oauthScopes"] = message[".google.api.oauthScopes"];
                    return object;
                };
    
                /**
                 * Converts this ServiceOptions to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.ServiceOptions
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                ServiceOptions.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return ServiceOptions;
            })();
    
            protobuf.MethodOptions = (function() {
    
                /**
                 * Properties of a MethodOptions.
                 * @memberof google.protobuf
                 * @interface IMethodOptions
                 * @property {boolean|null} [deprecated] MethodOptions deprecated
                 * @property {google.protobuf.MethodOptions.IdempotencyLevel|null} [idempotencyLevel] MethodOptions idempotencyLevel
                 * @property {Array.<google.protobuf.IUninterpretedOption>|null} [uninterpretedOption] MethodOptions uninterpretedOption
                 * @property {google.api.IHttpRule|null} [".google.api.http"] MethodOptions .google.api.http
                 * @property {Array.<string>|null} [".google.api.methodSignature"] MethodOptions .google.api.methodSignature
                 * @property {google.longrunning.IOperationInfo|null} [".google.longrunning.operationInfo"] MethodOptions .google.longrunning.operationInfo
                 */
    
                /**
                 * Constructs a new MethodOptions.
                 * @memberof google.protobuf
                 * @classdesc Represents a MethodOptions.
                 * @implements IMethodOptions
                 * @constructor
                 * @param {google.protobuf.IMethodOptions=} [properties] Properties to set
                 */
                function MethodOptions(properties) {
                    this.uninterpretedOption = [];
                    this[".google.api.methodSignature"] = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * MethodOptions deprecated.
                 * @member {boolean} deprecated
                 * @memberof google.protobuf.MethodOptions
                 * @instance
                 */
                MethodOptions.prototype.deprecated = false;
    
                /**
                 * MethodOptions idempotencyLevel.
                 * @member {google.protobuf.MethodOptions.IdempotencyLevel} idempotencyLevel
                 * @memberof google.protobuf.MethodOptions
                 * @instance
                 */
                MethodOptions.prototype.idempotencyLevel = 0;
    
                /**
                 * MethodOptions uninterpretedOption.
                 * @member {Array.<google.protobuf.IUninterpretedOption>} uninterpretedOption
                 * @memberof google.protobuf.MethodOptions
                 * @instance
                 */
                MethodOptions.prototype.uninterpretedOption = $util.emptyArray;
    
                /**
                 * MethodOptions .google.api.http.
                 * @member {google.api.IHttpRule|null|undefined} .google.api.http
                 * @memberof google.protobuf.MethodOptions
                 * @instance
                 */
                MethodOptions.prototype[".google.api.http"] = null;
    
                /**
                 * MethodOptions .google.api.methodSignature.
                 * @member {Array.<string>} .google.api.methodSignature
                 * @memberof google.protobuf.MethodOptions
                 * @instance
                 */
                MethodOptions.prototype[".google.api.methodSignature"] = $util.emptyArray;
    
                /**
                 * MethodOptions .google.longrunning.operationInfo.
                 * @member {google.longrunning.IOperationInfo|null|undefined} .google.longrunning.operationInfo
                 * @memberof google.protobuf.MethodOptions
                 * @instance
                 */
                MethodOptions.prototype[".google.longrunning.operationInfo"] = null;
    
                /**
                 * Creates a new MethodOptions instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.MethodOptions
                 * @static
                 * @param {google.protobuf.IMethodOptions=} [properties] Properties to set
                 * @returns {google.protobuf.MethodOptions} MethodOptions instance
                 */
                MethodOptions.create = function create(properties) {
                    return new MethodOptions(properties);
                };
    
                /**
                 * Encodes the specified MethodOptions message. Does not implicitly {@link google.protobuf.MethodOptions.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.MethodOptions
                 * @static
                 * @param {google.protobuf.IMethodOptions} message MethodOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                MethodOptions.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.deprecated != null && Object.hasOwnProperty.call(message, "deprecated"))
                        writer.uint32(/* id 33, wireType 0 =*/264).bool(message.deprecated);
                    if (message.idempotencyLevel != null && Object.hasOwnProperty.call(message, "idempotencyLevel"))
                        writer.uint32(/* id 34, wireType 0 =*/272).int32(message.idempotencyLevel);
                    if (message.uninterpretedOption != null && message.uninterpretedOption.length)
                        for (var i = 0; i < message.uninterpretedOption.length; ++i)
                            $root.google.protobuf.UninterpretedOption.encode(message.uninterpretedOption[i], writer.uint32(/* id 999, wireType 2 =*/7994).fork()).ldelim();
                    if (message[".google.longrunning.operationInfo"] != null && Object.hasOwnProperty.call(message, ".google.longrunning.operationInfo"))
                        $root.google.longrunning.OperationInfo.encode(message[".google.longrunning.operationInfo"], writer.uint32(/* id 1049, wireType 2 =*/8394).fork()).ldelim();
                    if (message[".google.api.methodSignature"] != null && message[".google.api.methodSignature"].length)
                        for (var i = 0; i < message[".google.api.methodSignature"].length; ++i)
                            writer.uint32(/* id 1051, wireType 2 =*/8410).string(message[".google.api.methodSignature"][i]);
                    if (message[".google.api.http"] != null && Object.hasOwnProperty.call(message, ".google.api.http"))
                        $root.google.api.HttpRule.encode(message[".google.api.http"], writer.uint32(/* id 72295728, wireType 2 =*/578365826).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified MethodOptions message, length delimited. Does not implicitly {@link google.protobuf.MethodOptions.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.MethodOptions
                 * @static
                 * @param {google.protobuf.IMethodOptions} message MethodOptions message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                MethodOptions.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a MethodOptions message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.MethodOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.MethodOptions} MethodOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                MethodOptions.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.MethodOptions();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 33:
                            message.deprecated = reader.bool();
                            break;
                        case 34:
                            message.idempotencyLevel = reader.int32();
                            break;
                        case 999:
                            if (!(message.uninterpretedOption && message.uninterpretedOption.length))
                                message.uninterpretedOption = [];
                            message.uninterpretedOption.push($root.google.protobuf.UninterpretedOption.decode(reader, reader.uint32()));
                            break;
                        case 72295728:
                            message[".google.api.http"] = $root.google.api.HttpRule.decode(reader, reader.uint32());
                            break;
                        case 1051:
                            if (!(message[".google.api.methodSignature"] && message[".google.api.methodSignature"].length))
                                message[".google.api.methodSignature"] = [];
                            message[".google.api.methodSignature"].push(reader.string());
                            break;
                        case 1049:
                            message[".google.longrunning.operationInfo"] = $root.google.longrunning.OperationInfo.decode(reader, reader.uint32());
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a MethodOptions message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.MethodOptions
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.MethodOptions} MethodOptions
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                MethodOptions.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a MethodOptions message.
                 * @function verify
                 * @memberof google.protobuf.MethodOptions
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                MethodOptions.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        if (typeof message.deprecated !== "boolean")
                            return "deprecated: boolean expected";
                    if (message.idempotencyLevel != null && message.hasOwnProperty("idempotencyLevel"))
                        switch (message.idempotencyLevel) {
                        default:
                            return "idempotencyLevel: enum value expected";
                        case 0:
                        case 1:
                        case 2:
                            break;
                        }
                    if (message.uninterpretedOption != null && message.hasOwnProperty("uninterpretedOption")) {
                        if (!Array.isArray(message.uninterpretedOption))
                            return "uninterpretedOption: array expected";
                        for (var i = 0; i < message.uninterpretedOption.length; ++i) {
                            var error = $root.google.protobuf.UninterpretedOption.verify(message.uninterpretedOption[i]);
                            if (error)
                                return "uninterpretedOption." + error;
                        }
                    }
                    if (message[".google.api.http"] != null && message.hasOwnProperty(".google.api.http")) {
                        var error = $root.google.api.HttpRule.verify(message[".google.api.http"]);
                        if (error)
                            return ".google.api.http." + error;
                    }
                    if (message[".google.api.methodSignature"] != null && message.hasOwnProperty(".google.api.methodSignature")) {
                        if (!Array.isArray(message[".google.api.methodSignature"]))
                            return ".google.api.methodSignature: array expected";
                        for (var i = 0; i < message[".google.api.methodSignature"].length; ++i)
                            if (!$util.isString(message[".google.api.methodSignature"][i]))
                                return ".google.api.methodSignature: string[] expected";
                    }
                    if (message[".google.longrunning.operationInfo"] != null && message.hasOwnProperty(".google.longrunning.operationInfo")) {
                        var error = $root.google.longrunning.OperationInfo.verify(message[".google.longrunning.operationInfo"]);
                        if (error)
                            return ".google.longrunning.operationInfo." + error;
                    }
                    return null;
                };
    
                /**
                 * Creates a MethodOptions message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.MethodOptions
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.MethodOptions} MethodOptions
                 */
                MethodOptions.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.MethodOptions)
                        return object;
                    var message = new $root.google.protobuf.MethodOptions();
                    if (object.deprecated != null)
                        message.deprecated = Boolean(object.deprecated);
                    switch (object.idempotencyLevel) {
                    case "IDEMPOTENCY_UNKNOWN":
                    case 0:
                        message.idempotencyLevel = 0;
                        break;
                    case "NO_SIDE_EFFECTS":
                    case 1:
                        message.idempotencyLevel = 1;
                        break;
                    case "IDEMPOTENT":
                    case 2:
                        message.idempotencyLevel = 2;
                        break;
                    }
                    if (object.uninterpretedOption) {
                        if (!Array.isArray(object.uninterpretedOption))
                            throw TypeError(".google.protobuf.MethodOptions.uninterpretedOption: array expected");
                        message.uninterpretedOption = [];
                        for (var i = 0; i < object.uninterpretedOption.length; ++i) {
                            if (typeof object.uninterpretedOption[i] !== "object")
                                throw TypeError(".google.protobuf.MethodOptions.uninterpretedOption: object expected");
                            message.uninterpretedOption[i] = $root.google.protobuf.UninterpretedOption.fromObject(object.uninterpretedOption[i]);
                        }
                    }
                    if (object[".google.api.http"] != null) {
                        if (typeof object[".google.api.http"] !== "object")
                            throw TypeError(".google.protobuf.MethodOptions..google.api.http: object expected");
                        message[".google.api.http"] = $root.google.api.HttpRule.fromObject(object[".google.api.http"]);
                    }
                    if (object[".google.api.methodSignature"]) {
                        if (!Array.isArray(object[".google.api.methodSignature"]))
                            throw TypeError(".google.protobuf.MethodOptions..google.api.methodSignature: array expected");
                        message[".google.api.methodSignature"] = [];
                        for (var i = 0; i < object[".google.api.methodSignature"].length; ++i)
                            message[".google.api.methodSignature"][i] = String(object[".google.api.methodSignature"][i]);
                    }
                    if (object[".google.longrunning.operationInfo"] != null) {
                        if (typeof object[".google.longrunning.operationInfo"] !== "object")
                            throw TypeError(".google.protobuf.MethodOptions..google.longrunning.operationInfo: object expected");
                        message[".google.longrunning.operationInfo"] = $root.google.longrunning.OperationInfo.fromObject(object[".google.longrunning.operationInfo"]);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a MethodOptions message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.MethodOptions
                 * @static
                 * @param {google.protobuf.MethodOptions} message MethodOptions
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                MethodOptions.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults) {
                        object.uninterpretedOption = [];
                        object[".google.api.methodSignature"] = [];
                    }
                    if (options.defaults) {
                        object.deprecated = false;
                        object.idempotencyLevel = options.enums === String ? "IDEMPOTENCY_UNKNOWN" : 0;
                        object[".google.longrunning.operationInfo"] = null;
                        object[".google.api.http"] = null;
                    }
                    if (message.deprecated != null && message.hasOwnProperty("deprecated"))
                        object.deprecated = message.deprecated;
                    if (message.idempotencyLevel != null && message.hasOwnProperty("idempotencyLevel"))
                        object.idempotencyLevel = options.enums === String ? $root.google.protobuf.MethodOptions.IdempotencyLevel[message.idempotencyLevel] : message.idempotencyLevel;
                    if (message.uninterpretedOption && message.uninterpretedOption.length) {
                        object.uninterpretedOption = [];
                        for (var j = 0; j < message.uninterpretedOption.length; ++j)
                            object.uninterpretedOption[j] = $root.google.protobuf.UninterpretedOption.toObject(message.uninterpretedOption[j], options);
                    }
                    if (message[".google.longrunning.operationInfo"] != null && message.hasOwnProperty(".google.longrunning.operationInfo"))
                        object[".google.longrunning.operationInfo"] = $root.google.longrunning.OperationInfo.toObject(message[".google.longrunning.operationInfo"], options);
                    if (message[".google.api.methodSignature"] && message[".google.api.methodSignature"].length) {
                        object[".google.api.methodSignature"] = [];
                        for (var j = 0; j < message[".google.api.methodSignature"].length; ++j)
                            object[".google.api.methodSignature"][j] = message[".google.api.methodSignature"][j];
                    }
                    if (message[".google.api.http"] != null && message.hasOwnProperty(".google.api.http"))
                        object[".google.api.http"] = $root.google.api.HttpRule.toObject(message[".google.api.http"], options);
                    return object;
                };
    
                /**
                 * Converts this MethodOptions to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.MethodOptions
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                MethodOptions.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * IdempotencyLevel enum.
                 * @name google.protobuf.MethodOptions.IdempotencyLevel
                 * @enum {number}
                 * @property {number} IDEMPOTENCY_UNKNOWN=0 IDEMPOTENCY_UNKNOWN value
                 * @property {number} NO_SIDE_EFFECTS=1 NO_SIDE_EFFECTS value
                 * @property {number} IDEMPOTENT=2 IDEMPOTENT value
                 */
                MethodOptions.IdempotencyLevel = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "IDEMPOTENCY_UNKNOWN"] = 0;
                    values[valuesById[1] = "NO_SIDE_EFFECTS"] = 1;
                    values[valuesById[2] = "IDEMPOTENT"] = 2;
                    return values;
                })();
    
                return MethodOptions;
            })();
    
            protobuf.UninterpretedOption = (function() {
    
                /**
                 * Properties of an UninterpretedOption.
                 * @memberof google.protobuf
                 * @interface IUninterpretedOption
                 * @property {Array.<google.protobuf.UninterpretedOption.INamePart>|null} [name] UninterpretedOption name
                 * @property {string|null} [identifierValue] UninterpretedOption identifierValue
                 * @property {number|Long|null} [positiveIntValue] UninterpretedOption positiveIntValue
                 * @property {number|Long|null} [negativeIntValue] UninterpretedOption negativeIntValue
                 * @property {number|null} [doubleValue] UninterpretedOption doubleValue
                 * @property {Uint8Array|null} [stringValue] UninterpretedOption stringValue
                 * @property {string|null} [aggregateValue] UninterpretedOption aggregateValue
                 */
    
                /**
                 * Constructs a new UninterpretedOption.
                 * @memberof google.protobuf
                 * @classdesc Represents an UninterpretedOption.
                 * @implements IUninterpretedOption
                 * @constructor
                 * @param {google.protobuf.IUninterpretedOption=} [properties] Properties to set
                 */
                function UninterpretedOption(properties) {
                    this.name = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * UninterpretedOption name.
                 * @member {Array.<google.protobuf.UninterpretedOption.INamePart>} name
                 * @memberof google.protobuf.UninterpretedOption
                 * @instance
                 */
                UninterpretedOption.prototype.name = $util.emptyArray;
    
                /**
                 * UninterpretedOption identifierValue.
                 * @member {string} identifierValue
                 * @memberof google.protobuf.UninterpretedOption
                 * @instance
                 */
                UninterpretedOption.prototype.identifierValue = "";
    
                /**
                 * UninterpretedOption positiveIntValue.
                 * @member {number|Long} positiveIntValue
                 * @memberof google.protobuf.UninterpretedOption
                 * @instance
                 */
                UninterpretedOption.prototype.positiveIntValue = $util.Long ? $util.Long.fromBits(0,0,true) : 0;
    
                /**
                 * UninterpretedOption negativeIntValue.
                 * @member {number|Long} negativeIntValue
                 * @memberof google.protobuf.UninterpretedOption
                 * @instance
                 */
                UninterpretedOption.prototype.negativeIntValue = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                /**
                 * UninterpretedOption doubleValue.
                 * @member {number} doubleValue
                 * @memberof google.protobuf.UninterpretedOption
                 * @instance
                 */
                UninterpretedOption.prototype.doubleValue = 0;
    
                /**
                 * UninterpretedOption stringValue.
                 * @member {Uint8Array} stringValue
                 * @memberof google.protobuf.UninterpretedOption
                 * @instance
                 */
                UninterpretedOption.prototype.stringValue = $util.newBuffer([]);
    
                /**
                 * UninterpretedOption aggregateValue.
                 * @member {string} aggregateValue
                 * @memberof google.protobuf.UninterpretedOption
                 * @instance
                 */
                UninterpretedOption.prototype.aggregateValue = "";
    
                /**
                 * Creates a new UninterpretedOption instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.UninterpretedOption
                 * @static
                 * @param {google.protobuf.IUninterpretedOption=} [properties] Properties to set
                 * @returns {google.protobuf.UninterpretedOption} UninterpretedOption instance
                 */
                UninterpretedOption.create = function create(properties) {
                    return new UninterpretedOption(properties);
                };
    
                /**
                 * Encodes the specified UninterpretedOption message. Does not implicitly {@link google.protobuf.UninterpretedOption.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.UninterpretedOption
                 * @static
                 * @param {google.protobuf.IUninterpretedOption} message UninterpretedOption message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                UninterpretedOption.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && message.name.length)
                        for (var i = 0; i < message.name.length; ++i)
                            $root.google.protobuf.UninterpretedOption.NamePart.encode(message.name[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                    if (message.identifierValue != null && Object.hasOwnProperty.call(message, "identifierValue"))
                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.identifierValue);
                    if (message.positiveIntValue != null && Object.hasOwnProperty.call(message, "positiveIntValue"))
                        writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.positiveIntValue);
                    if (message.negativeIntValue != null && Object.hasOwnProperty.call(message, "negativeIntValue"))
                        writer.uint32(/* id 5, wireType 0 =*/40).int64(message.negativeIntValue);
                    if (message.doubleValue != null && Object.hasOwnProperty.call(message, "doubleValue"))
                        writer.uint32(/* id 6, wireType 1 =*/49).double(message.doubleValue);
                    if (message.stringValue != null && Object.hasOwnProperty.call(message, "stringValue"))
                        writer.uint32(/* id 7, wireType 2 =*/58).bytes(message.stringValue);
                    if (message.aggregateValue != null && Object.hasOwnProperty.call(message, "aggregateValue"))
                        writer.uint32(/* id 8, wireType 2 =*/66).string(message.aggregateValue);
                    return writer;
                };
    
                /**
                 * Encodes the specified UninterpretedOption message, length delimited. Does not implicitly {@link google.protobuf.UninterpretedOption.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.UninterpretedOption
                 * @static
                 * @param {google.protobuf.IUninterpretedOption} message UninterpretedOption message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                UninterpretedOption.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an UninterpretedOption message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.UninterpretedOption
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.UninterpretedOption} UninterpretedOption
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                UninterpretedOption.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.UninterpretedOption();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 2:
                            if (!(message.name && message.name.length))
                                message.name = [];
                            message.name.push($root.google.protobuf.UninterpretedOption.NamePart.decode(reader, reader.uint32()));
                            break;
                        case 3:
                            message.identifierValue = reader.string();
                            break;
                        case 4:
                            message.positiveIntValue = reader.uint64();
                            break;
                        case 5:
                            message.negativeIntValue = reader.int64();
                            break;
                        case 6:
                            message.doubleValue = reader.double();
                            break;
                        case 7:
                            message.stringValue = reader.bytes();
                            break;
                        case 8:
                            message.aggregateValue = reader.string();
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an UninterpretedOption message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.UninterpretedOption
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.UninterpretedOption} UninterpretedOption
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                UninterpretedOption.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an UninterpretedOption message.
                 * @function verify
                 * @memberof google.protobuf.UninterpretedOption
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                UninterpretedOption.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name")) {
                        if (!Array.isArray(message.name))
                            return "name: array expected";
                        for (var i = 0; i < message.name.length; ++i) {
                            var error = $root.google.protobuf.UninterpretedOption.NamePart.verify(message.name[i]);
                            if (error)
                                return "name." + error;
                        }
                    }
                    if (message.identifierValue != null && message.hasOwnProperty("identifierValue"))
                        if (!$util.isString(message.identifierValue))
                            return "identifierValue: string expected";
                    if (message.positiveIntValue != null && message.hasOwnProperty("positiveIntValue"))
                        if (!$util.isInteger(message.positiveIntValue) && !(message.positiveIntValue && $util.isInteger(message.positiveIntValue.low) && $util.isInteger(message.positiveIntValue.high)))
                            return "positiveIntValue: integer|Long expected";
                    if (message.negativeIntValue != null && message.hasOwnProperty("negativeIntValue"))
                        if (!$util.isInteger(message.negativeIntValue) && !(message.negativeIntValue && $util.isInteger(message.negativeIntValue.low) && $util.isInteger(message.negativeIntValue.high)))
                            return "negativeIntValue: integer|Long expected";
                    if (message.doubleValue != null && message.hasOwnProperty("doubleValue"))
                        if (typeof message.doubleValue !== "number")
                            return "doubleValue: number expected";
                    if (message.stringValue != null && message.hasOwnProperty("stringValue"))
                        if (!(message.stringValue && typeof message.stringValue.length === "number" || $util.isString(message.stringValue)))
                            return "stringValue: buffer expected";
                    if (message.aggregateValue != null && message.hasOwnProperty("aggregateValue"))
                        if (!$util.isString(message.aggregateValue))
                            return "aggregateValue: string expected";
                    return null;
                };
    
                /**
                 * Creates an UninterpretedOption message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.UninterpretedOption
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.UninterpretedOption} UninterpretedOption
                 */
                UninterpretedOption.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.UninterpretedOption)
                        return object;
                    var message = new $root.google.protobuf.UninterpretedOption();
                    if (object.name) {
                        if (!Array.isArray(object.name))
                            throw TypeError(".google.protobuf.UninterpretedOption.name: array expected");
                        message.name = [];
                        for (var i = 0; i < object.name.length; ++i) {
                            if (typeof object.name[i] !== "object")
                                throw TypeError(".google.protobuf.UninterpretedOption.name: object expected");
                            message.name[i] = $root.google.protobuf.UninterpretedOption.NamePart.fromObject(object.name[i]);
                        }
                    }
                    if (object.identifierValue != null)
                        message.identifierValue = String(object.identifierValue);
                    if (object.positiveIntValue != null)
                        if ($util.Long)
                            (message.positiveIntValue = $util.Long.fromValue(object.positiveIntValue)).unsigned = true;
                        else if (typeof object.positiveIntValue === "string")
                            message.positiveIntValue = parseInt(object.positiveIntValue, 10);
                        else if (typeof object.positiveIntValue === "number")
                            message.positiveIntValue = object.positiveIntValue;
                        else if (typeof object.positiveIntValue === "object")
                            message.positiveIntValue = new $util.LongBits(object.positiveIntValue.low >>> 0, object.positiveIntValue.high >>> 0).toNumber(true);
                    if (object.negativeIntValue != null)
                        if ($util.Long)
                            (message.negativeIntValue = $util.Long.fromValue(object.negativeIntValue)).unsigned = false;
                        else if (typeof object.negativeIntValue === "string")
                            message.negativeIntValue = parseInt(object.negativeIntValue, 10);
                        else if (typeof object.negativeIntValue === "number")
                            message.negativeIntValue = object.negativeIntValue;
                        else if (typeof object.negativeIntValue === "object")
                            message.negativeIntValue = new $util.LongBits(object.negativeIntValue.low >>> 0, object.negativeIntValue.high >>> 0).toNumber();
                    if (object.doubleValue != null)
                        message.doubleValue = Number(object.doubleValue);
                    if (object.stringValue != null)
                        if (typeof object.stringValue === "string")
                            $util.base64.decode(object.stringValue, message.stringValue = $util.newBuffer($util.base64.length(object.stringValue)), 0);
                        else if (object.stringValue.length)
                            message.stringValue = object.stringValue;
                    if (object.aggregateValue != null)
                        message.aggregateValue = String(object.aggregateValue);
                    return message;
                };
    
                /**
                 * Creates a plain object from an UninterpretedOption message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.UninterpretedOption
                 * @static
                 * @param {google.protobuf.UninterpretedOption} message UninterpretedOption
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                UninterpretedOption.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.name = [];
                    if (options.defaults) {
                        object.identifierValue = "";
                        if ($util.Long) {
                            var long = new $util.Long(0, 0, true);
                            object.positiveIntValue = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                        } else
                            object.positiveIntValue = options.longs === String ? "0" : 0;
                        if ($util.Long) {
                            var long = new $util.Long(0, 0, false);
                            object.negativeIntValue = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                        } else
                            object.negativeIntValue = options.longs === String ? "0" : 0;
                        object.doubleValue = 0;
                        if (options.bytes === String)
                            object.stringValue = "";
                        else {
                            object.stringValue = [];
                            if (options.bytes !== Array)
                                object.stringValue = $util.newBuffer(object.stringValue);
                        }
                        object.aggregateValue = "";
                    }
                    if (message.name && message.name.length) {
                        object.name = [];
                        for (var j = 0; j < message.name.length; ++j)
                            object.name[j] = $root.google.protobuf.UninterpretedOption.NamePart.toObject(message.name[j], options);
                    }
                    if (message.identifierValue != null && message.hasOwnProperty("identifierValue"))
                        object.identifierValue = message.identifierValue;
                    if (message.positiveIntValue != null && message.hasOwnProperty("positiveIntValue"))
                        if (typeof message.positiveIntValue === "number")
                            object.positiveIntValue = options.longs === String ? String(message.positiveIntValue) : message.positiveIntValue;
                        else
                            object.positiveIntValue = options.longs === String ? $util.Long.prototype.toString.call(message.positiveIntValue) : options.longs === Number ? new $util.LongBits(message.positiveIntValue.low >>> 0, message.positiveIntValue.high >>> 0).toNumber(true) : message.positiveIntValue;
                    if (message.negativeIntValue != null && message.hasOwnProperty("negativeIntValue"))
                        if (typeof message.negativeIntValue === "number")
                            object.negativeIntValue = options.longs === String ? String(message.negativeIntValue) : message.negativeIntValue;
                        else
                            object.negativeIntValue = options.longs === String ? $util.Long.prototype.toString.call(message.negativeIntValue) : options.longs === Number ? new $util.LongBits(message.negativeIntValue.low >>> 0, message.negativeIntValue.high >>> 0).toNumber() : message.negativeIntValue;
                    if (message.doubleValue != null && message.hasOwnProperty("doubleValue"))
                        object.doubleValue = options.json && !isFinite(message.doubleValue) ? String(message.doubleValue) : message.doubleValue;
                    if (message.stringValue != null && message.hasOwnProperty("stringValue"))
                        object.stringValue = options.bytes === String ? $util.base64.encode(message.stringValue, 0, message.stringValue.length) : options.bytes === Array ? Array.prototype.slice.call(message.stringValue) : message.stringValue;
                    if (message.aggregateValue != null && message.hasOwnProperty("aggregateValue"))
                        object.aggregateValue = message.aggregateValue;
                    return object;
                };
    
                /**
                 * Converts this UninterpretedOption to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.UninterpretedOption
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                UninterpretedOption.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                UninterpretedOption.NamePart = (function() {
    
                    /**
                     * Properties of a NamePart.
                     * @memberof google.protobuf.UninterpretedOption
                     * @interface INamePart
                     * @property {string} namePart NamePart namePart
                     * @property {boolean} isExtension NamePart isExtension
                     */
    
                    /**
                     * Constructs a new NamePart.
                     * @memberof google.protobuf.UninterpretedOption
                     * @classdesc Represents a NamePart.
                     * @implements INamePart
                     * @constructor
                     * @param {google.protobuf.UninterpretedOption.INamePart=} [properties] Properties to set
                     */
                    function NamePart(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * NamePart namePart.
                     * @member {string} namePart
                     * @memberof google.protobuf.UninterpretedOption.NamePart
                     * @instance
                     */
                    NamePart.prototype.namePart = "";
    
                    /**
                     * NamePart isExtension.
                     * @member {boolean} isExtension
                     * @memberof google.protobuf.UninterpretedOption.NamePart
                     * @instance
                     */
                    NamePart.prototype.isExtension = false;
    
                    /**
                     * Creates a new NamePart instance using the specified properties.
                     * @function create
                     * @memberof google.protobuf.UninterpretedOption.NamePart
                     * @static
                     * @param {google.protobuf.UninterpretedOption.INamePart=} [properties] Properties to set
                     * @returns {google.protobuf.UninterpretedOption.NamePart} NamePart instance
                     */
                    NamePart.create = function create(properties) {
                        return new NamePart(properties);
                    };
    
                    /**
                     * Encodes the specified NamePart message. Does not implicitly {@link google.protobuf.UninterpretedOption.NamePart.verify|verify} messages.
                     * @function encode
                     * @memberof google.protobuf.UninterpretedOption.NamePart
                     * @static
                     * @param {google.protobuf.UninterpretedOption.INamePart} message NamePart message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    NamePart.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.namePart);
                        writer.uint32(/* id 2, wireType 0 =*/16).bool(message.isExtension);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified NamePart message, length delimited. Does not implicitly {@link google.protobuf.UninterpretedOption.NamePart.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.protobuf.UninterpretedOption.NamePart
                     * @static
                     * @param {google.protobuf.UninterpretedOption.INamePart} message NamePart message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    NamePart.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a NamePart message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.protobuf.UninterpretedOption.NamePart
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.protobuf.UninterpretedOption.NamePart} NamePart
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    NamePart.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.UninterpretedOption.NamePart();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.namePart = reader.string();
                                break;
                            case 2:
                                message.isExtension = reader.bool();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        if (!message.hasOwnProperty("namePart"))
                            throw $util.ProtocolError("missing required 'namePart'", { instance: message });
                        if (!message.hasOwnProperty("isExtension"))
                            throw $util.ProtocolError("missing required 'isExtension'", { instance: message });
                        return message;
                    };
    
                    /**
                     * Decodes a NamePart message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.protobuf.UninterpretedOption.NamePart
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.protobuf.UninterpretedOption.NamePart} NamePart
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    NamePart.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a NamePart message.
                     * @function verify
                     * @memberof google.protobuf.UninterpretedOption.NamePart
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    NamePart.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (!$util.isString(message.namePart))
                            return "namePart: string expected";
                        if (typeof message.isExtension !== "boolean")
                            return "isExtension: boolean expected";
                        return null;
                    };
    
                    /**
                     * Creates a NamePart message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.protobuf.UninterpretedOption.NamePart
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.protobuf.UninterpretedOption.NamePart} NamePart
                     */
                    NamePart.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.protobuf.UninterpretedOption.NamePart)
                            return object;
                        var message = new $root.google.protobuf.UninterpretedOption.NamePart();
                        if (object.namePart != null)
                            message.namePart = String(object.namePart);
                        if (object.isExtension != null)
                            message.isExtension = Boolean(object.isExtension);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a NamePart message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.protobuf.UninterpretedOption.NamePart
                     * @static
                     * @param {google.protobuf.UninterpretedOption.NamePart} message NamePart
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    NamePart.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.namePart = "";
                            object.isExtension = false;
                        }
                        if (message.namePart != null && message.hasOwnProperty("namePart"))
                            object.namePart = message.namePart;
                        if (message.isExtension != null && message.hasOwnProperty("isExtension"))
                            object.isExtension = message.isExtension;
                        return object;
                    };
    
                    /**
                     * Converts this NamePart to JSON.
                     * @function toJSON
                     * @memberof google.protobuf.UninterpretedOption.NamePart
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    NamePart.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return NamePart;
                })();
    
                return UninterpretedOption;
            })();
    
            protobuf.SourceCodeInfo = (function() {
    
                /**
                 * Properties of a SourceCodeInfo.
                 * @memberof google.protobuf
                 * @interface ISourceCodeInfo
                 * @property {Array.<google.protobuf.SourceCodeInfo.ILocation>|null} [location] SourceCodeInfo location
                 */
    
                /**
                 * Constructs a new SourceCodeInfo.
                 * @memberof google.protobuf
                 * @classdesc Represents a SourceCodeInfo.
                 * @implements ISourceCodeInfo
                 * @constructor
                 * @param {google.protobuf.ISourceCodeInfo=} [properties] Properties to set
                 */
                function SourceCodeInfo(properties) {
                    this.location = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * SourceCodeInfo location.
                 * @member {Array.<google.protobuf.SourceCodeInfo.ILocation>} location
                 * @memberof google.protobuf.SourceCodeInfo
                 * @instance
                 */
                SourceCodeInfo.prototype.location = $util.emptyArray;
    
                /**
                 * Creates a new SourceCodeInfo instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.SourceCodeInfo
                 * @static
                 * @param {google.protobuf.ISourceCodeInfo=} [properties] Properties to set
                 * @returns {google.protobuf.SourceCodeInfo} SourceCodeInfo instance
                 */
                SourceCodeInfo.create = function create(properties) {
                    return new SourceCodeInfo(properties);
                };
    
                /**
                 * Encodes the specified SourceCodeInfo message. Does not implicitly {@link google.protobuf.SourceCodeInfo.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.SourceCodeInfo
                 * @static
                 * @param {google.protobuf.ISourceCodeInfo} message SourceCodeInfo message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                SourceCodeInfo.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.location != null && message.location.length)
                        for (var i = 0; i < message.location.length; ++i)
                            $root.google.protobuf.SourceCodeInfo.Location.encode(message.location[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified SourceCodeInfo message, length delimited. Does not implicitly {@link google.protobuf.SourceCodeInfo.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.SourceCodeInfo
                 * @static
                 * @param {google.protobuf.ISourceCodeInfo} message SourceCodeInfo message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                SourceCodeInfo.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a SourceCodeInfo message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.SourceCodeInfo
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.SourceCodeInfo} SourceCodeInfo
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                SourceCodeInfo.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.SourceCodeInfo();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            if (!(message.location && message.location.length))
                                message.location = [];
                            message.location.push($root.google.protobuf.SourceCodeInfo.Location.decode(reader, reader.uint32()));
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a SourceCodeInfo message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.SourceCodeInfo
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.SourceCodeInfo} SourceCodeInfo
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                SourceCodeInfo.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a SourceCodeInfo message.
                 * @function verify
                 * @memberof google.protobuf.SourceCodeInfo
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                SourceCodeInfo.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.location != null && message.hasOwnProperty("location")) {
                        if (!Array.isArray(message.location))
                            return "location: array expected";
                        for (var i = 0; i < message.location.length; ++i) {
                            var error = $root.google.protobuf.SourceCodeInfo.Location.verify(message.location[i]);
                            if (error)
                                return "location." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates a SourceCodeInfo message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.SourceCodeInfo
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.SourceCodeInfo} SourceCodeInfo
                 */
                SourceCodeInfo.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.SourceCodeInfo)
                        return object;
                    var message = new $root.google.protobuf.SourceCodeInfo();
                    if (object.location) {
                        if (!Array.isArray(object.location))
                            throw TypeError(".google.protobuf.SourceCodeInfo.location: array expected");
                        message.location = [];
                        for (var i = 0; i < object.location.length; ++i) {
                            if (typeof object.location[i] !== "object")
                                throw TypeError(".google.protobuf.SourceCodeInfo.location: object expected");
                            message.location[i] = $root.google.protobuf.SourceCodeInfo.Location.fromObject(object.location[i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a SourceCodeInfo message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.SourceCodeInfo
                 * @static
                 * @param {google.protobuf.SourceCodeInfo} message SourceCodeInfo
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                SourceCodeInfo.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.location = [];
                    if (message.location && message.location.length) {
                        object.location = [];
                        for (var j = 0; j < message.location.length; ++j)
                            object.location[j] = $root.google.protobuf.SourceCodeInfo.Location.toObject(message.location[j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this SourceCodeInfo to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.SourceCodeInfo
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                SourceCodeInfo.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                SourceCodeInfo.Location = (function() {
    
                    /**
                     * Properties of a Location.
                     * @memberof google.protobuf.SourceCodeInfo
                     * @interface ILocation
                     * @property {Array.<number>|null} [path] Location path
                     * @property {Array.<number>|null} [span] Location span
                     * @property {string|null} [leadingComments] Location leadingComments
                     * @property {string|null} [trailingComments] Location trailingComments
                     * @property {Array.<string>|null} [leadingDetachedComments] Location leadingDetachedComments
                     */
    
                    /**
                     * Constructs a new Location.
                     * @memberof google.protobuf.SourceCodeInfo
                     * @classdesc Represents a Location.
                     * @implements ILocation
                     * @constructor
                     * @param {google.protobuf.SourceCodeInfo.ILocation=} [properties] Properties to set
                     */
                    function Location(properties) {
                        this.path = [];
                        this.span = [];
                        this.leadingDetachedComments = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * Location path.
                     * @member {Array.<number>} path
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @instance
                     */
                    Location.prototype.path = $util.emptyArray;
    
                    /**
                     * Location span.
                     * @member {Array.<number>} span
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @instance
                     */
                    Location.prototype.span = $util.emptyArray;
    
                    /**
                     * Location leadingComments.
                     * @member {string} leadingComments
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @instance
                     */
                    Location.prototype.leadingComments = "";
    
                    /**
                     * Location trailingComments.
                     * @member {string} trailingComments
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @instance
                     */
                    Location.prototype.trailingComments = "";
    
                    /**
                     * Location leadingDetachedComments.
                     * @member {Array.<string>} leadingDetachedComments
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @instance
                     */
                    Location.prototype.leadingDetachedComments = $util.emptyArray;
    
                    /**
                     * Creates a new Location instance using the specified properties.
                     * @function create
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @static
                     * @param {google.protobuf.SourceCodeInfo.ILocation=} [properties] Properties to set
                     * @returns {google.protobuf.SourceCodeInfo.Location} Location instance
                     */
                    Location.create = function create(properties) {
                        return new Location(properties);
                    };
    
                    /**
                     * Encodes the specified Location message. Does not implicitly {@link google.protobuf.SourceCodeInfo.Location.verify|verify} messages.
                     * @function encode
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @static
                     * @param {google.protobuf.SourceCodeInfo.ILocation} message Location message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Location.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.path != null && message.path.length) {
                            writer.uint32(/* id 1, wireType 2 =*/10).fork();
                            for (var i = 0; i < message.path.length; ++i)
                                writer.int32(message.path[i]);
                            writer.ldelim();
                        }
                        if (message.span != null && message.span.length) {
                            writer.uint32(/* id 2, wireType 2 =*/18).fork();
                            for (var i = 0; i < message.span.length; ++i)
                                writer.int32(message.span[i]);
                            writer.ldelim();
                        }
                        if (message.leadingComments != null && Object.hasOwnProperty.call(message, "leadingComments"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.leadingComments);
                        if (message.trailingComments != null && Object.hasOwnProperty.call(message, "trailingComments"))
                            writer.uint32(/* id 4, wireType 2 =*/34).string(message.trailingComments);
                        if (message.leadingDetachedComments != null && message.leadingDetachedComments.length)
                            for (var i = 0; i < message.leadingDetachedComments.length; ++i)
                                writer.uint32(/* id 6, wireType 2 =*/50).string(message.leadingDetachedComments[i]);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified Location message, length delimited. Does not implicitly {@link google.protobuf.SourceCodeInfo.Location.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @static
                     * @param {google.protobuf.SourceCodeInfo.ILocation} message Location message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Location.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a Location message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.protobuf.SourceCodeInfo.Location} Location
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Location.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.SourceCodeInfo.Location();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                if (!(message.path && message.path.length))
                                    message.path = [];
                                if ((tag & 7) === 2) {
                                    var end2 = reader.uint32() + reader.pos;
                                    while (reader.pos < end2)
                                        message.path.push(reader.int32());
                                } else
                                    message.path.push(reader.int32());
                                break;
                            case 2:
                                if (!(message.span && message.span.length))
                                    message.span = [];
                                if ((tag & 7) === 2) {
                                    var end2 = reader.uint32() + reader.pos;
                                    while (reader.pos < end2)
                                        message.span.push(reader.int32());
                                } else
                                    message.span.push(reader.int32());
                                break;
                            case 3:
                                message.leadingComments = reader.string();
                                break;
                            case 4:
                                message.trailingComments = reader.string();
                                break;
                            case 6:
                                if (!(message.leadingDetachedComments && message.leadingDetachedComments.length))
                                    message.leadingDetachedComments = [];
                                message.leadingDetachedComments.push(reader.string());
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a Location message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.protobuf.SourceCodeInfo.Location} Location
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Location.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a Location message.
                     * @function verify
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    Location.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.path != null && message.hasOwnProperty("path")) {
                            if (!Array.isArray(message.path))
                                return "path: array expected";
                            for (var i = 0; i < message.path.length; ++i)
                                if (!$util.isInteger(message.path[i]))
                                    return "path: integer[] expected";
                        }
                        if (message.span != null && message.hasOwnProperty("span")) {
                            if (!Array.isArray(message.span))
                                return "span: array expected";
                            for (var i = 0; i < message.span.length; ++i)
                                if (!$util.isInteger(message.span[i]))
                                    return "span: integer[] expected";
                        }
                        if (message.leadingComments != null && message.hasOwnProperty("leadingComments"))
                            if (!$util.isString(message.leadingComments))
                                return "leadingComments: string expected";
                        if (message.trailingComments != null && message.hasOwnProperty("trailingComments"))
                            if (!$util.isString(message.trailingComments))
                                return "trailingComments: string expected";
                        if (message.leadingDetachedComments != null && message.hasOwnProperty("leadingDetachedComments")) {
                            if (!Array.isArray(message.leadingDetachedComments))
                                return "leadingDetachedComments: array expected";
                            for (var i = 0; i < message.leadingDetachedComments.length; ++i)
                                if (!$util.isString(message.leadingDetachedComments[i]))
                                    return "leadingDetachedComments: string[] expected";
                        }
                        return null;
                    };
    
                    /**
                     * Creates a Location message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.protobuf.SourceCodeInfo.Location} Location
                     */
                    Location.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.protobuf.SourceCodeInfo.Location)
                            return object;
                        var message = new $root.google.protobuf.SourceCodeInfo.Location();
                        if (object.path) {
                            if (!Array.isArray(object.path))
                                throw TypeError(".google.protobuf.SourceCodeInfo.Location.path: array expected");
                            message.path = [];
                            for (var i = 0; i < object.path.length; ++i)
                                message.path[i] = object.path[i] | 0;
                        }
                        if (object.span) {
                            if (!Array.isArray(object.span))
                                throw TypeError(".google.protobuf.SourceCodeInfo.Location.span: array expected");
                            message.span = [];
                            for (var i = 0; i < object.span.length; ++i)
                                message.span[i] = object.span[i] | 0;
                        }
                        if (object.leadingComments != null)
                            message.leadingComments = String(object.leadingComments);
                        if (object.trailingComments != null)
                            message.trailingComments = String(object.trailingComments);
                        if (object.leadingDetachedComments) {
                            if (!Array.isArray(object.leadingDetachedComments))
                                throw TypeError(".google.protobuf.SourceCodeInfo.Location.leadingDetachedComments: array expected");
                            message.leadingDetachedComments = [];
                            for (var i = 0; i < object.leadingDetachedComments.length; ++i)
                                message.leadingDetachedComments[i] = String(object.leadingDetachedComments[i]);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a Location message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @static
                     * @param {google.protobuf.SourceCodeInfo.Location} message Location
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    Location.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults) {
                            object.path = [];
                            object.span = [];
                            object.leadingDetachedComments = [];
                        }
                        if (options.defaults) {
                            object.leadingComments = "";
                            object.trailingComments = "";
                        }
                        if (message.path && message.path.length) {
                            object.path = [];
                            for (var j = 0; j < message.path.length; ++j)
                                object.path[j] = message.path[j];
                        }
                        if (message.span && message.span.length) {
                            object.span = [];
                            for (var j = 0; j < message.span.length; ++j)
                                object.span[j] = message.span[j];
                        }
                        if (message.leadingComments != null && message.hasOwnProperty("leadingComments"))
                            object.leadingComments = message.leadingComments;
                        if (message.trailingComments != null && message.hasOwnProperty("trailingComments"))
                            object.trailingComments = message.trailingComments;
                        if (message.leadingDetachedComments && message.leadingDetachedComments.length) {
                            object.leadingDetachedComments = [];
                            for (var j = 0; j < message.leadingDetachedComments.length; ++j)
                                object.leadingDetachedComments[j] = message.leadingDetachedComments[j];
                        }
                        return object;
                    };
    
                    /**
                     * Converts this Location to JSON.
                     * @function toJSON
                     * @memberof google.protobuf.SourceCodeInfo.Location
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    Location.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return Location;
                })();
    
                return SourceCodeInfo;
            })();
    
            protobuf.GeneratedCodeInfo = (function() {
    
                /**
                 * Properties of a GeneratedCodeInfo.
                 * @memberof google.protobuf
                 * @interface IGeneratedCodeInfo
                 * @property {Array.<google.protobuf.GeneratedCodeInfo.IAnnotation>|null} [annotation] GeneratedCodeInfo annotation
                 */
    
                /**
                 * Constructs a new GeneratedCodeInfo.
                 * @memberof google.protobuf
                 * @classdesc Represents a GeneratedCodeInfo.
                 * @implements IGeneratedCodeInfo
                 * @constructor
                 * @param {google.protobuf.IGeneratedCodeInfo=} [properties] Properties to set
                 */
                function GeneratedCodeInfo(properties) {
                    this.annotation = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * GeneratedCodeInfo annotation.
                 * @member {Array.<google.protobuf.GeneratedCodeInfo.IAnnotation>} annotation
                 * @memberof google.protobuf.GeneratedCodeInfo
                 * @instance
                 */
                GeneratedCodeInfo.prototype.annotation = $util.emptyArray;
    
                /**
                 * Creates a new GeneratedCodeInfo instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.GeneratedCodeInfo
                 * @static
                 * @param {google.protobuf.IGeneratedCodeInfo=} [properties] Properties to set
                 * @returns {google.protobuf.GeneratedCodeInfo} GeneratedCodeInfo instance
                 */
                GeneratedCodeInfo.create = function create(properties) {
                    return new GeneratedCodeInfo(properties);
                };
    
                /**
                 * Encodes the specified GeneratedCodeInfo message. Does not implicitly {@link google.protobuf.GeneratedCodeInfo.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.GeneratedCodeInfo
                 * @static
                 * @param {google.protobuf.IGeneratedCodeInfo} message GeneratedCodeInfo message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                GeneratedCodeInfo.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.annotation != null && message.annotation.length)
                        for (var i = 0; i < message.annotation.length; ++i)
                            $root.google.protobuf.GeneratedCodeInfo.Annotation.encode(message.annotation[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified GeneratedCodeInfo message, length delimited. Does not implicitly {@link google.protobuf.GeneratedCodeInfo.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.GeneratedCodeInfo
                 * @static
                 * @param {google.protobuf.IGeneratedCodeInfo} message GeneratedCodeInfo message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                GeneratedCodeInfo.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a GeneratedCodeInfo message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.GeneratedCodeInfo
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.GeneratedCodeInfo} GeneratedCodeInfo
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                GeneratedCodeInfo.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.GeneratedCodeInfo();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            if (!(message.annotation && message.annotation.length))
                                message.annotation = [];
                            message.annotation.push($root.google.protobuf.GeneratedCodeInfo.Annotation.decode(reader, reader.uint32()));
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a GeneratedCodeInfo message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.GeneratedCodeInfo
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.GeneratedCodeInfo} GeneratedCodeInfo
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                GeneratedCodeInfo.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a GeneratedCodeInfo message.
                 * @function verify
                 * @memberof google.protobuf.GeneratedCodeInfo
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                GeneratedCodeInfo.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.annotation != null && message.hasOwnProperty("annotation")) {
                        if (!Array.isArray(message.annotation))
                            return "annotation: array expected";
                        for (var i = 0; i < message.annotation.length; ++i) {
                            var error = $root.google.protobuf.GeneratedCodeInfo.Annotation.verify(message.annotation[i]);
                            if (error)
                                return "annotation." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates a GeneratedCodeInfo message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.GeneratedCodeInfo
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.GeneratedCodeInfo} GeneratedCodeInfo
                 */
                GeneratedCodeInfo.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.GeneratedCodeInfo)
                        return object;
                    var message = new $root.google.protobuf.GeneratedCodeInfo();
                    if (object.annotation) {
                        if (!Array.isArray(object.annotation))
                            throw TypeError(".google.protobuf.GeneratedCodeInfo.annotation: array expected");
                        message.annotation = [];
                        for (var i = 0; i < object.annotation.length; ++i) {
                            if (typeof object.annotation[i] !== "object")
                                throw TypeError(".google.protobuf.GeneratedCodeInfo.annotation: object expected");
                            message.annotation[i] = $root.google.protobuf.GeneratedCodeInfo.Annotation.fromObject(object.annotation[i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a GeneratedCodeInfo message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.GeneratedCodeInfo
                 * @static
                 * @param {google.protobuf.GeneratedCodeInfo} message GeneratedCodeInfo
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                GeneratedCodeInfo.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.annotation = [];
                    if (message.annotation && message.annotation.length) {
                        object.annotation = [];
                        for (var j = 0; j < message.annotation.length; ++j)
                            object.annotation[j] = $root.google.protobuf.GeneratedCodeInfo.Annotation.toObject(message.annotation[j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this GeneratedCodeInfo to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.GeneratedCodeInfo
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                GeneratedCodeInfo.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                GeneratedCodeInfo.Annotation = (function() {
    
                    /**
                     * Properties of an Annotation.
                     * @memberof google.protobuf.GeneratedCodeInfo
                     * @interface IAnnotation
                     * @property {Array.<number>|null} [path] Annotation path
                     * @property {string|null} [sourceFile] Annotation sourceFile
                     * @property {number|null} [begin] Annotation begin
                     * @property {number|null} [end] Annotation end
                     */
    
                    /**
                     * Constructs a new Annotation.
                     * @memberof google.protobuf.GeneratedCodeInfo
                     * @classdesc Represents an Annotation.
                     * @implements IAnnotation
                     * @constructor
                     * @param {google.protobuf.GeneratedCodeInfo.IAnnotation=} [properties] Properties to set
                     */
                    function Annotation(properties) {
                        this.path = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * Annotation path.
                     * @member {Array.<number>} path
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @instance
                     */
                    Annotation.prototype.path = $util.emptyArray;
    
                    /**
                     * Annotation sourceFile.
                     * @member {string} sourceFile
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @instance
                     */
                    Annotation.prototype.sourceFile = "";
    
                    /**
                     * Annotation begin.
                     * @member {number} begin
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @instance
                     */
                    Annotation.prototype.begin = 0;
    
                    /**
                     * Annotation end.
                     * @member {number} end
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @instance
                     */
                    Annotation.prototype.end = 0;
    
                    /**
                     * Creates a new Annotation instance using the specified properties.
                     * @function create
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @static
                     * @param {google.protobuf.GeneratedCodeInfo.IAnnotation=} [properties] Properties to set
                     * @returns {google.protobuf.GeneratedCodeInfo.Annotation} Annotation instance
                     */
                    Annotation.create = function create(properties) {
                        return new Annotation(properties);
                    };
    
                    /**
                     * Encodes the specified Annotation message. Does not implicitly {@link google.protobuf.GeneratedCodeInfo.Annotation.verify|verify} messages.
                     * @function encode
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @static
                     * @param {google.protobuf.GeneratedCodeInfo.IAnnotation} message Annotation message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Annotation.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.path != null && message.path.length) {
                            writer.uint32(/* id 1, wireType 2 =*/10).fork();
                            for (var i = 0; i < message.path.length; ++i)
                                writer.int32(message.path[i]);
                            writer.ldelim();
                        }
                        if (message.sourceFile != null && Object.hasOwnProperty.call(message, "sourceFile"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.sourceFile);
                        if (message.begin != null && Object.hasOwnProperty.call(message, "begin"))
                            writer.uint32(/* id 3, wireType 0 =*/24).int32(message.begin);
                        if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                            writer.uint32(/* id 4, wireType 0 =*/32).int32(message.end);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified Annotation message, length delimited. Does not implicitly {@link google.protobuf.GeneratedCodeInfo.Annotation.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @static
                     * @param {google.protobuf.GeneratedCodeInfo.IAnnotation} message Annotation message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Annotation.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes an Annotation message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.protobuf.GeneratedCodeInfo.Annotation} Annotation
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Annotation.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.GeneratedCodeInfo.Annotation();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                if (!(message.path && message.path.length))
                                    message.path = [];
                                if ((tag & 7) === 2) {
                                    var end2 = reader.uint32() + reader.pos;
                                    while (reader.pos < end2)
                                        message.path.push(reader.int32());
                                } else
                                    message.path.push(reader.int32());
                                break;
                            case 2:
                                message.sourceFile = reader.string();
                                break;
                            case 3:
                                message.begin = reader.int32();
                                break;
                            case 4:
                                message.end = reader.int32();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes an Annotation message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.protobuf.GeneratedCodeInfo.Annotation} Annotation
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Annotation.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies an Annotation message.
                     * @function verify
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    Annotation.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.path != null && message.hasOwnProperty("path")) {
                            if (!Array.isArray(message.path))
                                return "path: array expected";
                            for (var i = 0; i < message.path.length; ++i)
                                if (!$util.isInteger(message.path[i]))
                                    return "path: integer[] expected";
                        }
                        if (message.sourceFile != null && message.hasOwnProperty("sourceFile"))
                            if (!$util.isString(message.sourceFile))
                                return "sourceFile: string expected";
                        if (message.begin != null && message.hasOwnProperty("begin"))
                            if (!$util.isInteger(message.begin))
                                return "begin: integer expected";
                        if (message.end != null && message.hasOwnProperty("end"))
                            if (!$util.isInteger(message.end))
                                return "end: integer expected";
                        return null;
                    };
    
                    /**
                     * Creates an Annotation message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.protobuf.GeneratedCodeInfo.Annotation} Annotation
                     */
                    Annotation.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.protobuf.GeneratedCodeInfo.Annotation)
                            return object;
                        var message = new $root.google.protobuf.GeneratedCodeInfo.Annotation();
                        if (object.path) {
                            if (!Array.isArray(object.path))
                                throw TypeError(".google.protobuf.GeneratedCodeInfo.Annotation.path: array expected");
                            message.path = [];
                            for (var i = 0; i < object.path.length; ++i)
                                message.path[i] = object.path[i] | 0;
                        }
                        if (object.sourceFile != null)
                            message.sourceFile = String(object.sourceFile);
                        if (object.begin != null)
                            message.begin = object.begin | 0;
                        if (object.end != null)
                            message.end = object.end | 0;
                        return message;
                    };
    
                    /**
                     * Creates a plain object from an Annotation message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @static
                     * @param {google.protobuf.GeneratedCodeInfo.Annotation} message Annotation
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    Annotation.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.path = [];
                        if (options.defaults) {
                            object.sourceFile = "";
                            object.begin = 0;
                            object.end = 0;
                        }
                        if (message.path && message.path.length) {
                            object.path = [];
                            for (var j = 0; j < message.path.length; ++j)
                                object.path[j] = message.path[j];
                        }
                        if (message.sourceFile != null && message.hasOwnProperty("sourceFile"))
                            object.sourceFile = message.sourceFile;
                        if (message.begin != null && message.hasOwnProperty("begin"))
                            object.begin = message.begin;
                        if (message.end != null && message.hasOwnProperty("end"))
                            object.end = message.end;
                        return object;
                    };
    
                    /**
                     * Converts this Annotation to JSON.
                     * @function toJSON
                     * @memberof google.protobuf.GeneratedCodeInfo.Annotation
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    Annotation.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return Annotation;
                })();
    
                return GeneratedCodeInfo;
            })();
    
            protobuf.Struct = (function() {
    
                /**
                 * Properties of a Struct.
                 * @memberof google.protobuf
                 * @interface IStruct
                 * @property {Object.<string,google.protobuf.IValue>|null} [fields] Struct fields
                 */
    
                /**
                 * Constructs a new Struct.
                 * @memberof google.protobuf
                 * @classdesc Represents a Struct.
                 * @implements IStruct
                 * @constructor
                 * @param {google.protobuf.IStruct=} [properties] Properties to set
                 */
                function Struct(properties) {
                    this.fields = {};
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * Struct fields.
                 * @member {Object.<string,google.protobuf.IValue>} fields
                 * @memberof google.protobuf.Struct
                 * @instance
                 */
                Struct.prototype.fields = $util.emptyObject;
    
                /**
                 * Creates a new Struct instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.Struct
                 * @static
                 * @param {google.protobuf.IStruct=} [properties] Properties to set
                 * @returns {google.protobuf.Struct} Struct instance
                 */
                Struct.create = function create(properties) {
                    return new Struct(properties);
                };
    
                /**
                 * Encodes the specified Struct message. Does not implicitly {@link google.protobuf.Struct.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.Struct
                 * @static
                 * @param {google.protobuf.IStruct} message Struct message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Struct.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.fields != null && Object.hasOwnProperty.call(message, "fields"))
                        for (var keys = Object.keys(message.fields), i = 0; i < keys.length; ++i) {
                            writer.uint32(/* id 1, wireType 2 =*/10).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]);
                            $root.google.protobuf.Value.encode(message.fields[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim();
                        }
                    return writer;
                };
    
                /**
                 * Encodes the specified Struct message, length delimited. Does not implicitly {@link google.protobuf.Struct.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.Struct
                 * @static
                 * @param {google.protobuf.IStruct} message Struct message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Struct.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a Struct message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.Struct
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.Struct} Struct
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Struct.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.Struct(), key, value;
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            if (message.fields === $util.emptyObject)
                                message.fields = {};
                            var end2 = reader.uint32() + reader.pos;
                            key = "";
                            value = null;
                            while (reader.pos < end2) {
                                var tag2 = reader.uint32();
                                switch (tag2 >>> 3) {
                                case 1:
                                    key = reader.string();
                                    break;
                                case 2:
                                    value = $root.google.protobuf.Value.decode(reader, reader.uint32());
                                    break;
                                default:
                                    reader.skipType(tag2 & 7);
                                    break;
                                }
                            }
                            message.fields[key] = value;
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a Struct message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.Struct
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.Struct} Struct
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Struct.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a Struct message.
                 * @function verify
                 * @memberof google.protobuf.Struct
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                Struct.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.fields != null && message.hasOwnProperty("fields")) {
                        if (!$util.isObject(message.fields))
                            return "fields: object expected";
                        var key = Object.keys(message.fields);
                        for (var i = 0; i < key.length; ++i) {
                            var error = $root.google.protobuf.Value.verify(message.fields[key[i]]);
                            if (error)
                                return "fields." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates a Struct message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.Struct
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.Struct} Struct
                 */
                Struct.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.Struct)
                        return object;
                    var message = new $root.google.protobuf.Struct();
                    if (object.fields) {
                        if (typeof object.fields !== "object")
                            throw TypeError(".google.protobuf.Struct.fields: object expected");
                        message.fields = {};
                        for (var keys = Object.keys(object.fields), i = 0; i < keys.length; ++i) {
                            if (typeof object.fields[keys[i]] !== "object")
                                throw TypeError(".google.protobuf.Struct.fields: object expected");
                            message.fields[keys[i]] = $root.google.protobuf.Value.fromObject(object.fields[keys[i]]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a Struct message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.Struct
                 * @static
                 * @param {google.protobuf.Struct} message Struct
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                Struct.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.objects || options.defaults)
                        object.fields = {};
                    var keys2;
                    if (message.fields && (keys2 = Object.keys(message.fields)).length) {
                        object.fields = {};
                        for (var j = 0; j < keys2.length; ++j)
                            object.fields[keys2[j]] = $root.google.protobuf.Value.toObject(message.fields[keys2[j]], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this Struct to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.Struct
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                Struct.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return Struct;
            })();
    
            protobuf.Value = (function() {
    
                /**
                 * Properties of a Value.
                 * @memberof google.protobuf
                 * @interface IValue
                 * @property {google.protobuf.NullValue|null} [nullValue] Value nullValue
                 * @property {number|null} [numberValue] Value numberValue
                 * @property {string|null} [stringValue] Value stringValue
                 * @property {boolean|null} [boolValue] Value boolValue
                 * @property {google.protobuf.IStruct|null} [structValue] Value structValue
                 * @property {google.protobuf.IListValue|null} [listValue] Value listValue
                 */
    
                /**
                 * Constructs a new Value.
                 * @memberof google.protobuf
                 * @classdesc Represents a Value.
                 * @implements IValue
                 * @constructor
                 * @param {google.protobuf.IValue=} [properties] Properties to set
                 */
                function Value(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * Value nullValue.
                 * @member {google.protobuf.NullValue|null|undefined} nullValue
                 * @memberof google.protobuf.Value
                 * @instance
                 */
                Value.prototype.nullValue = null;
    
                /**
                 * Value numberValue.
                 * @member {number|null|undefined} numberValue
                 * @memberof google.protobuf.Value
                 * @instance
                 */
                Value.prototype.numberValue = null;
    
                /**
                 * Value stringValue.
                 * @member {string|null|undefined} stringValue
                 * @memberof google.protobuf.Value
                 * @instance
                 */
                Value.prototype.stringValue = null;
    
                /**
                 * Value boolValue.
                 * @member {boolean|null|undefined} boolValue
                 * @memberof google.protobuf.Value
                 * @instance
                 */
                Value.prototype.boolValue = null;
    
                /**
                 * Value structValue.
                 * @member {google.protobuf.IStruct|null|undefined} structValue
                 * @memberof google.protobuf.Value
                 * @instance
                 */
                Value.prototype.structValue = null;
    
                /**
                 * Value listValue.
                 * @member {google.protobuf.IListValue|null|undefined} listValue
                 * @memberof google.protobuf.Value
                 * @instance
                 */
                Value.prototype.listValue = null;
    
                // OneOf field names bound to virtual getters and setters
                var $oneOfFields;
    
                /**
                 * Value kind.
                 * @member {"nullValue"|"numberValue"|"stringValue"|"boolValue"|"structValue"|"listValue"|undefined} kind
                 * @memberof google.protobuf.Value
                 * @instance
                 */
                Object.defineProperty(Value.prototype, "kind", {
                    get: $util.oneOfGetter($oneOfFields = ["nullValue", "numberValue", "stringValue", "boolValue", "structValue", "listValue"]),
                    set: $util.oneOfSetter($oneOfFields)
                });
    
                /**
                 * Creates a new Value instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.Value
                 * @static
                 * @param {google.protobuf.IValue=} [properties] Properties to set
                 * @returns {google.protobuf.Value} Value instance
                 */
                Value.create = function create(properties) {
                    return new Value(properties);
                };
    
                /**
                 * Encodes the specified Value message. Does not implicitly {@link google.protobuf.Value.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.Value
                 * @static
                 * @param {google.protobuf.IValue} message Value message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Value.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.nullValue != null && Object.hasOwnProperty.call(message, "nullValue"))
                        writer.uint32(/* id 1, wireType 0 =*/8).int32(message.nullValue);
                    if (message.numberValue != null && Object.hasOwnProperty.call(message, "numberValue"))
                        writer.uint32(/* id 2, wireType 1 =*/17).double(message.numberValue);
                    if (message.stringValue != null && Object.hasOwnProperty.call(message, "stringValue"))
                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.stringValue);
                    if (message.boolValue != null && Object.hasOwnProperty.call(message, "boolValue"))
                        writer.uint32(/* id 4, wireType 0 =*/32).bool(message.boolValue);
                    if (message.structValue != null && Object.hasOwnProperty.call(message, "structValue"))
                        $root.google.protobuf.Struct.encode(message.structValue, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                    if (message.listValue != null && Object.hasOwnProperty.call(message, "listValue"))
                        $root.google.protobuf.ListValue.encode(message.listValue, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified Value message, length delimited. Does not implicitly {@link google.protobuf.Value.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.Value
                 * @static
                 * @param {google.protobuf.IValue} message Value message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Value.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a Value message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.Value
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.Value} Value
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Value.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.Value();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.nullValue = reader.int32();
                            break;
                        case 2:
                            message.numberValue = reader.double();
                            break;
                        case 3:
                            message.stringValue = reader.string();
                            break;
                        case 4:
                            message.boolValue = reader.bool();
                            break;
                        case 5:
                            message.structValue = $root.google.protobuf.Struct.decode(reader, reader.uint32());
                            break;
                        case 6:
                            message.listValue = $root.google.protobuf.ListValue.decode(reader, reader.uint32());
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a Value message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.Value
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.Value} Value
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Value.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a Value message.
                 * @function verify
                 * @memberof google.protobuf.Value
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                Value.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    var properties = {};
                    if (message.nullValue != null && message.hasOwnProperty("nullValue")) {
                        properties.kind = 1;
                        switch (message.nullValue) {
                        default:
                            return "nullValue: enum value expected";
                        case 0:
                            break;
                        }
                    }
                    if (message.numberValue != null && message.hasOwnProperty("numberValue")) {
                        if (properties.kind === 1)
                            return "kind: multiple values";
                        properties.kind = 1;
                        if (typeof message.numberValue !== "number")
                            return "numberValue: number expected";
                    }
                    if (message.stringValue != null && message.hasOwnProperty("stringValue")) {
                        if (properties.kind === 1)
                            return "kind: multiple values";
                        properties.kind = 1;
                        if (!$util.isString(message.stringValue))
                            return "stringValue: string expected";
                    }
                    if (message.boolValue != null && message.hasOwnProperty("boolValue")) {
                        if (properties.kind === 1)
                            return "kind: multiple values";
                        properties.kind = 1;
                        if (typeof message.boolValue !== "boolean")
                            return "boolValue: boolean expected";
                    }
                    if (message.structValue != null && message.hasOwnProperty("structValue")) {
                        if (properties.kind === 1)
                            return "kind: multiple values";
                        properties.kind = 1;
                        {
                            var error = $root.google.protobuf.Struct.verify(message.structValue);
                            if (error)
                                return "structValue." + error;
                        }
                    }
                    if (message.listValue != null && message.hasOwnProperty("listValue")) {
                        if (properties.kind === 1)
                            return "kind: multiple values";
                        properties.kind = 1;
                        {
                            var error = $root.google.protobuf.ListValue.verify(message.listValue);
                            if (error)
                                return "listValue." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates a Value message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.Value
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.Value} Value
                 */
                Value.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.Value)
                        return object;
                    var message = new $root.google.protobuf.Value();
                    switch (object.nullValue) {
                    case "NULL_VALUE":
                    case 0:
                        message.nullValue = 0;
                        break;
                    }
                    if (object.numberValue != null)
                        message.numberValue = Number(object.numberValue);
                    if (object.stringValue != null)
                        message.stringValue = String(object.stringValue);
                    if (object.boolValue != null)
                        message.boolValue = Boolean(object.boolValue);
                    if (object.structValue != null) {
                        if (typeof object.structValue !== "object")
                            throw TypeError(".google.protobuf.Value.structValue: object expected");
                        message.structValue = $root.google.protobuf.Struct.fromObject(object.structValue);
                    }
                    if (object.listValue != null) {
                        if (typeof object.listValue !== "object")
                            throw TypeError(".google.protobuf.Value.listValue: object expected");
                        message.listValue = $root.google.protobuf.ListValue.fromObject(object.listValue);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a Value message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.Value
                 * @static
                 * @param {google.protobuf.Value} message Value
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                Value.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (message.nullValue != null && message.hasOwnProperty("nullValue")) {
                        object.nullValue = options.enums === String ? $root.google.protobuf.NullValue[message.nullValue] : message.nullValue;
                        if (options.oneofs)
                            object.kind = "nullValue";
                    }
                    if (message.numberValue != null && message.hasOwnProperty("numberValue")) {
                        object.numberValue = options.json && !isFinite(message.numberValue) ? String(message.numberValue) : message.numberValue;
                        if (options.oneofs)
                            object.kind = "numberValue";
                    }
                    if (message.stringValue != null && message.hasOwnProperty("stringValue")) {
                        object.stringValue = message.stringValue;
                        if (options.oneofs)
                            object.kind = "stringValue";
                    }
                    if (message.boolValue != null && message.hasOwnProperty("boolValue")) {
                        object.boolValue = message.boolValue;
                        if (options.oneofs)
                            object.kind = "boolValue";
                    }
                    if (message.structValue != null && message.hasOwnProperty("structValue")) {
                        object.structValue = $root.google.protobuf.Struct.toObject(message.structValue, options);
                        if (options.oneofs)
                            object.kind = "structValue";
                    }
                    if (message.listValue != null && message.hasOwnProperty("listValue")) {
                        object.listValue = $root.google.protobuf.ListValue.toObject(message.listValue, options);
                        if (options.oneofs)
                            object.kind = "listValue";
                    }
                    return object;
                };
    
                /**
                 * Converts this Value to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.Value
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                Value.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return Value;
            })();
    
            /**
             * NullValue enum.
             * @name google.protobuf.NullValue
             * @enum {number}
             * @property {number} NULL_VALUE=0 NULL_VALUE value
             */
            protobuf.NullValue = (function() {
                var valuesById = {}, values = Object.create(valuesById);
                values[valuesById[0] = "NULL_VALUE"] = 0;
                return values;
            })();
    
            protobuf.ListValue = (function() {
    
                /**
                 * Properties of a ListValue.
                 * @memberof google.protobuf
                 * @interface IListValue
                 * @property {Array.<google.protobuf.IValue>|null} [values] ListValue values
                 */
    
                /**
                 * Constructs a new ListValue.
                 * @memberof google.protobuf
                 * @classdesc Represents a ListValue.
                 * @implements IListValue
                 * @constructor
                 * @param {google.protobuf.IListValue=} [properties] Properties to set
                 */
                function ListValue(properties) {
                    this.values = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * ListValue values.
                 * @member {Array.<google.protobuf.IValue>} values
                 * @memberof google.protobuf.ListValue
                 * @instance
                 */
                ListValue.prototype.values = $util.emptyArray;
    
                /**
                 * Creates a new ListValue instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.ListValue
                 * @static
                 * @param {google.protobuf.IListValue=} [properties] Properties to set
                 * @returns {google.protobuf.ListValue} ListValue instance
                 */
                ListValue.create = function create(properties) {
                    return new ListValue(properties);
                };
    
                /**
                 * Encodes the specified ListValue message. Does not implicitly {@link google.protobuf.ListValue.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.ListValue
                 * @static
                 * @param {google.protobuf.IListValue} message ListValue message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ListValue.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.values != null && message.values.length)
                        for (var i = 0; i < message.values.length; ++i)
                            $root.google.protobuf.Value.encode(message.values[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified ListValue message, length delimited. Does not implicitly {@link google.protobuf.ListValue.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.ListValue
                 * @static
                 * @param {google.protobuf.IListValue} message ListValue message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ListValue.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a ListValue message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.ListValue
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.ListValue} ListValue
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ListValue.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.ListValue();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            if (!(message.values && message.values.length))
                                message.values = [];
                            message.values.push($root.google.protobuf.Value.decode(reader, reader.uint32()));
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a ListValue message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.ListValue
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.ListValue} ListValue
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ListValue.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a ListValue message.
                 * @function verify
                 * @memberof google.protobuf.ListValue
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                ListValue.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.values != null && message.hasOwnProperty("values")) {
                        if (!Array.isArray(message.values))
                            return "values: array expected";
                        for (var i = 0; i < message.values.length; ++i) {
                            var error = $root.google.protobuf.Value.verify(message.values[i]);
                            if (error)
                                return "values." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates a ListValue message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.ListValue
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.ListValue} ListValue
                 */
                ListValue.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.ListValue)
                        return object;
                    var message = new $root.google.protobuf.ListValue();
                    if (object.values) {
                        if (!Array.isArray(object.values))
                            throw TypeError(".google.protobuf.ListValue.values: array expected");
                        message.values = [];
                        for (var i = 0; i < object.values.length; ++i) {
                            if (typeof object.values[i] !== "object")
                                throw TypeError(".google.protobuf.ListValue.values: object expected");
                            message.values[i] = $root.google.protobuf.Value.fromObject(object.values[i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a ListValue message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.ListValue
                 * @static
                 * @param {google.protobuf.ListValue} message ListValue
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                ListValue.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.values = [];
                    if (message.values && message.values.length) {
                        object.values = [];
                        for (var j = 0; j < message.values.length; ++j)
                            object.values[j] = $root.google.protobuf.Value.toObject(message.values[j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this ListValue to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.ListValue
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                ListValue.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return ListValue;
            })();
    
            protobuf.Any = (function() {
    
                /**
                 * Properties of an Any.
                 * @memberof google.protobuf
                 * @interface IAny
                 * @property {string|null} [type_url] Any type_url
                 * @property {Uint8Array|null} [value] Any value
                 */
    
                /**
                 * Constructs a new Any.
                 * @memberof google.protobuf
                 * @classdesc Represents an Any.
                 * @implements IAny
                 * @constructor
                 * @param {google.protobuf.IAny=} [properties] Properties to set
                 */
                function Any(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * Any type_url.
                 * @member {string} type_url
                 * @memberof google.protobuf.Any
                 * @instance
                 */
                Any.prototype.type_url = "";
    
                /**
                 * Any value.
                 * @member {Uint8Array} value
                 * @memberof google.protobuf.Any
                 * @instance
                 */
                Any.prototype.value = $util.newBuffer([]);
    
                /**
                 * Creates a new Any instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.Any
                 * @static
                 * @param {google.protobuf.IAny=} [properties] Properties to set
                 * @returns {google.protobuf.Any} Any instance
                 */
                Any.create = function create(properties) {
                    return new Any(properties);
                };
    
                /**
                 * Encodes the specified Any message. Does not implicitly {@link google.protobuf.Any.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.Any
                 * @static
                 * @param {google.protobuf.IAny} message Any message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Any.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.type_url != null && Object.hasOwnProperty.call(message, "type_url"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.type_url);
                    if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                        writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.value);
                    return writer;
                };
    
                /**
                 * Encodes the specified Any message, length delimited. Does not implicitly {@link google.protobuf.Any.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.Any
                 * @static
                 * @param {google.protobuf.IAny} message Any message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Any.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an Any message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.Any
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.Any} Any
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Any.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.Any();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.type_url = reader.string();
                            break;
                        case 2:
                            message.value = reader.bytes();
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an Any message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.Any
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.Any} Any
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Any.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an Any message.
                 * @function verify
                 * @memberof google.protobuf.Any
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                Any.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.type_url != null && message.hasOwnProperty("type_url"))
                        if (!$util.isString(message.type_url))
                            return "type_url: string expected";
                    if (message.value != null && message.hasOwnProperty("value"))
                        if (!(message.value && typeof message.value.length === "number" || $util.isString(message.value)))
                            return "value: buffer expected";
                    return null;
                };
    
                /**
                 * Creates an Any message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.Any
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.Any} Any
                 */
                Any.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.Any)
                        return object;
                    var message = new $root.google.protobuf.Any();
                    if (object.type_url != null)
                        message.type_url = String(object.type_url);
                    if (object.value != null)
                        if (typeof object.value === "string")
                            $util.base64.decode(object.value, message.value = $util.newBuffer($util.base64.length(object.value)), 0);
                        else if (object.value.length)
                            message.value = object.value;
                    return message;
                };
    
                /**
                 * Creates a plain object from an Any message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.Any
                 * @static
                 * @param {google.protobuf.Any} message Any
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                Any.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.type_url = "";
                        if (options.bytes === String)
                            object.value = "";
                        else {
                            object.value = [];
                            if (options.bytes !== Array)
                                object.value = $util.newBuffer(object.value);
                        }
                    }
                    if (message.type_url != null && message.hasOwnProperty("type_url"))
                        object.type_url = message.type_url;
                    if (message.value != null && message.hasOwnProperty("value"))
                        object.value = options.bytes === String ? $util.base64.encode(message.value, 0, message.value.length) : options.bytes === Array ? Array.prototype.slice.call(message.value) : message.value;
                    return object;
                };
    
                /**
                 * Converts this Any to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.Any
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                Any.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return Any;
            })();
    
            protobuf.Timestamp = (function() {
    
                /**
                 * Properties of a Timestamp.
                 * @memberof google.protobuf
                 * @interface ITimestamp
                 * @property {number|Long|null} [seconds] Timestamp seconds
                 * @property {number|null} [nanos] Timestamp nanos
                 */
    
                /**
                 * Constructs a new Timestamp.
                 * @memberof google.protobuf
                 * @classdesc Represents a Timestamp.
                 * @implements ITimestamp
                 * @constructor
                 * @param {google.protobuf.ITimestamp=} [properties] Properties to set
                 */
                function Timestamp(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * Timestamp seconds.
                 * @member {number|Long} seconds
                 * @memberof google.protobuf.Timestamp
                 * @instance
                 */
                Timestamp.prototype.seconds = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                /**
                 * Timestamp nanos.
                 * @member {number} nanos
                 * @memberof google.protobuf.Timestamp
                 * @instance
                 */
                Timestamp.prototype.nanos = 0;
    
                /**
                 * Creates a new Timestamp instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.Timestamp
                 * @static
                 * @param {google.protobuf.ITimestamp=} [properties] Properties to set
                 * @returns {google.protobuf.Timestamp} Timestamp instance
                 */
                Timestamp.create = function create(properties) {
                    return new Timestamp(properties);
                };
    
                /**
                 * Encodes the specified Timestamp message. Does not implicitly {@link google.protobuf.Timestamp.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.Timestamp
                 * @static
                 * @param {google.protobuf.ITimestamp} message Timestamp message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Timestamp.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.seconds != null && Object.hasOwnProperty.call(message, "seconds"))
                        writer.uint32(/* id 1, wireType 0 =*/8).int64(message.seconds);
                    if (message.nanos != null && Object.hasOwnProperty.call(message, "nanos"))
                        writer.uint32(/* id 2, wireType 0 =*/16).int32(message.nanos);
                    return writer;
                };
    
                /**
                 * Encodes the specified Timestamp message, length delimited. Does not implicitly {@link google.protobuf.Timestamp.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.Timestamp
                 * @static
                 * @param {google.protobuf.ITimestamp} message Timestamp message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Timestamp.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a Timestamp message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.Timestamp
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.Timestamp} Timestamp
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Timestamp.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.Timestamp();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.seconds = reader.int64();
                            break;
                        case 2:
                            message.nanos = reader.int32();
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a Timestamp message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.Timestamp
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.Timestamp} Timestamp
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Timestamp.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a Timestamp message.
                 * @function verify
                 * @memberof google.protobuf.Timestamp
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                Timestamp.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.seconds != null && message.hasOwnProperty("seconds"))
                        if (!$util.isInteger(message.seconds) && !(message.seconds && $util.isInteger(message.seconds.low) && $util.isInteger(message.seconds.high)))
                            return "seconds: integer|Long expected";
                    if (message.nanos != null && message.hasOwnProperty("nanos"))
                        if (!$util.isInteger(message.nanos))
                            return "nanos: integer expected";
                    return null;
                };
    
                /**
                 * Creates a Timestamp message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.Timestamp
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.Timestamp} Timestamp
                 */
                Timestamp.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.Timestamp)
                        return object;
                    var message = new $root.google.protobuf.Timestamp();
                    if (object.seconds != null)
                        if ($util.Long)
                            (message.seconds = $util.Long.fromValue(object.seconds)).unsigned = false;
                        else if (typeof object.seconds === "string")
                            message.seconds = parseInt(object.seconds, 10);
                        else if (typeof object.seconds === "number")
                            message.seconds = object.seconds;
                        else if (typeof object.seconds === "object")
                            message.seconds = new $util.LongBits(object.seconds.low >>> 0, object.seconds.high >>> 0).toNumber();
                    if (object.nanos != null)
                        message.nanos = object.nanos | 0;
                    return message;
                };
    
                /**
                 * Creates a plain object from a Timestamp message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.Timestamp
                 * @static
                 * @param {google.protobuf.Timestamp} message Timestamp
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                Timestamp.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        if ($util.Long) {
                            var long = new $util.Long(0, 0, false);
                            object.seconds = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                        } else
                            object.seconds = options.longs === String ? "0" : 0;
                        object.nanos = 0;
                    }
                    if (message.seconds != null && message.hasOwnProperty("seconds"))
                        if (typeof message.seconds === "number")
                            object.seconds = options.longs === String ? String(message.seconds) : message.seconds;
                        else
                            object.seconds = options.longs === String ? $util.Long.prototype.toString.call(message.seconds) : options.longs === Number ? new $util.LongBits(message.seconds.low >>> 0, message.seconds.high >>> 0).toNumber() : message.seconds;
                    if (message.nanos != null && message.hasOwnProperty("nanos"))
                        object.nanos = message.nanos;
                    return object;
                };
    
                /**
                 * Converts this Timestamp to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.Timestamp
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                Timestamp.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return Timestamp;
            })();
    
            protobuf.Empty = (function() {
    
                /**
                 * Properties of an Empty.
                 * @memberof google.protobuf
                 * @interface IEmpty
                 */
    
                /**
                 * Constructs a new Empty.
                 * @memberof google.protobuf
                 * @classdesc Represents an Empty.
                 * @implements IEmpty
                 * @constructor
                 * @param {google.protobuf.IEmpty=} [properties] Properties to set
                 */
                function Empty(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * Creates a new Empty instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.Empty
                 * @static
                 * @param {google.protobuf.IEmpty=} [properties] Properties to set
                 * @returns {google.protobuf.Empty} Empty instance
                 */
                Empty.create = function create(properties) {
                    return new Empty(properties);
                };
    
                /**
                 * Encodes the specified Empty message. Does not implicitly {@link google.protobuf.Empty.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.Empty
                 * @static
                 * @param {google.protobuf.IEmpty} message Empty message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Empty.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    return writer;
                };
    
                /**
                 * Encodes the specified Empty message, length delimited. Does not implicitly {@link google.protobuf.Empty.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.Empty
                 * @static
                 * @param {google.protobuf.IEmpty} message Empty message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Empty.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an Empty message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.Empty
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.Empty} Empty
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Empty.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.Empty();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an Empty message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.Empty
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.Empty} Empty
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Empty.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an Empty message.
                 * @function verify
                 * @memberof google.protobuf.Empty
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                Empty.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    return null;
                };
    
                /**
                 * Creates an Empty message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.Empty
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.Empty} Empty
                 */
                Empty.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.Empty)
                        return object;
                    return new $root.google.protobuf.Empty();
                };
    
                /**
                 * Creates a plain object from an Empty message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.Empty
                 * @static
                 * @param {google.protobuf.Empty} message Empty
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                Empty.toObject = function toObject() {
                    return {};
                };
    
                /**
                 * Converts this Empty to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.Empty
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                Empty.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return Empty;
            })();
    
            protobuf.FieldMask = (function() {
    
                /**
                 * Properties of a FieldMask.
                 * @memberof google.protobuf
                 * @interface IFieldMask
                 * @property {Array.<string>|null} [paths] FieldMask paths
                 */
    
                /**
                 * Constructs a new FieldMask.
                 * @memberof google.protobuf
                 * @classdesc Represents a FieldMask.
                 * @implements IFieldMask
                 * @constructor
                 * @param {google.protobuf.IFieldMask=} [properties] Properties to set
                 */
                function FieldMask(properties) {
                    this.paths = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * FieldMask paths.
                 * @member {Array.<string>} paths
                 * @memberof google.protobuf.FieldMask
                 * @instance
                 */
                FieldMask.prototype.paths = $util.emptyArray;
    
                /**
                 * Creates a new FieldMask instance using the specified properties.
                 * @function create
                 * @memberof google.protobuf.FieldMask
                 * @static
                 * @param {google.protobuf.IFieldMask=} [properties] Properties to set
                 * @returns {google.protobuf.FieldMask} FieldMask instance
                 */
                FieldMask.create = function create(properties) {
                    return new FieldMask(properties);
                };
    
                /**
                 * Encodes the specified FieldMask message. Does not implicitly {@link google.protobuf.FieldMask.verify|verify} messages.
                 * @function encode
                 * @memberof google.protobuf.FieldMask
                 * @static
                 * @param {google.protobuf.IFieldMask} message FieldMask message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FieldMask.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.paths != null && message.paths.length)
                        for (var i = 0; i < message.paths.length; ++i)
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.paths[i]);
                    return writer;
                };
    
                /**
                 * Encodes the specified FieldMask message, length delimited. Does not implicitly {@link google.protobuf.FieldMask.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.protobuf.FieldMask
                 * @static
                 * @param {google.protobuf.IFieldMask} message FieldMask message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                FieldMask.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a FieldMask message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.protobuf.FieldMask
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.protobuf.FieldMask} FieldMask
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FieldMask.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.FieldMask();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            if (!(message.paths && message.paths.length))
                                message.paths = [];
                            message.paths.push(reader.string());
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a FieldMask message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.protobuf.FieldMask
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.protobuf.FieldMask} FieldMask
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                FieldMask.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a FieldMask message.
                 * @function verify
                 * @memberof google.protobuf.FieldMask
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                FieldMask.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.paths != null && message.hasOwnProperty("paths")) {
                        if (!Array.isArray(message.paths))
                            return "paths: array expected";
                        for (var i = 0; i < message.paths.length; ++i)
                            if (!$util.isString(message.paths[i]))
                                return "paths: string[] expected";
                    }
                    return null;
                };
    
                /**
                 * Creates a FieldMask message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.protobuf.FieldMask
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.protobuf.FieldMask} FieldMask
                 */
                FieldMask.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.protobuf.FieldMask)
                        return object;
                    var message = new $root.google.protobuf.FieldMask();
                    if (object.paths) {
                        if (!Array.isArray(object.paths))
                            throw TypeError(".google.protobuf.FieldMask.paths: array expected");
                        message.paths = [];
                        for (var i = 0; i < object.paths.length; ++i)
                            message.paths[i] = String(object.paths[i]);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a FieldMask message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.protobuf.FieldMask
                 * @static
                 * @param {google.protobuf.FieldMask} message FieldMask
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                FieldMask.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.paths = [];
                    if (message.paths && message.paths.length) {
                        object.paths = [];
                        for (var j = 0; j < message.paths.length; ++j)
                            object.paths[j] = message.paths[j];
                    }
                    return object;
                };
    
                /**
                 * Converts this FieldMask to JSON.
                 * @function toJSON
                 * @memberof google.protobuf.FieldMask
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                FieldMask.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return FieldMask;
            })();
    
            return protobuf;
        })();
    
        google.logging = (function() {
    
            /**
             * Namespace logging.
             * @memberof google
             * @namespace
             */
            var logging = {};
    
            logging.type = (function() {
    
                /**
                 * Namespace type.
                 * @memberof google.logging
                 * @namespace
                 */
                var type = {};
    
                type.HttpRequest = (function() {
    
                    /**
                     * Properties of a HttpRequest.
                     * @memberof google.logging.type
                     * @interface IHttpRequest
                     * @property {string|null} [requestMethod] HttpRequest requestMethod
                     * @property {string|null} [requestUrl] HttpRequest requestUrl
                     * @property {number|Long|null} [requestSize] HttpRequest requestSize
                     * @property {number|null} [status] HttpRequest status
                     * @property {number|Long|null} [responseSize] HttpRequest responseSize
                     * @property {string|null} [userAgent] HttpRequest userAgent
                     * @property {string|null} [remoteIp] HttpRequest remoteIp
                     * @property {string|null} [serverIp] HttpRequest serverIp
                     * @property {string|null} [referer] HttpRequest referer
                     * @property {google.protobuf.IDuration|null} [latency] HttpRequest latency
                     * @property {boolean|null} [cacheLookup] HttpRequest cacheLookup
                     * @property {boolean|null} [cacheHit] HttpRequest cacheHit
                     * @property {boolean|null} [cacheValidatedWithOriginServer] HttpRequest cacheValidatedWithOriginServer
                     * @property {number|Long|null} [cacheFillBytes] HttpRequest cacheFillBytes
                     * @property {string|null} [protocol] HttpRequest protocol
                     */
    
                    /**
                     * Constructs a new HttpRequest.
                     * @memberof google.logging.type
                     * @classdesc Represents a HttpRequest.
                     * @implements IHttpRequest
                     * @constructor
                     * @param {google.logging.type.IHttpRequest=} [properties] Properties to set
                     */
                    function HttpRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * HttpRequest requestMethod.
                     * @member {string} requestMethod
                     * @memberof google.logging.type.HttpRequest
                     * @instance
                     */
                    HttpRequest.prototype.requestMethod = "";
    
                    /**
                     * HttpRequest requestUrl.
                     * @member {string} requestUrl
                     * @memberof google.logging.type.HttpRequest
                     * @instance
                     */
                    HttpRequest.prototype.requestUrl = "";
    
                    /**
                     * HttpRequest requestSize.
                     * @member {number|Long} requestSize
                     * @memberof google.logging.type.HttpRequest
                     * @instance
                     */
                    HttpRequest.prototype.requestSize = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                    /**
                     * HttpRequest status.
                     * @member {number} status
                     * @memberof google.logging.type.HttpRequest
                     * @instance
                     */
                    HttpRequest.prototype.status = 0;
    
                    /**
                     * HttpRequest responseSize.
                     * @member {number|Long} responseSize
                     * @memberof google.logging.type.HttpRequest
                     * @instance
                     */
                    HttpRequest.prototype.responseSize = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                    /**
                     * HttpRequest userAgent.
                     * @member {string} userAgent
                     * @memberof google.logging.type.HttpRequest
                     * @instance
                     */
                    HttpRequest.prototype.userAgent = "";
    
                    /**
                     * HttpRequest remoteIp.
                     * @member {string} remoteIp
                     * @memberof google.logging.type.HttpRequest
                     * @instance
                     */
                    HttpRequest.prototype.remoteIp = "";
    
                    /**
                     * HttpRequest serverIp.
                     * @member {string} serverIp
                     * @memberof google.logging.type.HttpRequest
                     * @instance
                     */
                    HttpRequest.prototype.serverIp = "";
    
                    /**
                     * HttpRequest referer.
                     * @member {string} referer
                     * @memberof google.logging.type.HttpRequest
                     * @instance
                     */
                    HttpRequest.prototype.referer = "";
    
                    /**
                     * HttpRequest latency.
                     * @member {google.protobuf.IDuration|null|undefined} latency
                     * @memberof google.logging.type.HttpRequest
                     * @instance
                     */
                    HttpRequest.prototype.latency = null;
    
                    /**
                     * HttpRequest cacheLookup.
                     * @member {boolean} cacheLookup
                     * @memberof google.logging.type.HttpRequest
                     * @instance
                     */
                    HttpRequest.prototype.cacheLookup = false;
    
                    /**
                     * HttpRequest cacheHit.
                     * @member {boolean} cacheHit
                     * @memberof google.logging.type.HttpRequest
                     * @instance
                     */
                    HttpRequest.prototype.cacheHit = false;
    
                    /**
                     * HttpRequest cacheValidatedWithOriginServer.
                     * @member {boolean} cacheValidatedWithOriginServer
                     * @memberof google.logging.type.HttpRequest
                     * @instance
                     */
                    HttpRequest.prototype.cacheValidatedWithOriginServer = false;
    
                    /**
                     * HttpRequest cacheFillBytes.
                     * @member {number|Long} cacheFillBytes
                     * @memberof google.logging.type.HttpRequest
                     * @instance
                     */
                    HttpRequest.prototype.cacheFillBytes = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                    /**
                     * HttpRequest protocol.
                     * @member {string} protocol
                     * @memberof google.logging.type.HttpRequest
                     * @instance
                     */
                    HttpRequest.prototype.protocol = "";
    
                    /**
                     * Creates a new HttpRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.type.HttpRequest
                     * @static
                     * @param {google.logging.type.IHttpRequest=} [properties] Properties to set
                     * @returns {google.logging.type.HttpRequest} HttpRequest instance
                     */
                    HttpRequest.create = function create(properties) {
                        return new HttpRequest(properties);
                    };
    
                    /**
                     * Encodes the specified HttpRequest message. Does not implicitly {@link google.logging.type.HttpRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.type.HttpRequest
                     * @static
                     * @param {google.logging.type.IHttpRequest} message HttpRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    HttpRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.requestMethod != null && Object.hasOwnProperty.call(message, "requestMethod"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.requestMethod);
                        if (message.requestUrl != null && Object.hasOwnProperty.call(message, "requestUrl"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.requestUrl);
                        if (message.requestSize != null && Object.hasOwnProperty.call(message, "requestSize"))
                            writer.uint32(/* id 3, wireType 0 =*/24).int64(message.requestSize);
                        if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                            writer.uint32(/* id 4, wireType 0 =*/32).int32(message.status);
                        if (message.responseSize != null && Object.hasOwnProperty.call(message, "responseSize"))
                            writer.uint32(/* id 5, wireType 0 =*/40).int64(message.responseSize);
                        if (message.userAgent != null && Object.hasOwnProperty.call(message, "userAgent"))
                            writer.uint32(/* id 6, wireType 2 =*/50).string(message.userAgent);
                        if (message.remoteIp != null && Object.hasOwnProperty.call(message, "remoteIp"))
                            writer.uint32(/* id 7, wireType 2 =*/58).string(message.remoteIp);
                        if (message.referer != null && Object.hasOwnProperty.call(message, "referer"))
                            writer.uint32(/* id 8, wireType 2 =*/66).string(message.referer);
                        if (message.cacheHit != null && Object.hasOwnProperty.call(message, "cacheHit"))
                            writer.uint32(/* id 9, wireType 0 =*/72).bool(message.cacheHit);
                        if (message.cacheValidatedWithOriginServer != null && Object.hasOwnProperty.call(message, "cacheValidatedWithOriginServer"))
                            writer.uint32(/* id 10, wireType 0 =*/80).bool(message.cacheValidatedWithOriginServer);
                        if (message.cacheLookup != null && Object.hasOwnProperty.call(message, "cacheLookup"))
                            writer.uint32(/* id 11, wireType 0 =*/88).bool(message.cacheLookup);
                        if (message.cacheFillBytes != null && Object.hasOwnProperty.call(message, "cacheFillBytes"))
                            writer.uint32(/* id 12, wireType 0 =*/96).int64(message.cacheFillBytes);
                        if (message.serverIp != null && Object.hasOwnProperty.call(message, "serverIp"))
                            writer.uint32(/* id 13, wireType 2 =*/106).string(message.serverIp);
                        if (message.latency != null && Object.hasOwnProperty.call(message, "latency"))
                            $root.google.protobuf.Duration.encode(message.latency, writer.uint32(/* id 14, wireType 2 =*/114).fork()).ldelim();
                        if (message.protocol != null && Object.hasOwnProperty.call(message, "protocol"))
                            writer.uint32(/* id 15, wireType 2 =*/122).string(message.protocol);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified HttpRequest message, length delimited. Does not implicitly {@link google.logging.type.HttpRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.type.HttpRequest
                     * @static
                     * @param {google.logging.type.IHttpRequest} message HttpRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    HttpRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a HttpRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.type.HttpRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.type.HttpRequest} HttpRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    HttpRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.type.HttpRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.requestMethod = reader.string();
                                break;
                            case 2:
                                message.requestUrl = reader.string();
                                break;
                            case 3:
                                message.requestSize = reader.int64();
                                break;
                            case 4:
                                message.status = reader.int32();
                                break;
                            case 5:
                                message.responseSize = reader.int64();
                                break;
                            case 6:
                                message.userAgent = reader.string();
                                break;
                            case 7:
                                message.remoteIp = reader.string();
                                break;
                            case 13:
                                message.serverIp = reader.string();
                                break;
                            case 8:
                                message.referer = reader.string();
                                break;
                            case 14:
                                message.latency = $root.google.protobuf.Duration.decode(reader, reader.uint32());
                                break;
                            case 11:
                                message.cacheLookup = reader.bool();
                                break;
                            case 9:
                                message.cacheHit = reader.bool();
                                break;
                            case 10:
                                message.cacheValidatedWithOriginServer = reader.bool();
                                break;
                            case 12:
                                message.cacheFillBytes = reader.int64();
                                break;
                            case 15:
                                message.protocol = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a HttpRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.type.HttpRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.type.HttpRequest} HttpRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    HttpRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a HttpRequest message.
                     * @function verify
                     * @memberof google.logging.type.HttpRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    HttpRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.requestMethod != null && message.hasOwnProperty("requestMethod"))
                            if (!$util.isString(message.requestMethod))
                                return "requestMethod: string expected";
                        if (message.requestUrl != null && message.hasOwnProperty("requestUrl"))
                            if (!$util.isString(message.requestUrl))
                                return "requestUrl: string expected";
                        if (message.requestSize != null && message.hasOwnProperty("requestSize"))
                            if (!$util.isInteger(message.requestSize) && !(message.requestSize && $util.isInteger(message.requestSize.low) && $util.isInteger(message.requestSize.high)))
                                return "requestSize: integer|Long expected";
                        if (message.status != null && message.hasOwnProperty("status"))
                            if (!$util.isInteger(message.status))
                                return "status: integer expected";
                        if (message.responseSize != null && message.hasOwnProperty("responseSize"))
                            if (!$util.isInteger(message.responseSize) && !(message.responseSize && $util.isInteger(message.responseSize.low) && $util.isInteger(message.responseSize.high)))
                                return "responseSize: integer|Long expected";
                        if (message.userAgent != null && message.hasOwnProperty("userAgent"))
                            if (!$util.isString(message.userAgent))
                                return "userAgent: string expected";
                        if (message.remoteIp != null && message.hasOwnProperty("remoteIp"))
                            if (!$util.isString(message.remoteIp))
                                return "remoteIp: string expected";
                        if (message.serverIp != null && message.hasOwnProperty("serverIp"))
                            if (!$util.isString(message.serverIp))
                                return "serverIp: string expected";
                        if (message.referer != null && message.hasOwnProperty("referer"))
                            if (!$util.isString(message.referer))
                                return "referer: string expected";
                        if (message.latency != null && message.hasOwnProperty("latency")) {
                            var error = $root.google.protobuf.Duration.verify(message.latency);
                            if (error)
                                return "latency." + error;
                        }
                        if (message.cacheLookup != null && message.hasOwnProperty("cacheLookup"))
                            if (typeof message.cacheLookup !== "boolean")
                                return "cacheLookup: boolean expected";
                        if (message.cacheHit != null && message.hasOwnProperty("cacheHit"))
                            if (typeof message.cacheHit !== "boolean")
                                return "cacheHit: boolean expected";
                        if (message.cacheValidatedWithOriginServer != null && message.hasOwnProperty("cacheValidatedWithOriginServer"))
                            if (typeof message.cacheValidatedWithOriginServer !== "boolean")
                                return "cacheValidatedWithOriginServer: boolean expected";
                        if (message.cacheFillBytes != null && message.hasOwnProperty("cacheFillBytes"))
                            if (!$util.isInteger(message.cacheFillBytes) && !(message.cacheFillBytes && $util.isInteger(message.cacheFillBytes.low) && $util.isInteger(message.cacheFillBytes.high)))
                                return "cacheFillBytes: integer|Long expected";
                        if (message.protocol != null && message.hasOwnProperty("protocol"))
                            if (!$util.isString(message.protocol))
                                return "protocol: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a HttpRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.type.HttpRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.type.HttpRequest} HttpRequest
                     */
                    HttpRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.type.HttpRequest)
                            return object;
                        var message = new $root.google.logging.type.HttpRequest();
                        if (object.requestMethod != null)
                            message.requestMethod = String(object.requestMethod);
                        if (object.requestUrl != null)
                            message.requestUrl = String(object.requestUrl);
                        if (object.requestSize != null)
                            if ($util.Long)
                                (message.requestSize = $util.Long.fromValue(object.requestSize)).unsigned = false;
                            else if (typeof object.requestSize === "string")
                                message.requestSize = parseInt(object.requestSize, 10);
                            else if (typeof object.requestSize === "number")
                                message.requestSize = object.requestSize;
                            else if (typeof object.requestSize === "object")
                                message.requestSize = new $util.LongBits(object.requestSize.low >>> 0, object.requestSize.high >>> 0).toNumber();
                        if (object.status != null)
                            message.status = object.status | 0;
                        if (object.responseSize != null)
                            if ($util.Long)
                                (message.responseSize = $util.Long.fromValue(object.responseSize)).unsigned = false;
                            else if (typeof object.responseSize === "string")
                                message.responseSize = parseInt(object.responseSize, 10);
                            else if (typeof object.responseSize === "number")
                                message.responseSize = object.responseSize;
                            else if (typeof object.responseSize === "object")
                                message.responseSize = new $util.LongBits(object.responseSize.low >>> 0, object.responseSize.high >>> 0).toNumber();
                        if (object.userAgent != null)
                            message.userAgent = String(object.userAgent);
                        if (object.remoteIp != null)
                            message.remoteIp = String(object.remoteIp);
                        if (object.serverIp != null)
                            message.serverIp = String(object.serverIp);
                        if (object.referer != null)
                            message.referer = String(object.referer);
                        if (object.latency != null) {
                            if (typeof object.latency !== "object")
                                throw TypeError(".google.logging.type.HttpRequest.latency: object expected");
                            message.latency = $root.google.protobuf.Duration.fromObject(object.latency);
                        }
                        if (object.cacheLookup != null)
                            message.cacheLookup = Boolean(object.cacheLookup);
                        if (object.cacheHit != null)
                            message.cacheHit = Boolean(object.cacheHit);
                        if (object.cacheValidatedWithOriginServer != null)
                            message.cacheValidatedWithOriginServer = Boolean(object.cacheValidatedWithOriginServer);
                        if (object.cacheFillBytes != null)
                            if ($util.Long)
                                (message.cacheFillBytes = $util.Long.fromValue(object.cacheFillBytes)).unsigned = false;
                            else if (typeof object.cacheFillBytes === "string")
                                message.cacheFillBytes = parseInt(object.cacheFillBytes, 10);
                            else if (typeof object.cacheFillBytes === "number")
                                message.cacheFillBytes = object.cacheFillBytes;
                            else if (typeof object.cacheFillBytes === "object")
                                message.cacheFillBytes = new $util.LongBits(object.cacheFillBytes.low >>> 0, object.cacheFillBytes.high >>> 0).toNumber();
                        if (object.protocol != null)
                            message.protocol = String(object.protocol);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a HttpRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.type.HttpRequest
                     * @static
                     * @param {google.logging.type.HttpRequest} message HttpRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    HttpRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.requestMethod = "";
                            object.requestUrl = "";
                            if ($util.Long) {
                                var long = new $util.Long(0, 0, false);
                                object.requestSize = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                            } else
                                object.requestSize = options.longs === String ? "0" : 0;
                            object.status = 0;
                            if ($util.Long) {
                                var long = new $util.Long(0, 0, false);
                                object.responseSize = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                            } else
                                object.responseSize = options.longs === String ? "0" : 0;
                            object.userAgent = "";
                            object.remoteIp = "";
                            object.referer = "";
                            object.cacheHit = false;
                            object.cacheValidatedWithOriginServer = false;
                            object.cacheLookup = false;
                            if ($util.Long) {
                                var long = new $util.Long(0, 0, false);
                                object.cacheFillBytes = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                            } else
                                object.cacheFillBytes = options.longs === String ? "0" : 0;
                            object.serverIp = "";
                            object.latency = null;
                            object.protocol = "";
                        }
                        if (message.requestMethod != null && message.hasOwnProperty("requestMethod"))
                            object.requestMethod = message.requestMethod;
                        if (message.requestUrl != null && message.hasOwnProperty("requestUrl"))
                            object.requestUrl = message.requestUrl;
                        if (message.requestSize != null && message.hasOwnProperty("requestSize"))
                            if (typeof message.requestSize === "number")
                                object.requestSize = options.longs === String ? String(message.requestSize) : message.requestSize;
                            else
                                object.requestSize = options.longs === String ? $util.Long.prototype.toString.call(message.requestSize) : options.longs === Number ? new $util.LongBits(message.requestSize.low >>> 0, message.requestSize.high >>> 0).toNumber() : message.requestSize;
                        if (message.status != null && message.hasOwnProperty("status"))
                            object.status = message.status;
                        if (message.responseSize != null && message.hasOwnProperty("responseSize"))
                            if (typeof message.responseSize === "number")
                                object.responseSize = options.longs === String ? String(message.responseSize) : message.responseSize;
                            else
                                object.responseSize = options.longs === String ? $util.Long.prototype.toString.call(message.responseSize) : options.longs === Number ? new $util.LongBits(message.responseSize.low >>> 0, message.responseSize.high >>> 0).toNumber() : message.responseSize;
                        if (message.userAgent != null && message.hasOwnProperty("userAgent"))
                            object.userAgent = message.userAgent;
                        if (message.remoteIp != null && message.hasOwnProperty("remoteIp"))
                            object.remoteIp = message.remoteIp;
                        if (message.referer != null && message.hasOwnProperty("referer"))
                            object.referer = message.referer;
                        if (message.cacheHit != null && message.hasOwnProperty("cacheHit"))
                            object.cacheHit = message.cacheHit;
                        if (message.cacheValidatedWithOriginServer != null && message.hasOwnProperty("cacheValidatedWithOriginServer"))
                            object.cacheValidatedWithOriginServer = message.cacheValidatedWithOriginServer;
                        if (message.cacheLookup != null && message.hasOwnProperty("cacheLookup"))
                            object.cacheLookup = message.cacheLookup;
                        if (message.cacheFillBytes != null && message.hasOwnProperty("cacheFillBytes"))
                            if (typeof message.cacheFillBytes === "number")
                                object.cacheFillBytes = options.longs === String ? String(message.cacheFillBytes) : message.cacheFillBytes;
                            else
                                object.cacheFillBytes = options.longs === String ? $util.Long.prototype.toString.call(message.cacheFillBytes) : options.longs === Number ? new $util.LongBits(message.cacheFillBytes.low >>> 0, message.cacheFillBytes.high >>> 0).toNumber() : message.cacheFillBytes;
                        if (message.serverIp != null && message.hasOwnProperty("serverIp"))
                            object.serverIp = message.serverIp;
                        if (message.latency != null && message.hasOwnProperty("latency"))
                            object.latency = $root.google.protobuf.Duration.toObject(message.latency, options);
                        if (message.protocol != null && message.hasOwnProperty("protocol"))
                            object.protocol = message.protocol;
                        return object;
                    };
    
                    /**
                     * Converts this HttpRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.type.HttpRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    HttpRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return HttpRequest;
                })();
    
                /**
                 * LogSeverity enum.
                 * @name google.logging.type.LogSeverity
                 * @enum {number}
                 * @property {number} DEFAULT=0 DEFAULT value
                 * @property {number} DEBUG=100 DEBUG value
                 * @property {number} INFO=200 INFO value
                 * @property {number} NOTICE=300 NOTICE value
                 * @property {number} WARNING=400 WARNING value
                 * @property {number} ERROR=500 ERROR value
                 * @property {number} CRITICAL=600 CRITICAL value
                 * @property {number} ALERT=700 ALERT value
                 * @property {number} EMERGENCY=800 EMERGENCY value
                 */
                type.LogSeverity = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "DEFAULT"] = 0;
                    values[valuesById[100] = "DEBUG"] = 100;
                    values[valuesById[200] = "INFO"] = 200;
                    values[valuesById[300] = "NOTICE"] = 300;
                    values[valuesById[400] = "WARNING"] = 400;
                    values[valuesById[500] = "ERROR"] = 500;
                    values[valuesById[600] = "CRITICAL"] = 600;
                    values[valuesById[700] = "ALERT"] = 700;
                    values[valuesById[800] = "EMERGENCY"] = 800;
                    return values;
                })();
    
                return type;
            })();
    
            logging.v2 = (function() {
    
                /**
                 * Namespace v2.
                 * @memberof google.logging
                 * @namespace
                 */
                var v2 = {};
    
                v2.LogEntry = (function() {
    
                    /**
                     * Properties of a LogEntry.
                     * @memberof google.logging.v2
                     * @interface ILogEntry
                     * @property {string|null} [logName] LogEntry logName
                     * @property {google.api.IMonitoredResource|null} [resource] LogEntry resource
                     * @property {google.protobuf.IAny|null} [protoPayload] LogEntry protoPayload
                     * @property {string|null} [textPayload] LogEntry textPayload
                     * @property {google.protobuf.IStruct|null} [jsonPayload] LogEntry jsonPayload
                     * @property {google.protobuf.ITimestamp|null} [timestamp] LogEntry timestamp
                     * @property {google.protobuf.ITimestamp|null} [receiveTimestamp] LogEntry receiveTimestamp
                     * @property {google.logging.type.LogSeverity|null} [severity] LogEntry severity
                     * @property {string|null} [insertId] LogEntry insertId
                     * @property {google.logging.type.IHttpRequest|null} [httpRequest] LogEntry httpRequest
                     * @property {Object.<string,string>|null} [labels] LogEntry labels
                     * @property {google.logging.v2.ILogEntryOperation|null} [operation] LogEntry operation
                     * @property {string|null} [trace] LogEntry trace
                     * @property {string|null} [spanId] LogEntry spanId
                     * @property {boolean|null} [traceSampled] LogEntry traceSampled
                     * @property {google.logging.v2.ILogEntrySourceLocation|null} [sourceLocation] LogEntry sourceLocation
                     * @property {google.logging.v2.ILogSplit|null} [split] LogEntry split
                     */
    
                    /**
                     * Constructs a new LogEntry.
                     * @memberof google.logging.v2
                     * @classdesc Represents a LogEntry.
                     * @implements ILogEntry
                     * @constructor
                     * @param {google.logging.v2.ILogEntry=} [properties] Properties to set
                     */
                    function LogEntry(properties) {
                        this.labels = {};
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * LogEntry logName.
                     * @member {string} logName
                     * @memberof google.logging.v2.LogEntry
                     * @instance
                     */
                    LogEntry.prototype.logName = "";
    
                    /**
                     * LogEntry resource.
                     * @member {google.api.IMonitoredResource|null|undefined} resource
                     * @memberof google.logging.v2.LogEntry
                     * @instance
                     */
                    LogEntry.prototype.resource = null;
    
                    /**
                     * LogEntry protoPayload.
                     * @member {google.protobuf.IAny|null|undefined} protoPayload
                     * @memberof google.logging.v2.LogEntry
                     * @instance
                     */
                    LogEntry.prototype.protoPayload = null;
    
                    /**
                     * LogEntry textPayload.
                     * @member {string|null|undefined} textPayload
                     * @memberof google.logging.v2.LogEntry
                     * @instance
                     */
                    LogEntry.prototype.textPayload = null;
    
                    /**
                     * LogEntry jsonPayload.
                     * @member {google.protobuf.IStruct|null|undefined} jsonPayload
                     * @memberof google.logging.v2.LogEntry
                     * @instance
                     */
                    LogEntry.prototype.jsonPayload = null;
    
                    /**
                     * LogEntry timestamp.
                     * @member {google.protobuf.ITimestamp|null|undefined} timestamp
                     * @memberof google.logging.v2.LogEntry
                     * @instance
                     */
                    LogEntry.prototype.timestamp = null;
    
                    /**
                     * LogEntry receiveTimestamp.
                     * @member {google.protobuf.ITimestamp|null|undefined} receiveTimestamp
                     * @memberof google.logging.v2.LogEntry
                     * @instance
                     */
                    LogEntry.prototype.receiveTimestamp = null;
    
                    /**
                     * LogEntry severity.
                     * @member {google.logging.type.LogSeverity} severity
                     * @memberof google.logging.v2.LogEntry
                     * @instance
                     */
                    LogEntry.prototype.severity = 0;
    
                    /**
                     * LogEntry insertId.
                     * @member {string} insertId
                     * @memberof google.logging.v2.LogEntry
                     * @instance
                     */
                    LogEntry.prototype.insertId = "";
    
                    /**
                     * LogEntry httpRequest.
                     * @member {google.logging.type.IHttpRequest|null|undefined} httpRequest
                     * @memberof google.logging.v2.LogEntry
                     * @instance
                     */
                    LogEntry.prototype.httpRequest = null;
    
                    /**
                     * LogEntry labels.
                     * @member {Object.<string,string>} labels
                     * @memberof google.logging.v2.LogEntry
                     * @instance
                     */
                    LogEntry.prototype.labels = $util.emptyObject;
    
                    /**
                     * LogEntry operation.
                     * @member {google.logging.v2.ILogEntryOperation|null|undefined} operation
                     * @memberof google.logging.v2.LogEntry
                     * @instance
                     */
                    LogEntry.prototype.operation = null;
    
                    /**
                     * LogEntry trace.
                     * @member {string} trace
                     * @memberof google.logging.v2.LogEntry
                     * @instance
                     */
                    LogEntry.prototype.trace = "";
    
                    /**
                     * LogEntry spanId.
                     * @member {string} spanId
                     * @memberof google.logging.v2.LogEntry
                     * @instance
                     */
                    LogEntry.prototype.spanId = "";
    
                    /**
                     * LogEntry traceSampled.
                     * @member {boolean} traceSampled
                     * @memberof google.logging.v2.LogEntry
                     * @instance
                     */
                    LogEntry.prototype.traceSampled = false;
    
                    /**
                     * LogEntry sourceLocation.
                     * @member {google.logging.v2.ILogEntrySourceLocation|null|undefined} sourceLocation
                     * @memberof google.logging.v2.LogEntry
                     * @instance
                     */
                    LogEntry.prototype.sourceLocation = null;
    
                    /**
                     * LogEntry split.
                     * @member {google.logging.v2.ILogSplit|null|undefined} split
                     * @memberof google.logging.v2.LogEntry
                     * @instance
                     */
                    LogEntry.prototype.split = null;
    
                    // OneOf field names bound to virtual getters and setters
                    var $oneOfFields;
    
                    /**
                     * LogEntry payload.
                     * @member {"protoPayload"|"textPayload"|"jsonPayload"|undefined} payload
                     * @memberof google.logging.v2.LogEntry
                     * @instance
                     */
                    Object.defineProperty(LogEntry.prototype, "payload", {
                        get: $util.oneOfGetter($oneOfFields = ["protoPayload", "textPayload", "jsonPayload"]),
                        set: $util.oneOfSetter($oneOfFields)
                    });
    
                    /**
                     * Creates a new LogEntry instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.LogEntry
                     * @static
                     * @param {google.logging.v2.ILogEntry=} [properties] Properties to set
                     * @returns {google.logging.v2.LogEntry} LogEntry instance
                     */
                    LogEntry.create = function create(properties) {
                        return new LogEntry(properties);
                    };
    
                    /**
                     * Encodes the specified LogEntry message. Does not implicitly {@link google.logging.v2.LogEntry.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.LogEntry
                     * @static
                     * @param {google.logging.v2.ILogEntry} message LogEntry message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    LogEntry.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.protoPayload != null && Object.hasOwnProperty.call(message, "protoPayload"))
                            $root.google.protobuf.Any.encode(message.protoPayload, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.textPayload != null && Object.hasOwnProperty.call(message, "textPayload"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.textPayload);
                        if (message.insertId != null && Object.hasOwnProperty.call(message, "insertId"))
                            writer.uint32(/* id 4, wireType 2 =*/34).string(message.insertId);
                        if (message.jsonPayload != null && Object.hasOwnProperty.call(message, "jsonPayload"))
                            $root.google.protobuf.Struct.encode(message.jsonPayload, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                        if (message.httpRequest != null && Object.hasOwnProperty.call(message, "httpRequest"))
                            $root.google.logging.type.HttpRequest.encode(message.httpRequest, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();
                        if (message.resource != null && Object.hasOwnProperty.call(message, "resource"))
                            $root.google.api.MonitoredResource.encode(message.resource, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
                        if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp"))
                            $root.google.protobuf.Timestamp.encode(message.timestamp, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();
                        if (message.severity != null && Object.hasOwnProperty.call(message, "severity"))
                            writer.uint32(/* id 10, wireType 0 =*/80).int32(message.severity);
                        if (message.labels != null && Object.hasOwnProperty.call(message, "labels"))
                            for (var keys = Object.keys(message.labels), i = 0; i < keys.length; ++i)
                                writer.uint32(/* id 11, wireType 2 =*/90).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.labels[keys[i]]).ldelim();
                        if (message.logName != null && Object.hasOwnProperty.call(message, "logName"))
                            writer.uint32(/* id 12, wireType 2 =*/98).string(message.logName);
                        if (message.operation != null && Object.hasOwnProperty.call(message, "operation"))
                            $root.google.logging.v2.LogEntryOperation.encode(message.operation, writer.uint32(/* id 15, wireType 2 =*/122).fork()).ldelim();
                        if (message.trace != null && Object.hasOwnProperty.call(message, "trace"))
                            writer.uint32(/* id 22, wireType 2 =*/178).string(message.trace);
                        if (message.sourceLocation != null && Object.hasOwnProperty.call(message, "sourceLocation"))
                            $root.google.logging.v2.LogEntrySourceLocation.encode(message.sourceLocation, writer.uint32(/* id 23, wireType 2 =*/186).fork()).ldelim();
                        if (message.receiveTimestamp != null && Object.hasOwnProperty.call(message, "receiveTimestamp"))
                            $root.google.protobuf.Timestamp.encode(message.receiveTimestamp, writer.uint32(/* id 24, wireType 2 =*/194).fork()).ldelim();
                        if (message.spanId != null && Object.hasOwnProperty.call(message, "spanId"))
                            writer.uint32(/* id 27, wireType 2 =*/218).string(message.spanId);
                        if (message.traceSampled != null && Object.hasOwnProperty.call(message, "traceSampled"))
                            writer.uint32(/* id 30, wireType 0 =*/240).bool(message.traceSampled);
                        if (message.split != null && Object.hasOwnProperty.call(message, "split"))
                            $root.google.logging.v2.LogSplit.encode(message.split, writer.uint32(/* id 35, wireType 2 =*/282).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified LogEntry message, length delimited. Does not implicitly {@link google.logging.v2.LogEntry.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.LogEntry
                     * @static
                     * @param {google.logging.v2.ILogEntry} message LogEntry message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    LogEntry.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a LogEntry message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.LogEntry
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.LogEntry} LogEntry
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    LogEntry.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.LogEntry(), key, value;
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 12:
                                message.logName = reader.string();
                                break;
                            case 8:
                                message.resource = $root.google.api.MonitoredResource.decode(reader, reader.uint32());
                                break;
                            case 2:
                                message.protoPayload = $root.google.protobuf.Any.decode(reader, reader.uint32());
                                break;
                            case 3:
                                message.textPayload = reader.string();
                                break;
                            case 6:
                                message.jsonPayload = $root.google.protobuf.Struct.decode(reader, reader.uint32());
                                break;
                            case 9:
                                message.timestamp = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                break;
                            case 24:
                                message.receiveTimestamp = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                break;
                            case 10:
                                message.severity = reader.int32();
                                break;
                            case 4:
                                message.insertId = reader.string();
                                break;
                            case 7:
                                message.httpRequest = $root.google.logging.type.HttpRequest.decode(reader, reader.uint32());
                                break;
                            case 11:
                                if (message.labels === $util.emptyObject)
                                    message.labels = {};
                                var end2 = reader.uint32() + reader.pos;
                                key = "";
                                value = "";
                                while (reader.pos < end2) {
                                    var tag2 = reader.uint32();
                                    switch (tag2 >>> 3) {
                                    case 1:
                                        key = reader.string();
                                        break;
                                    case 2:
                                        value = reader.string();
                                        break;
                                    default:
                                        reader.skipType(tag2 & 7);
                                        break;
                                    }
                                }
                                message.labels[key] = value;
                                break;
                            case 15:
                                message.operation = $root.google.logging.v2.LogEntryOperation.decode(reader, reader.uint32());
                                break;
                            case 22:
                                message.trace = reader.string();
                                break;
                            case 27:
                                message.spanId = reader.string();
                                break;
                            case 30:
                                message.traceSampled = reader.bool();
                                break;
                            case 23:
                                message.sourceLocation = $root.google.logging.v2.LogEntrySourceLocation.decode(reader, reader.uint32());
                                break;
                            case 35:
                                message.split = $root.google.logging.v2.LogSplit.decode(reader, reader.uint32());
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a LogEntry message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.LogEntry
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.LogEntry} LogEntry
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    LogEntry.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a LogEntry message.
                     * @function verify
                     * @memberof google.logging.v2.LogEntry
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    LogEntry.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        var properties = {};
                        if (message.logName != null && message.hasOwnProperty("logName"))
                            if (!$util.isString(message.logName))
                                return "logName: string expected";
                        if (message.resource != null && message.hasOwnProperty("resource")) {
                            var error = $root.google.api.MonitoredResource.verify(message.resource);
                            if (error)
                                return "resource." + error;
                        }
                        if (message.protoPayload != null && message.hasOwnProperty("protoPayload")) {
                            properties.payload = 1;
                            {
                                var error = $root.google.protobuf.Any.verify(message.protoPayload);
                                if (error)
                                    return "protoPayload." + error;
                            }
                        }
                        if (message.textPayload != null && message.hasOwnProperty("textPayload")) {
                            if (properties.payload === 1)
                                return "payload: multiple values";
                            properties.payload = 1;
                            if (!$util.isString(message.textPayload))
                                return "textPayload: string expected";
                        }
                        if (message.jsonPayload != null && message.hasOwnProperty("jsonPayload")) {
                            if (properties.payload === 1)
                                return "payload: multiple values";
                            properties.payload = 1;
                            {
                                var error = $root.google.protobuf.Struct.verify(message.jsonPayload);
                                if (error)
                                    return "jsonPayload." + error;
                            }
                        }
                        if (message.timestamp != null && message.hasOwnProperty("timestamp")) {
                            var error = $root.google.protobuf.Timestamp.verify(message.timestamp);
                            if (error)
                                return "timestamp." + error;
                        }
                        if (message.receiveTimestamp != null && message.hasOwnProperty("receiveTimestamp")) {
                            var error = $root.google.protobuf.Timestamp.verify(message.receiveTimestamp);
                            if (error)
                                return "receiveTimestamp." + error;
                        }
                        if (message.severity != null && message.hasOwnProperty("severity"))
                            switch (message.severity) {
                            default:
                                return "severity: enum value expected";
                            case 0:
                            case 100:
                            case 200:
                            case 300:
                            case 400:
                            case 500:
                            case 600:
                            case 700:
                            case 800:
                                break;
                            }
                        if (message.insertId != null && message.hasOwnProperty("insertId"))
                            if (!$util.isString(message.insertId))
                                return "insertId: string expected";
                        if (message.httpRequest != null && message.hasOwnProperty("httpRequest")) {
                            var error = $root.google.logging.type.HttpRequest.verify(message.httpRequest);
                            if (error)
                                return "httpRequest." + error;
                        }
                        if (message.labels != null && message.hasOwnProperty("labels")) {
                            if (!$util.isObject(message.labels))
                                return "labels: object expected";
                            var key = Object.keys(message.labels);
                            for (var i = 0; i < key.length; ++i)
                                if (!$util.isString(message.labels[key[i]]))
                                    return "labels: string{k:string} expected";
                        }
                        if (message.operation != null && message.hasOwnProperty("operation")) {
                            var error = $root.google.logging.v2.LogEntryOperation.verify(message.operation);
                            if (error)
                                return "operation." + error;
                        }
                        if (message.trace != null && message.hasOwnProperty("trace"))
                            if (!$util.isString(message.trace))
                                return "trace: string expected";
                        if (message.spanId != null && message.hasOwnProperty("spanId"))
                            if (!$util.isString(message.spanId))
                                return "spanId: string expected";
                        if (message.traceSampled != null && message.hasOwnProperty("traceSampled"))
                            if (typeof message.traceSampled !== "boolean")
                                return "traceSampled: boolean expected";
                        if (message.sourceLocation != null && message.hasOwnProperty("sourceLocation")) {
                            var error = $root.google.logging.v2.LogEntrySourceLocation.verify(message.sourceLocation);
                            if (error)
                                return "sourceLocation." + error;
                        }
                        if (message.split != null && message.hasOwnProperty("split")) {
                            var error = $root.google.logging.v2.LogSplit.verify(message.split);
                            if (error)
                                return "split." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a LogEntry message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.LogEntry
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.LogEntry} LogEntry
                     */
                    LogEntry.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.LogEntry)
                            return object;
                        var message = new $root.google.logging.v2.LogEntry();
                        if (object.logName != null)
                            message.logName = String(object.logName);
                        if (object.resource != null) {
                            if (typeof object.resource !== "object")
                                throw TypeError(".google.logging.v2.LogEntry.resource: object expected");
                            message.resource = $root.google.api.MonitoredResource.fromObject(object.resource);
                        }
                        if (object.protoPayload != null) {
                            if (typeof object.protoPayload !== "object")
                                throw TypeError(".google.logging.v2.LogEntry.protoPayload: object expected");
                            message.protoPayload = $root.google.protobuf.Any.fromObject(object.protoPayload);
                        }
                        if (object.textPayload != null)
                            message.textPayload = String(object.textPayload);
                        if (object.jsonPayload != null) {
                            if (typeof object.jsonPayload !== "object")
                                throw TypeError(".google.logging.v2.LogEntry.jsonPayload: object expected");
                            message.jsonPayload = $root.google.protobuf.Struct.fromObject(object.jsonPayload);
                        }
                        if (object.timestamp != null) {
                            if (typeof object.timestamp !== "object")
                                throw TypeError(".google.logging.v2.LogEntry.timestamp: object expected");
                            message.timestamp = $root.google.protobuf.Timestamp.fromObject(object.timestamp);
                        }
                        if (object.receiveTimestamp != null) {
                            if (typeof object.receiveTimestamp !== "object")
                                throw TypeError(".google.logging.v2.LogEntry.receiveTimestamp: object expected");
                            message.receiveTimestamp = $root.google.protobuf.Timestamp.fromObject(object.receiveTimestamp);
                        }
                        switch (object.severity) {
                        case "DEFAULT":
                        case 0:
                            message.severity = 0;
                            break;
                        case "DEBUG":
                        case 100:
                            message.severity = 100;
                            break;
                        case "INFO":
                        case 200:
                            message.severity = 200;
                            break;
                        case "NOTICE":
                        case 300:
                            message.severity = 300;
                            break;
                        case "WARNING":
                        case 400:
                            message.severity = 400;
                            break;
                        case "ERROR":
                        case 500:
                            message.severity = 500;
                            break;
                        case "CRITICAL":
                        case 600:
                            message.severity = 600;
                            break;
                        case "ALERT":
                        case 700:
                            message.severity = 700;
                            break;
                        case "EMERGENCY":
                        case 800:
                            message.severity = 800;
                            break;
                        }
                        if (object.insertId != null)
                            message.insertId = String(object.insertId);
                        if (object.httpRequest != null) {
                            if (typeof object.httpRequest !== "object")
                                throw TypeError(".google.logging.v2.LogEntry.httpRequest: object expected");
                            message.httpRequest = $root.google.logging.type.HttpRequest.fromObject(object.httpRequest);
                        }
                        if (object.labels) {
                            if (typeof object.labels !== "object")
                                throw TypeError(".google.logging.v2.LogEntry.labels: object expected");
                            message.labels = {};
                            for (var keys = Object.keys(object.labels), i = 0; i < keys.length; ++i)
                                message.labels[keys[i]] = String(object.labels[keys[i]]);
                        }
                        if (object.operation != null) {
                            if (typeof object.operation !== "object")
                                throw TypeError(".google.logging.v2.LogEntry.operation: object expected");
                            message.operation = $root.google.logging.v2.LogEntryOperation.fromObject(object.operation);
                        }
                        if (object.trace != null)
                            message.trace = String(object.trace);
                        if (object.spanId != null)
                            message.spanId = String(object.spanId);
                        if (object.traceSampled != null)
                            message.traceSampled = Boolean(object.traceSampled);
                        if (object.sourceLocation != null) {
                            if (typeof object.sourceLocation !== "object")
                                throw TypeError(".google.logging.v2.LogEntry.sourceLocation: object expected");
                            message.sourceLocation = $root.google.logging.v2.LogEntrySourceLocation.fromObject(object.sourceLocation);
                        }
                        if (object.split != null) {
                            if (typeof object.split !== "object")
                                throw TypeError(".google.logging.v2.LogEntry.split: object expected");
                            message.split = $root.google.logging.v2.LogSplit.fromObject(object.split);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a LogEntry message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.LogEntry
                     * @static
                     * @param {google.logging.v2.LogEntry} message LogEntry
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    LogEntry.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.objects || options.defaults)
                            object.labels = {};
                        if (options.defaults) {
                            object.insertId = "";
                            object.httpRequest = null;
                            object.resource = null;
                            object.timestamp = null;
                            object.severity = options.enums === String ? "DEFAULT" : 0;
                            object.logName = "";
                            object.operation = null;
                            object.trace = "";
                            object.sourceLocation = null;
                            object.receiveTimestamp = null;
                            object.spanId = "";
                            object.traceSampled = false;
                            object.split = null;
                        }
                        if (message.protoPayload != null && message.hasOwnProperty("protoPayload")) {
                            object.protoPayload = $root.google.protobuf.Any.toObject(message.protoPayload, options);
                            if (options.oneofs)
                                object.payload = "protoPayload";
                        }
                        if (message.textPayload != null && message.hasOwnProperty("textPayload")) {
                            object.textPayload = message.textPayload;
                            if (options.oneofs)
                                object.payload = "textPayload";
                        }
                        if (message.insertId != null && message.hasOwnProperty("insertId"))
                            object.insertId = message.insertId;
                        if (message.jsonPayload != null && message.hasOwnProperty("jsonPayload")) {
                            object.jsonPayload = $root.google.protobuf.Struct.toObject(message.jsonPayload, options);
                            if (options.oneofs)
                                object.payload = "jsonPayload";
                        }
                        if (message.httpRequest != null && message.hasOwnProperty("httpRequest"))
                            object.httpRequest = $root.google.logging.type.HttpRequest.toObject(message.httpRequest, options);
                        if (message.resource != null && message.hasOwnProperty("resource"))
                            object.resource = $root.google.api.MonitoredResource.toObject(message.resource, options);
                        if (message.timestamp != null && message.hasOwnProperty("timestamp"))
                            object.timestamp = $root.google.protobuf.Timestamp.toObject(message.timestamp, options);
                        if (message.severity != null && message.hasOwnProperty("severity"))
                            object.severity = options.enums === String ? $root.google.logging.type.LogSeverity[message.severity] : message.severity;
                        var keys2;
                        if (message.labels && (keys2 = Object.keys(message.labels)).length) {
                            object.labels = {};
                            for (var j = 0; j < keys2.length; ++j)
                                object.labels[keys2[j]] = message.labels[keys2[j]];
                        }
                        if (message.logName != null && message.hasOwnProperty("logName"))
                            object.logName = message.logName;
                        if (message.operation != null && message.hasOwnProperty("operation"))
                            object.operation = $root.google.logging.v2.LogEntryOperation.toObject(message.operation, options);
                        if (message.trace != null && message.hasOwnProperty("trace"))
                            object.trace = message.trace;
                        if (message.sourceLocation != null && message.hasOwnProperty("sourceLocation"))
                            object.sourceLocation = $root.google.logging.v2.LogEntrySourceLocation.toObject(message.sourceLocation, options);
                        if (message.receiveTimestamp != null && message.hasOwnProperty("receiveTimestamp"))
                            object.receiveTimestamp = $root.google.protobuf.Timestamp.toObject(message.receiveTimestamp, options);
                        if (message.spanId != null && message.hasOwnProperty("spanId"))
                            object.spanId = message.spanId;
                        if (message.traceSampled != null && message.hasOwnProperty("traceSampled"))
                            object.traceSampled = message.traceSampled;
                        if (message.split != null && message.hasOwnProperty("split"))
                            object.split = $root.google.logging.v2.LogSplit.toObject(message.split, options);
                        return object;
                    };
    
                    /**
                     * Converts this LogEntry to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.LogEntry
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    LogEntry.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return LogEntry;
                })();
    
                v2.LogEntryOperation = (function() {
    
                    /**
                     * Properties of a LogEntryOperation.
                     * @memberof google.logging.v2
                     * @interface ILogEntryOperation
                     * @property {string|null} [id] LogEntryOperation id
                     * @property {string|null} [producer] LogEntryOperation producer
                     * @property {boolean|null} [first] LogEntryOperation first
                     * @property {boolean|null} [last] LogEntryOperation last
                     */
    
                    /**
                     * Constructs a new LogEntryOperation.
                     * @memberof google.logging.v2
                     * @classdesc Represents a LogEntryOperation.
                     * @implements ILogEntryOperation
                     * @constructor
                     * @param {google.logging.v2.ILogEntryOperation=} [properties] Properties to set
                     */
                    function LogEntryOperation(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * LogEntryOperation id.
                     * @member {string} id
                     * @memberof google.logging.v2.LogEntryOperation
                     * @instance
                     */
                    LogEntryOperation.prototype.id = "";
    
                    /**
                     * LogEntryOperation producer.
                     * @member {string} producer
                     * @memberof google.logging.v2.LogEntryOperation
                     * @instance
                     */
                    LogEntryOperation.prototype.producer = "";
    
                    /**
                     * LogEntryOperation first.
                     * @member {boolean} first
                     * @memberof google.logging.v2.LogEntryOperation
                     * @instance
                     */
                    LogEntryOperation.prototype.first = false;
    
                    /**
                     * LogEntryOperation last.
                     * @member {boolean} last
                     * @memberof google.logging.v2.LogEntryOperation
                     * @instance
                     */
                    LogEntryOperation.prototype.last = false;
    
                    /**
                     * Creates a new LogEntryOperation instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.LogEntryOperation
                     * @static
                     * @param {google.logging.v2.ILogEntryOperation=} [properties] Properties to set
                     * @returns {google.logging.v2.LogEntryOperation} LogEntryOperation instance
                     */
                    LogEntryOperation.create = function create(properties) {
                        return new LogEntryOperation(properties);
                    };
    
                    /**
                     * Encodes the specified LogEntryOperation message. Does not implicitly {@link google.logging.v2.LogEntryOperation.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.LogEntryOperation
                     * @static
                     * @param {google.logging.v2.ILogEntryOperation} message LogEntryOperation message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    LogEntryOperation.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.id != null && Object.hasOwnProperty.call(message, "id"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.id);
                        if (message.producer != null && Object.hasOwnProperty.call(message, "producer"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.producer);
                        if (message.first != null && Object.hasOwnProperty.call(message, "first"))
                            writer.uint32(/* id 3, wireType 0 =*/24).bool(message.first);
                        if (message.last != null && Object.hasOwnProperty.call(message, "last"))
                            writer.uint32(/* id 4, wireType 0 =*/32).bool(message.last);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified LogEntryOperation message, length delimited. Does not implicitly {@link google.logging.v2.LogEntryOperation.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.LogEntryOperation
                     * @static
                     * @param {google.logging.v2.ILogEntryOperation} message LogEntryOperation message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    LogEntryOperation.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a LogEntryOperation message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.LogEntryOperation
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.LogEntryOperation} LogEntryOperation
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    LogEntryOperation.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.LogEntryOperation();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.id = reader.string();
                                break;
                            case 2:
                                message.producer = reader.string();
                                break;
                            case 3:
                                message.first = reader.bool();
                                break;
                            case 4:
                                message.last = reader.bool();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a LogEntryOperation message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.LogEntryOperation
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.LogEntryOperation} LogEntryOperation
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    LogEntryOperation.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a LogEntryOperation message.
                     * @function verify
                     * @memberof google.logging.v2.LogEntryOperation
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    LogEntryOperation.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.id != null && message.hasOwnProperty("id"))
                            if (!$util.isString(message.id))
                                return "id: string expected";
                        if (message.producer != null && message.hasOwnProperty("producer"))
                            if (!$util.isString(message.producer))
                                return "producer: string expected";
                        if (message.first != null && message.hasOwnProperty("first"))
                            if (typeof message.first !== "boolean")
                                return "first: boolean expected";
                        if (message.last != null && message.hasOwnProperty("last"))
                            if (typeof message.last !== "boolean")
                                return "last: boolean expected";
                        return null;
                    };
    
                    /**
                     * Creates a LogEntryOperation message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.LogEntryOperation
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.LogEntryOperation} LogEntryOperation
                     */
                    LogEntryOperation.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.LogEntryOperation)
                            return object;
                        var message = new $root.google.logging.v2.LogEntryOperation();
                        if (object.id != null)
                            message.id = String(object.id);
                        if (object.producer != null)
                            message.producer = String(object.producer);
                        if (object.first != null)
                            message.first = Boolean(object.first);
                        if (object.last != null)
                            message.last = Boolean(object.last);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a LogEntryOperation message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.LogEntryOperation
                     * @static
                     * @param {google.logging.v2.LogEntryOperation} message LogEntryOperation
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    LogEntryOperation.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.id = "";
                            object.producer = "";
                            object.first = false;
                            object.last = false;
                        }
                        if (message.id != null && message.hasOwnProperty("id"))
                            object.id = message.id;
                        if (message.producer != null && message.hasOwnProperty("producer"))
                            object.producer = message.producer;
                        if (message.first != null && message.hasOwnProperty("first"))
                            object.first = message.first;
                        if (message.last != null && message.hasOwnProperty("last"))
                            object.last = message.last;
                        return object;
                    };
    
                    /**
                     * Converts this LogEntryOperation to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.LogEntryOperation
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    LogEntryOperation.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return LogEntryOperation;
                })();
    
                v2.LogEntrySourceLocation = (function() {
    
                    /**
                     * Properties of a LogEntrySourceLocation.
                     * @memberof google.logging.v2
                     * @interface ILogEntrySourceLocation
                     * @property {string|null} [file] LogEntrySourceLocation file
                     * @property {number|Long|null} [line] LogEntrySourceLocation line
                     * @property {string|null} ["function"] LogEntrySourceLocation function
                     */
    
                    /**
                     * Constructs a new LogEntrySourceLocation.
                     * @memberof google.logging.v2
                     * @classdesc Represents a LogEntrySourceLocation.
                     * @implements ILogEntrySourceLocation
                     * @constructor
                     * @param {google.logging.v2.ILogEntrySourceLocation=} [properties] Properties to set
                     */
                    function LogEntrySourceLocation(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * LogEntrySourceLocation file.
                     * @member {string} file
                     * @memberof google.logging.v2.LogEntrySourceLocation
                     * @instance
                     */
                    LogEntrySourceLocation.prototype.file = "";
    
                    /**
                     * LogEntrySourceLocation line.
                     * @member {number|Long} line
                     * @memberof google.logging.v2.LogEntrySourceLocation
                     * @instance
                     */
                    LogEntrySourceLocation.prototype.line = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                    /**
                     * LogEntrySourceLocation function.
                     * @member {string} function
                     * @memberof google.logging.v2.LogEntrySourceLocation
                     * @instance
                     */
                    LogEntrySourceLocation.prototype["function"] = "";
    
                    /**
                     * Creates a new LogEntrySourceLocation instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.LogEntrySourceLocation
                     * @static
                     * @param {google.logging.v2.ILogEntrySourceLocation=} [properties] Properties to set
                     * @returns {google.logging.v2.LogEntrySourceLocation} LogEntrySourceLocation instance
                     */
                    LogEntrySourceLocation.create = function create(properties) {
                        return new LogEntrySourceLocation(properties);
                    };
    
                    /**
                     * Encodes the specified LogEntrySourceLocation message. Does not implicitly {@link google.logging.v2.LogEntrySourceLocation.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.LogEntrySourceLocation
                     * @static
                     * @param {google.logging.v2.ILogEntrySourceLocation} message LogEntrySourceLocation message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    LogEntrySourceLocation.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.file);
                        if (message.line != null && Object.hasOwnProperty.call(message, "line"))
                            writer.uint32(/* id 2, wireType 0 =*/16).int64(message.line);
                        if (message["function"] != null && Object.hasOwnProperty.call(message, "function"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message["function"]);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified LogEntrySourceLocation message, length delimited. Does not implicitly {@link google.logging.v2.LogEntrySourceLocation.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.LogEntrySourceLocation
                     * @static
                     * @param {google.logging.v2.ILogEntrySourceLocation} message LogEntrySourceLocation message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    LogEntrySourceLocation.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a LogEntrySourceLocation message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.LogEntrySourceLocation
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.LogEntrySourceLocation} LogEntrySourceLocation
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    LogEntrySourceLocation.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.LogEntrySourceLocation();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.file = reader.string();
                                break;
                            case 2:
                                message.line = reader.int64();
                                break;
                            case 3:
                                message["function"] = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a LogEntrySourceLocation message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.LogEntrySourceLocation
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.LogEntrySourceLocation} LogEntrySourceLocation
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    LogEntrySourceLocation.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a LogEntrySourceLocation message.
                     * @function verify
                     * @memberof google.logging.v2.LogEntrySourceLocation
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    LogEntrySourceLocation.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.file != null && message.hasOwnProperty("file"))
                            if (!$util.isString(message.file))
                                return "file: string expected";
                        if (message.line != null && message.hasOwnProperty("line"))
                            if (!$util.isInteger(message.line) && !(message.line && $util.isInteger(message.line.low) && $util.isInteger(message.line.high)))
                                return "line: integer|Long expected";
                        if (message["function"] != null && message.hasOwnProperty("function"))
                            if (!$util.isString(message["function"]))
                                return "function: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a LogEntrySourceLocation message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.LogEntrySourceLocation
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.LogEntrySourceLocation} LogEntrySourceLocation
                     */
                    LogEntrySourceLocation.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.LogEntrySourceLocation)
                            return object;
                        var message = new $root.google.logging.v2.LogEntrySourceLocation();
                        if (object.file != null)
                            message.file = String(object.file);
                        if (object.line != null)
                            if ($util.Long)
                                (message.line = $util.Long.fromValue(object.line)).unsigned = false;
                            else if (typeof object.line === "string")
                                message.line = parseInt(object.line, 10);
                            else if (typeof object.line === "number")
                                message.line = object.line;
                            else if (typeof object.line === "object")
                                message.line = new $util.LongBits(object.line.low >>> 0, object.line.high >>> 0).toNumber();
                        if (object["function"] != null)
                            message["function"] = String(object["function"]);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a LogEntrySourceLocation message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.LogEntrySourceLocation
                     * @static
                     * @param {google.logging.v2.LogEntrySourceLocation} message LogEntrySourceLocation
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    LogEntrySourceLocation.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.file = "";
                            if ($util.Long) {
                                var long = new $util.Long(0, 0, false);
                                object.line = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                            } else
                                object.line = options.longs === String ? "0" : 0;
                            object["function"] = "";
                        }
                        if (message.file != null && message.hasOwnProperty("file"))
                            object.file = message.file;
                        if (message.line != null && message.hasOwnProperty("line"))
                            if (typeof message.line === "number")
                                object.line = options.longs === String ? String(message.line) : message.line;
                            else
                                object.line = options.longs === String ? $util.Long.prototype.toString.call(message.line) : options.longs === Number ? new $util.LongBits(message.line.low >>> 0, message.line.high >>> 0).toNumber() : message.line;
                        if (message["function"] != null && message.hasOwnProperty("function"))
                            object["function"] = message["function"];
                        return object;
                    };
    
                    /**
                     * Converts this LogEntrySourceLocation to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.LogEntrySourceLocation
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    LogEntrySourceLocation.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return LogEntrySourceLocation;
                })();
    
                v2.LogSplit = (function() {
    
                    /**
                     * Properties of a LogSplit.
                     * @memberof google.logging.v2
                     * @interface ILogSplit
                     * @property {string|null} [uid] LogSplit uid
                     * @property {number|null} [index] LogSplit index
                     * @property {number|null} [totalSplits] LogSplit totalSplits
                     */
    
                    /**
                     * Constructs a new LogSplit.
                     * @memberof google.logging.v2
                     * @classdesc Represents a LogSplit.
                     * @implements ILogSplit
                     * @constructor
                     * @param {google.logging.v2.ILogSplit=} [properties] Properties to set
                     */
                    function LogSplit(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * LogSplit uid.
                     * @member {string} uid
                     * @memberof google.logging.v2.LogSplit
                     * @instance
                     */
                    LogSplit.prototype.uid = "";
    
                    /**
                     * LogSplit index.
                     * @member {number} index
                     * @memberof google.logging.v2.LogSplit
                     * @instance
                     */
                    LogSplit.prototype.index = 0;
    
                    /**
                     * LogSplit totalSplits.
                     * @member {number} totalSplits
                     * @memberof google.logging.v2.LogSplit
                     * @instance
                     */
                    LogSplit.prototype.totalSplits = 0;
    
                    /**
                     * Creates a new LogSplit instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.LogSplit
                     * @static
                     * @param {google.logging.v2.ILogSplit=} [properties] Properties to set
                     * @returns {google.logging.v2.LogSplit} LogSplit instance
                     */
                    LogSplit.create = function create(properties) {
                        return new LogSplit(properties);
                    };
    
                    /**
                     * Encodes the specified LogSplit message. Does not implicitly {@link google.logging.v2.LogSplit.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.LogSplit
                     * @static
                     * @param {google.logging.v2.ILogSplit} message LogSplit message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    LogSplit.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.uid != null && Object.hasOwnProperty.call(message, "uid"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.uid);
                        if (message.index != null && Object.hasOwnProperty.call(message, "index"))
                            writer.uint32(/* id 2, wireType 0 =*/16).int32(message.index);
                        if (message.totalSplits != null && Object.hasOwnProperty.call(message, "totalSplits"))
                            writer.uint32(/* id 3, wireType 0 =*/24).int32(message.totalSplits);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified LogSplit message, length delimited. Does not implicitly {@link google.logging.v2.LogSplit.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.LogSplit
                     * @static
                     * @param {google.logging.v2.ILogSplit} message LogSplit message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    LogSplit.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a LogSplit message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.LogSplit
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.LogSplit} LogSplit
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    LogSplit.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.LogSplit();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.uid = reader.string();
                                break;
                            case 2:
                                message.index = reader.int32();
                                break;
                            case 3:
                                message.totalSplits = reader.int32();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a LogSplit message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.LogSplit
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.LogSplit} LogSplit
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    LogSplit.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a LogSplit message.
                     * @function verify
                     * @memberof google.logging.v2.LogSplit
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    LogSplit.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.uid != null && message.hasOwnProperty("uid"))
                            if (!$util.isString(message.uid))
                                return "uid: string expected";
                        if (message.index != null && message.hasOwnProperty("index"))
                            if (!$util.isInteger(message.index))
                                return "index: integer expected";
                        if (message.totalSplits != null && message.hasOwnProperty("totalSplits"))
                            if (!$util.isInteger(message.totalSplits))
                                return "totalSplits: integer expected";
                        return null;
                    };
    
                    /**
                     * Creates a LogSplit message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.LogSplit
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.LogSplit} LogSplit
                     */
                    LogSplit.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.LogSplit)
                            return object;
                        var message = new $root.google.logging.v2.LogSplit();
                        if (object.uid != null)
                            message.uid = String(object.uid);
                        if (object.index != null)
                            message.index = object.index | 0;
                        if (object.totalSplits != null)
                            message.totalSplits = object.totalSplits | 0;
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a LogSplit message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.LogSplit
                     * @static
                     * @param {google.logging.v2.LogSplit} message LogSplit
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    LogSplit.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.uid = "";
                            object.index = 0;
                            object.totalSplits = 0;
                        }
                        if (message.uid != null && message.hasOwnProperty("uid"))
                            object.uid = message.uid;
                        if (message.index != null && message.hasOwnProperty("index"))
                            object.index = message.index;
                        if (message.totalSplits != null && message.hasOwnProperty("totalSplits"))
                            object.totalSplits = message.totalSplits;
                        return object;
                    };
    
                    /**
                     * Converts this LogSplit to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.LogSplit
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    LogSplit.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return LogSplit;
                })();
    
                v2.LoggingServiceV2 = (function() {
    
                    /**
                     * Constructs a new LoggingServiceV2 service.
                     * @memberof google.logging.v2
                     * @classdesc Represents a LoggingServiceV2
                     * @extends $protobuf.rpc.Service
                     * @constructor
                     * @param {$protobuf.RPCImpl} rpcImpl RPC implementation
                     * @param {boolean} [requestDelimited=false] Whether requests are length-delimited
                     * @param {boolean} [responseDelimited=false] Whether responses are length-delimited
                     */
                    function LoggingServiceV2(rpcImpl, requestDelimited, responseDelimited) {
                        $protobuf.rpc.Service.call(this, rpcImpl, requestDelimited, responseDelimited);
                    }
    
                    (LoggingServiceV2.prototype = Object.create($protobuf.rpc.Service.prototype)).constructor = LoggingServiceV2;
    
                    /**
                     * Creates new LoggingServiceV2 service using the specified rpc implementation.
                     * @function create
                     * @memberof google.logging.v2.LoggingServiceV2
                     * @static
                     * @param {$protobuf.RPCImpl} rpcImpl RPC implementation
                     * @param {boolean} [requestDelimited=false] Whether requests are length-delimited
                     * @param {boolean} [responseDelimited=false] Whether responses are length-delimited
                     * @returns {LoggingServiceV2} RPC service. Useful where requests and/or responses are streamed.
                     */
                    LoggingServiceV2.create = function create(rpcImpl, requestDelimited, responseDelimited) {
                        return new this(rpcImpl, requestDelimited, responseDelimited);
                    };
    
                    /**
                     * Callback as used by {@link google.logging.v2.LoggingServiceV2|deleteLog}.
                     * @memberof google.logging.v2.LoggingServiceV2
                     * @typedef DeleteLogCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.protobuf.Empty} [response] Empty
                     */
    
                    /**
                     * Calls DeleteLog.
                     * @function deleteLog
                     * @memberof google.logging.v2.LoggingServiceV2
                     * @instance
                     * @param {google.logging.v2.IDeleteLogRequest} request DeleteLogRequest message or plain object
                     * @param {google.logging.v2.LoggingServiceV2.DeleteLogCallback} callback Node-style callback called with the error, if any, and Empty
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(LoggingServiceV2.prototype.deleteLog = function deleteLog(request, callback) {
                        return this.rpcCall(deleteLog, $root.google.logging.v2.DeleteLogRequest, $root.google.protobuf.Empty, request, callback);
                    }, "name", { value: "DeleteLog" });
    
                    /**
                     * Calls DeleteLog.
                     * @function deleteLog
                     * @memberof google.logging.v2.LoggingServiceV2
                     * @instance
                     * @param {google.logging.v2.IDeleteLogRequest} request DeleteLogRequest message or plain object
                     * @returns {Promise<google.protobuf.Empty>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.LoggingServiceV2|writeLogEntries}.
                     * @memberof google.logging.v2.LoggingServiceV2
                     * @typedef WriteLogEntriesCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.WriteLogEntriesResponse} [response] WriteLogEntriesResponse
                     */
    
                    /**
                     * Calls WriteLogEntries.
                     * @function writeLogEntries
                     * @memberof google.logging.v2.LoggingServiceV2
                     * @instance
                     * @param {google.logging.v2.IWriteLogEntriesRequest} request WriteLogEntriesRequest message or plain object
                     * @param {google.logging.v2.LoggingServiceV2.WriteLogEntriesCallback} callback Node-style callback called with the error, if any, and WriteLogEntriesResponse
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(LoggingServiceV2.prototype.writeLogEntries = function writeLogEntries(request, callback) {
                        return this.rpcCall(writeLogEntries, $root.google.logging.v2.WriteLogEntriesRequest, $root.google.logging.v2.WriteLogEntriesResponse, request, callback);
                    }, "name", { value: "WriteLogEntries" });
    
                    /**
                     * Calls WriteLogEntries.
                     * @function writeLogEntries
                     * @memberof google.logging.v2.LoggingServiceV2
                     * @instance
                     * @param {google.logging.v2.IWriteLogEntriesRequest} request WriteLogEntriesRequest message or plain object
                     * @returns {Promise<google.logging.v2.WriteLogEntriesResponse>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.LoggingServiceV2|listLogEntries}.
                     * @memberof google.logging.v2.LoggingServiceV2
                     * @typedef ListLogEntriesCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.ListLogEntriesResponse} [response] ListLogEntriesResponse
                     */
    
                    /**
                     * Calls ListLogEntries.
                     * @function listLogEntries
                     * @memberof google.logging.v2.LoggingServiceV2
                     * @instance
                     * @param {google.logging.v2.IListLogEntriesRequest} request ListLogEntriesRequest message or plain object
                     * @param {google.logging.v2.LoggingServiceV2.ListLogEntriesCallback} callback Node-style callback called with the error, if any, and ListLogEntriesResponse
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(LoggingServiceV2.prototype.listLogEntries = function listLogEntries(request, callback) {
                        return this.rpcCall(listLogEntries, $root.google.logging.v2.ListLogEntriesRequest, $root.google.logging.v2.ListLogEntriesResponse, request, callback);
                    }, "name", { value: "ListLogEntries" });
    
                    /**
                     * Calls ListLogEntries.
                     * @function listLogEntries
                     * @memberof google.logging.v2.LoggingServiceV2
                     * @instance
                     * @param {google.logging.v2.IListLogEntriesRequest} request ListLogEntriesRequest message or plain object
                     * @returns {Promise<google.logging.v2.ListLogEntriesResponse>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.LoggingServiceV2|listMonitoredResourceDescriptors}.
                     * @memberof google.logging.v2.LoggingServiceV2
                     * @typedef ListMonitoredResourceDescriptorsCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.ListMonitoredResourceDescriptorsResponse} [response] ListMonitoredResourceDescriptorsResponse
                     */
    
                    /**
                     * Calls ListMonitoredResourceDescriptors.
                     * @function listMonitoredResourceDescriptors
                     * @memberof google.logging.v2.LoggingServiceV2
                     * @instance
                     * @param {google.logging.v2.IListMonitoredResourceDescriptorsRequest} request ListMonitoredResourceDescriptorsRequest message or plain object
                     * @param {google.logging.v2.LoggingServiceV2.ListMonitoredResourceDescriptorsCallback} callback Node-style callback called with the error, if any, and ListMonitoredResourceDescriptorsResponse
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(LoggingServiceV2.prototype.listMonitoredResourceDescriptors = function listMonitoredResourceDescriptors(request, callback) {
                        return this.rpcCall(listMonitoredResourceDescriptors, $root.google.logging.v2.ListMonitoredResourceDescriptorsRequest, $root.google.logging.v2.ListMonitoredResourceDescriptorsResponse, request, callback);
                    }, "name", { value: "ListMonitoredResourceDescriptors" });
    
                    /**
                     * Calls ListMonitoredResourceDescriptors.
                     * @function listMonitoredResourceDescriptors
                     * @memberof google.logging.v2.LoggingServiceV2
                     * @instance
                     * @param {google.logging.v2.IListMonitoredResourceDescriptorsRequest} request ListMonitoredResourceDescriptorsRequest message or plain object
                     * @returns {Promise<google.logging.v2.ListMonitoredResourceDescriptorsResponse>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.LoggingServiceV2|listLogs}.
                     * @memberof google.logging.v2.LoggingServiceV2
                     * @typedef ListLogsCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.ListLogsResponse} [response] ListLogsResponse
                     */
    
                    /**
                     * Calls ListLogs.
                     * @function listLogs
                     * @memberof google.logging.v2.LoggingServiceV2
                     * @instance
                     * @param {google.logging.v2.IListLogsRequest} request ListLogsRequest message or plain object
                     * @param {google.logging.v2.LoggingServiceV2.ListLogsCallback} callback Node-style callback called with the error, if any, and ListLogsResponse
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(LoggingServiceV2.prototype.listLogs = function listLogs(request, callback) {
                        return this.rpcCall(listLogs, $root.google.logging.v2.ListLogsRequest, $root.google.logging.v2.ListLogsResponse, request, callback);
                    }, "name", { value: "ListLogs" });
    
                    /**
                     * Calls ListLogs.
                     * @function listLogs
                     * @memberof google.logging.v2.LoggingServiceV2
                     * @instance
                     * @param {google.logging.v2.IListLogsRequest} request ListLogsRequest message or plain object
                     * @returns {Promise<google.logging.v2.ListLogsResponse>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.LoggingServiceV2|tailLogEntries}.
                     * @memberof google.logging.v2.LoggingServiceV2
                     * @typedef TailLogEntriesCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.TailLogEntriesResponse} [response] TailLogEntriesResponse
                     */
    
                    /**
                     * Calls TailLogEntries.
                     * @function tailLogEntries
                     * @memberof google.logging.v2.LoggingServiceV2
                     * @instance
                     * @param {google.logging.v2.ITailLogEntriesRequest} request TailLogEntriesRequest message or plain object
                     * @param {google.logging.v2.LoggingServiceV2.TailLogEntriesCallback} callback Node-style callback called with the error, if any, and TailLogEntriesResponse
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(LoggingServiceV2.prototype.tailLogEntries = function tailLogEntries(request, callback) {
                        return this.rpcCall(tailLogEntries, $root.google.logging.v2.TailLogEntriesRequest, $root.google.logging.v2.TailLogEntriesResponse, request, callback);
                    }, "name", { value: "TailLogEntries" });
    
                    /**
                     * Calls TailLogEntries.
                     * @function tailLogEntries
                     * @memberof google.logging.v2.LoggingServiceV2
                     * @instance
                     * @param {google.logging.v2.ITailLogEntriesRequest} request TailLogEntriesRequest message or plain object
                     * @returns {Promise<google.logging.v2.TailLogEntriesResponse>} Promise
                     * @variation 2
                     */
    
                    return LoggingServiceV2;
                })();
    
                v2.DeleteLogRequest = (function() {
    
                    /**
                     * Properties of a DeleteLogRequest.
                     * @memberof google.logging.v2
                     * @interface IDeleteLogRequest
                     * @property {string|null} [logName] DeleteLogRequest logName
                     */
    
                    /**
                     * Constructs a new DeleteLogRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a DeleteLogRequest.
                     * @implements IDeleteLogRequest
                     * @constructor
                     * @param {google.logging.v2.IDeleteLogRequest=} [properties] Properties to set
                     */
                    function DeleteLogRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * DeleteLogRequest logName.
                     * @member {string} logName
                     * @memberof google.logging.v2.DeleteLogRequest
                     * @instance
                     */
                    DeleteLogRequest.prototype.logName = "";
    
                    /**
                     * Creates a new DeleteLogRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.DeleteLogRequest
                     * @static
                     * @param {google.logging.v2.IDeleteLogRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.DeleteLogRequest} DeleteLogRequest instance
                     */
                    DeleteLogRequest.create = function create(properties) {
                        return new DeleteLogRequest(properties);
                    };
    
                    /**
                     * Encodes the specified DeleteLogRequest message. Does not implicitly {@link google.logging.v2.DeleteLogRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.DeleteLogRequest
                     * @static
                     * @param {google.logging.v2.IDeleteLogRequest} message DeleteLogRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    DeleteLogRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.logName != null && Object.hasOwnProperty.call(message, "logName"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.logName);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified DeleteLogRequest message, length delimited. Does not implicitly {@link google.logging.v2.DeleteLogRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.DeleteLogRequest
                     * @static
                     * @param {google.logging.v2.IDeleteLogRequest} message DeleteLogRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    DeleteLogRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a DeleteLogRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.DeleteLogRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.DeleteLogRequest} DeleteLogRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    DeleteLogRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.DeleteLogRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.logName = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a DeleteLogRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.DeleteLogRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.DeleteLogRequest} DeleteLogRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    DeleteLogRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a DeleteLogRequest message.
                     * @function verify
                     * @memberof google.logging.v2.DeleteLogRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    DeleteLogRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.logName != null && message.hasOwnProperty("logName"))
                            if (!$util.isString(message.logName))
                                return "logName: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a DeleteLogRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.DeleteLogRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.DeleteLogRequest} DeleteLogRequest
                     */
                    DeleteLogRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.DeleteLogRequest)
                            return object;
                        var message = new $root.google.logging.v2.DeleteLogRequest();
                        if (object.logName != null)
                            message.logName = String(object.logName);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a DeleteLogRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.DeleteLogRequest
                     * @static
                     * @param {google.logging.v2.DeleteLogRequest} message DeleteLogRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    DeleteLogRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults)
                            object.logName = "";
                        if (message.logName != null && message.hasOwnProperty("logName"))
                            object.logName = message.logName;
                        return object;
                    };
    
                    /**
                     * Converts this DeleteLogRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.DeleteLogRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    DeleteLogRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return DeleteLogRequest;
                })();
    
                v2.WriteLogEntriesRequest = (function() {
    
                    /**
                     * Properties of a WriteLogEntriesRequest.
                     * @memberof google.logging.v2
                     * @interface IWriteLogEntriesRequest
                     * @property {string|null} [logName] WriteLogEntriesRequest logName
                     * @property {google.api.IMonitoredResource|null} [resource] WriteLogEntriesRequest resource
                     * @property {Object.<string,string>|null} [labels] WriteLogEntriesRequest labels
                     * @property {Array.<google.logging.v2.ILogEntry>|null} [entries] WriteLogEntriesRequest entries
                     * @property {boolean|null} [partialSuccess] WriteLogEntriesRequest partialSuccess
                     * @property {boolean|null} [dryRun] WriteLogEntriesRequest dryRun
                     */
    
                    /**
                     * Constructs a new WriteLogEntriesRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a WriteLogEntriesRequest.
                     * @implements IWriteLogEntriesRequest
                     * @constructor
                     * @param {google.logging.v2.IWriteLogEntriesRequest=} [properties] Properties to set
                     */
                    function WriteLogEntriesRequest(properties) {
                        this.labels = {};
                        this.entries = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * WriteLogEntriesRequest logName.
                     * @member {string} logName
                     * @memberof google.logging.v2.WriteLogEntriesRequest
                     * @instance
                     */
                    WriteLogEntriesRequest.prototype.logName = "";
    
                    /**
                     * WriteLogEntriesRequest resource.
                     * @member {google.api.IMonitoredResource|null|undefined} resource
                     * @memberof google.logging.v2.WriteLogEntriesRequest
                     * @instance
                     */
                    WriteLogEntriesRequest.prototype.resource = null;
    
                    /**
                     * WriteLogEntriesRequest labels.
                     * @member {Object.<string,string>} labels
                     * @memberof google.logging.v2.WriteLogEntriesRequest
                     * @instance
                     */
                    WriteLogEntriesRequest.prototype.labels = $util.emptyObject;
    
                    /**
                     * WriteLogEntriesRequest entries.
                     * @member {Array.<google.logging.v2.ILogEntry>} entries
                     * @memberof google.logging.v2.WriteLogEntriesRequest
                     * @instance
                     */
                    WriteLogEntriesRequest.prototype.entries = $util.emptyArray;
    
                    /**
                     * WriteLogEntriesRequest partialSuccess.
                     * @member {boolean} partialSuccess
                     * @memberof google.logging.v2.WriteLogEntriesRequest
                     * @instance
                     */
                    WriteLogEntriesRequest.prototype.partialSuccess = false;
    
                    /**
                     * WriteLogEntriesRequest dryRun.
                     * @member {boolean} dryRun
                     * @memberof google.logging.v2.WriteLogEntriesRequest
                     * @instance
                     */
                    WriteLogEntriesRequest.prototype.dryRun = false;
    
                    /**
                     * Creates a new WriteLogEntriesRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.WriteLogEntriesRequest
                     * @static
                     * @param {google.logging.v2.IWriteLogEntriesRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.WriteLogEntriesRequest} WriteLogEntriesRequest instance
                     */
                    WriteLogEntriesRequest.create = function create(properties) {
                        return new WriteLogEntriesRequest(properties);
                    };
    
                    /**
                     * Encodes the specified WriteLogEntriesRequest message. Does not implicitly {@link google.logging.v2.WriteLogEntriesRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.WriteLogEntriesRequest
                     * @static
                     * @param {google.logging.v2.IWriteLogEntriesRequest} message WriteLogEntriesRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    WriteLogEntriesRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.logName != null && Object.hasOwnProperty.call(message, "logName"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.logName);
                        if (message.resource != null && Object.hasOwnProperty.call(message, "resource"))
                            $root.google.api.MonitoredResource.encode(message.resource, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.labels != null && Object.hasOwnProperty.call(message, "labels"))
                            for (var keys = Object.keys(message.labels), i = 0; i < keys.length; ++i)
                                writer.uint32(/* id 3, wireType 2 =*/26).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.labels[keys[i]]).ldelim();
                        if (message.entries != null && message.entries.length)
                            for (var i = 0; i < message.entries.length; ++i)
                                $root.google.logging.v2.LogEntry.encode(message.entries[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                        if (message.partialSuccess != null && Object.hasOwnProperty.call(message, "partialSuccess"))
                            writer.uint32(/* id 5, wireType 0 =*/40).bool(message.partialSuccess);
                        if (message.dryRun != null && Object.hasOwnProperty.call(message, "dryRun"))
                            writer.uint32(/* id 6, wireType 0 =*/48).bool(message.dryRun);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified WriteLogEntriesRequest message, length delimited. Does not implicitly {@link google.logging.v2.WriteLogEntriesRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.WriteLogEntriesRequest
                     * @static
                     * @param {google.logging.v2.IWriteLogEntriesRequest} message WriteLogEntriesRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    WriteLogEntriesRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a WriteLogEntriesRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.WriteLogEntriesRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.WriteLogEntriesRequest} WriteLogEntriesRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    WriteLogEntriesRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.WriteLogEntriesRequest(), key, value;
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.logName = reader.string();
                                break;
                            case 2:
                                message.resource = $root.google.api.MonitoredResource.decode(reader, reader.uint32());
                                break;
                            case 3:
                                if (message.labels === $util.emptyObject)
                                    message.labels = {};
                                var end2 = reader.uint32() + reader.pos;
                                key = "";
                                value = "";
                                while (reader.pos < end2) {
                                    var tag2 = reader.uint32();
                                    switch (tag2 >>> 3) {
                                    case 1:
                                        key = reader.string();
                                        break;
                                    case 2:
                                        value = reader.string();
                                        break;
                                    default:
                                        reader.skipType(tag2 & 7);
                                        break;
                                    }
                                }
                                message.labels[key] = value;
                                break;
                            case 4:
                                if (!(message.entries && message.entries.length))
                                    message.entries = [];
                                message.entries.push($root.google.logging.v2.LogEntry.decode(reader, reader.uint32()));
                                break;
                            case 5:
                                message.partialSuccess = reader.bool();
                                break;
                            case 6:
                                message.dryRun = reader.bool();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a WriteLogEntriesRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.WriteLogEntriesRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.WriteLogEntriesRequest} WriteLogEntriesRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    WriteLogEntriesRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a WriteLogEntriesRequest message.
                     * @function verify
                     * @memberof google.logging.v2.WriteLogEntriesRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    WriteLogEntriesRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.logName != null && message.hasOwnProperty("logName"))
                            if (!$util.isString(message.logName))
                                return "logName: string expected";
                        if (message.resource != null && message.hasOwnProperty("resource")) {
                            var error = $root.google.api.MonitoredResource.verify(message.resource);
                            if (error)
                                return "resource." + error;
                        }
                        if (message.labels != null && message.hasOwnProperty("labels")) {
                            if (!$util.isObject(message.labels))
                                return "labels: object expected";
                            var key = Object.keys(message.labels);
                            for (var i = 0; i < key.length; ++i)
                                if (!$util.isString(message.labels[key[i]]))
                                    return "labels: string{k:string} expected";
                        }
                        if (message.entries != null && message.hasOwnProperty("entries")) {
                            if (!Array.isArray(message.entries))
                                return "entries: array expected";
                            for (var i = 0; i < message.entries.length; ++i) {
                                var error = $root.google.logging.v2.LogEntry.verify(message.entries[i]);
                                if (error)
                                    return "entries." + error;
                            }
                        }
                        if (message.partialSuccess != null && message.hasOwnProperty("partialSuccess"))
                            if (typeof message.partialSuccess !== "boolean")
                                return "partialSuccess: boolean expected";
                        if (message.dryRun != null && message.hasOwnProperty("dryRun"))
                            if (typeof message.dryRun !== "boolean")
                                return "dryRun: boolean expected";
                        return null;
                    };
    
                    /**
                     * Creates a WriteLogEntriesRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.WriteLogEntriesRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.WriteLogEntriesRequest} WriteLogEntriesRequest
                     */
                    WriteLogEntriesRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.WriteLogEntriesRequest)
                            return object;
                        var message = new $root.google.logging.v2.WriteLogEntriesRequest();
                        if (object.logName != null)
                            message.logName = String(object.logName);
                        if (object.resource != null) {
                            if (typeof object.resource !== "object")
                                throw TypeError(".google.logging.v2.WriteLogEntriesRequest.resource: object expected");
                            message.resource = $root.google.api.MonitoredResource.fromObject(object.resource);
                        }
                        if (object.labels) {
                            if (typeof object.labels !== "object")
                                throw TypeError(".google.logging.v2.WriteLogEntriesRequest.labels: object expected");
                            message.labels = {};
                            for (var keys = Object.keys(object.labels), i = 0; i < keys.length; ++i)
                                message.labels[keys[i]] = String(object.labels[keys[i]]);
                        }
                        if (object.entries) {
                            if (!Array.isArray(object.entries))
                                throw TypeError(".google.logging.v2.WriteLogEntriesRequest.entries: array expected");
                            message.entries = [];
                            for (var i = 0; i < object.entries.length; ++i) {
                                if (typeof object.entries[i] !== "object")
                                    throw TypeError(".google.logging.v2.WriteLogEntriesRequest.entries: object expected");
                                message.entries[i] = $root.google.logging.v2.LogEntry.fromObject(object.entries[i]);
                            }
                        }
                        if (object.partialSuccess != null)
                            message.partialSuccess = Boolean(object.partialSuccess);
                        if (object.dryRun != null)
                            message.dryRun = Boolean(object.dryRun);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a WriteLogEntriesRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.WriteLogEntriesRequest
                     * @static
                     * @param {google.logging.v2.WriteLogEntriesRequest} message WriteLogEntriesRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    WriteLogEntriesRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.entries = [];
                        if (options.objects || options.defaults)
                            object.labels = {};
                        if (options.defaults) {
                            object.logName = "";
                            object.resource = null;
                            object.partialSuccess = false;
                            object.dryRun = false;
                        }
                        if (message.logName != null && message.hasOwnProperty("logName"))
                            object.logName = message.logName;
                        if (message.resource != null && message.hasOwnProperty("resource"))
                            object.resource = $root.google.api.MonitoredResource.toObject(message.resource, options);
                        var keys2;
                        if (message.labels && (keys2 = Object.keys(message.labels)).length) {
                            object.labels = {};
                            for (var j = 0; j < keys2.length; ++j)
                                object.labels[keys2[j]] = message.labels[keys2[j]];
                        }
                        if (message.entries && message.entries.length) {
                            object.entries = [];
                            for (var j = 0; j < message.entries.length; ++j)
                                object.entries[j] = $root.google.logging.v2.LogEntry.toObject(message.entries[j], options);
                        }
                        if (message.partialSuccess != null && message.hasOwnProperty("partialSuccess"))
                            object.partialSuccess = message.partialSuccess;
                        if (message.dryRun != null && message.hasOwnProperty("dryRun"))
                            object.dryRun = message.dryRun;
                        return object;
                    };
    
                    /**
                     * Converts this WriteLogEntriesRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.WriteLogEntriesRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    WriteLogEntriesRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return WriteLogEntriesRequest;
                })();
    
                v2.WriteLogEntriesResponse = (function() {
    
                    /**
                     * Properties of a WriteLogEntriesResponse.
                     * @memberof google.logging.v2
                     * @interface IWriteLogEntriesResponse
                     */
    
                    /**
                     * Constructs a new WriteLogEntriesResponse.
                     * @memberof google.logging.v2
                     * @classdesc Represents a WriteLogEntriesResponse.
                     * @implements IWriteLogEntriesResponse
                     * @constructor
                     * @param {google.logging.v2.IWriteLogEntriesResponse=} [properties] Properties to set
                     */
                    function WriteLogEntriesResponse(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * Creates a new WriteLogEntriesResponse instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.WriteLogEntriesResponse
                     * @static
                     * @param {google.logging.v2.IWriteLogEntriesResponse=} [properties] Properties to set
                     * @returns {google.logging.v2.WriteLogEntriesResponse} WriteLogEntriesResponse instance
                     */
                    WriteLogEntriesResponse.create = function create(properties) {
                        return new WriteLogEntriesResponse(properties);
                    };
    
                    /**
                     * Encodes the specified WriteLogEntriesResponse message. Does not implicitly {@link google.logging.v2.WriteLogEntriesResponse.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.WriteLogEntriesResponse
                     * @static
                     * @param {google.logging.v2.IWriteLogEntriesResponse} message WriteLogEntriesResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    WriteLogEntriesResponse.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified WriteLogEntriesResponse message, length delimited. Does not implicitly {@link google.logging.v2.WriteLogEntriesResponse.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.WriteLogEntriesResponse
                     * @static
                     * @param {google.logging.v2.IWriteLogEntriesResponse} message WriteLogEntriesResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    WriteLogEntriesResponse.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a WriteLogEntriesResponse message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.WriteLogEntriesResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.WriteLogEntriesResponse} WriteLogEntriesResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    WriteLogEntriesResponse.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.WriteLogEntriesResponse();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a WriteLogEntriesResponse message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.WriteLogEntriesResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.WriteLogEntriesResponse} WriteLogEntriesResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    WriteLogEntriesResponse.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a WriteLogEntriesResponse message.
                     * @function verify
                     * @memberof google.logging.v2.WriteLogEntriesResponse
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    WriteLogEntriesResponse.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        return null;
                    };
    
                    /**
                     * Creates a WriteLogEntriesResponse message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.WriteLogEntriesResponse
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.WriteLogEntriesResponse} WriteLogEntriesResponse
                     */
                    WriteLogEntriesResponse.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.WriteLogEntriesResponse)
                            return object;
                        return new $root.google.logging.v2.WriteLogEntriesResponse();
                    };
    
                    /**
                     * Creates a plain object from a WriteLogEntriesResponse message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.WriteLogEntriesResponse
                     * @static
                     * @param {google.logging.v2.WriteLogEntriesResponse} message WriteLogEntriesResponse
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    WriteLogEntriesResponse.toObject = function toObject() {
                        return {};
                    };
    
                    /**
                     * Converts this WriteLogEntriesResponse to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.WriteLogEntriesResponse
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    WriteLogEntriesResponse.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return WriteLogEntriesResponse;
                })();
    
                v2.WriteLogEntriesPartialErrors = (function() {
    
                    /**
                     * Properties of a WriteLogEntriesPartialErrors.
                     * @memberof google.logging.v2
                     * @interface IWriteLogEntriesPartialErrors
                     * @property {Object.<string,google.rpc.IStatus>|null} [logEntryErrors] WriteLogEntriesPartialErrors logEntryErrors
                     */
    
                    /**
                     * Constructs a new WriteLogEntriesPartialErrors.
                     * @memberof google.logging.v2
                     * @classdesc Represents a WriteLogEntriesPartialErrors.
                     * @implements IWriteLogEntriesPartialErrors
                     * @constructor
                     * @param {google.logging.v2.IWriteLogEntriesPartialErrors=} [properties] Properties to set
                     */
                    function WriteLogEntriesPartialErrors(properties) {
                        this.logEntryErrors = {};
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * WriteLogEntriesPartialErrors logEntryErrors.
                     * @member {Object.<string,google.rpc.IStatus>} logEntryErrors
                     * @memberof google.logging.v2.WriteLogEntriesPartialErrors
                     * @instance
                     */
                    WriteLogEntriesPartialErrors.prototype.logEntryErrors = $util.emptyObject;
    
                    /**
                     * Creates a new WriteLogEntriesPartialErrors instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.WriteLogEntriesPartialErrors
                     * @static
                     * @param {google.logging.v2.IWriteLogEntriesPartialErrors=} [properties] Properties to set
                     * @returns {google.logging.v2.WriteLogEntriesPartialErrors} WriteLogEntriesPartialErrors instance
                     */
                    WriteLogEntriesPartialErrors.create = function create(properties) {
                        return new WriteLogEntriesPartialErrors(properties);
                    };
    
                    /**
                     * Encodes the specified WriteLogEntriesPartialErrors message. Does not implicitly {@link google.logging.v2.WriteLogEntriesPartialErrors.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.WriteLogEntriesPartialErrors
                     * @static
                     * @param {google.logging.v2.IWriteLogEntriesPartialErrors} message WriteLogEntriesPartialErrors message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    WriteLogEntriesPartialErrors.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.logEntryErrors != null && Object.hasOwnProperty.call(message, "logEntryErrors"))
                            for (var keys = Object.keys(message.logEntryErrors), i = 0; i < keys.length; ++i) {
                                writer.uint32(/* id 1, wireType 2 =*/10).fork().uint32(/* id 1, wireType 0 =*/8).int32(keys[i]);
                                $root.google.rpc.Status.encode(message.logEntryErrors[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim();
                            }
                        return writer;
                    };
    
                    /**
                     * Encodes the specified WriteLogEntriesPartialErrors message, length delimited. Does not implicitly {@link google.logging.v2.WriteLogEntriesPartialErrors.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.WriteLogEntriesPartialErrors
                     * @static
                     * @param {google.logging.v2.IWriteLogEntriesPartialErrors} message WriteLogEntriesPartialErrors message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    WriteLogEntriesPartialErrors.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a WriteLogEntriesPartialErrors message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.WriteLogEntriesPartialErrors
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.WriteLogEntriesPartialErrors} WriteLogEntriesPartialErrors
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    WriteLogEntriesPartialErrors.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.WriteLogEntriesPartialErrors(), key, value;
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                if (message.logEntryErrors === $util.emptyObject)
                                    message.logEntryErrors = {};
                                var end2 = reader.uint32() + reader.pos;
                                key = 0;
                                value = null;
                                while (reader.pos < end2) {
                                    var tag2 = reader.uint32();
                                    switch (tag2 >>> 3) {
                                    case 1:
                                        key = reader.int32();
                                        break;
                                    case 2:
                                        value = $root.google.rpc.Status.decode(reader, reader.uint32());
                                        break;
                                    default:
                                        reader.skipType(tag2 & 7);
                                        break;
                                    }
                                }
                                message.logEntryErrors[key] = value;
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a WriteLogEntriesPartialErrors message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.WriteLogEntriesPartialErrors
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.WriteLogEntriesPartialErrors} WriteLogEntriesPartialErrors
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    WriteLogEntriesPartialErrors.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a WriteLogEntriesPartialErrors message.
                     * @function verify
                     * @memberof google.logging.v2.WriteLogEntriesPartialErrors
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    WriteLogEntriesPartialErrors.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.logEntryErrors != null && message.hasOwnProperty("logEntryErrors")) {
                            if (!$util.isObject(message.logEntryErrors))
                                return "logEntryErrors: object expected";
                            var key = Object.keys(message.logEntryErrors);
                            for (var i = 0; i < key.length; ++i) {
                                if (!$util.key32Re.test(key[i]))
                                    return "logEntryErrors: integer key{k:int32} expected";
                                {
                                    var error = $root.google.rpc.Status.verify(message.logEntryErrors[key[i]]);
                                    if (error)
                                        return "logEntryErrors." + error;
                                }
                            }
                        }
                        return null;
                    };
    
                    /**
                     * Creates a WriteLogEntriesPartialErrors message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.WriteLogEntriesPartialErrors
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.WriteLogEntriesPartialErrors} WriteLogEntriesPartialErrors
                     */
                    WriteLogEntriesPartialErrors.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.WriteLogEntriesPartialErrors)
                            return object;
                        var message = new $root.google.logging.v2.WriteLogEntriesPartialErrors();
                        if (object.logEntryErrors) {
                            if (typeof object.logEntryErrors !== "object")
                                throw TypeError(".google.logging.v2.WriteLogEntriesPartialErrors.logEntryErrors: object expected");
                            message.logEntryErrors = {};
                            for (var keys = Object.keys(object.logEntryErrors), i = 0; i < keys.length; ++i) {
                                if (typeof object.logEntryErrors[keys[i]] !== "object")
                                    throw TypeError(".google.logging.v2.WriteLogEntriesPartialErrors.logEntryErrors: object expected");
                                message.logEntryErrors[keys[i]] = $root.google.rpc.Status.fromObject(object.logEntryErrors[keys[i]]);
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a WriteLogEntriesPartialErrors message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.WriteLogEntriesPartialErrors
                     * @static
                     * @param {google.logging.v2.WriteLogEntriesPartialErrors} message WriteLogEntriesPartialErrors
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    WriteLogEntriesPartialErrors.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.objects || options.defaults)
                            object.logEntryErrors = {};
                        var keys2;
                        if (message.logEntryErrors && (keys2 = Object.keys(message.logEntryErrors)).length) {
                            object.logEntryErrors = {};
                            for (var j = 0; j < keys2.length; ++j)
                                object.logEntryErrors[keys2[j]] = $root.google.rpc.Status.toObject(message.logEntryErrors[keys2[j]], options);
                        }
                        return object;
                    };
    
                    /**
                     * Converts this WriteLogEntriesPartialErrors to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.WriteLogEntriesPartialErrors
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    WriteLogEntriesPartialErrors.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return WriteLogEntriesPartialErrors;
                })();
    
                v2.ListLogEntriesRequest = (function() {
    
                    /**
                     * Properties of a ListLogEntriesRequest.
                     * @memberof google.logging.v2
                     * @interface IListLogEntriesRequest
                     * @property {Array.<string>|null} [resourceNames] ListLogEntriesRequest resourceNames
                     * @property {string|null} [filter] ListLogEntriesRequest filter
                     * @property {string|null} [orderBy] ListLogEntriesRequest orderBy
                     * @property {number|null} [pageSize] ListLogEntriesRequest pageSize
                     * @property {string|null} [pageToken] ListLogEntriesRequest pageToken
                     */
    
                    /**
                     * Constructs a new ListLogEntriesRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a ListLogEntriesRequest.
                     * @implements IListLogEntriesRequest
                     * @constructor
                     * @param {google.logging.v2.IListLogEntriesRequest=} [properties] Properties to set
                     */
                    function ListLogEntriesRequest(properties) {
                        this.resourceNames = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ListLogEntriesRequest resourceNames.
                     * @member {Array.<string>} resourceNames
                     * @memberof google.logging.v2.ListLogEntriesRequest
                     * @instance
                     */
                    ListLogEntriesRequest.prototype.resourceNames = $util.emptyArray;
    
                    /**
                     * ListLogEntriesRequest filter.
                     * @member {string} filter
                     * @memberof google.logging.v2.ListLogEntriesRequest
                     * @instance
                     */
                    ListLogEntriesRequest.prototype.filter = "";
    
                    /**
                     * ListLogEntriesRequest orderBy.
                     * @member {string} orderBy
                     * @memberof google.logging.v2.ListLogEntriesRequest
                     * @instance
                     */
                    ListLogEntriesRequest.prototype.orderBy = "";
    
                    /**
                     * ListLogEntriesRequest pageSize.
                     * @member {number} pageSize
                     * @memberof google.logging.v2.ListLogEntriesRequest
                     * @instance
                     */
                    ListLogEntriesRequest.prototype.pageSize = 0;
    
                    /**
                     * ListLogEntriesRequest pageToken.
                     * @member {string} pageToken
                     * @memberof google.logging.v2.ListLogEntriesRequest
                     * @instance
                     */
                    ListLogEntriesRequest.prototype.pageToken = "";
    
                    /**
                     * Creates a new ListLogEntriesRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.ListLogEntriesRequest
                     * @static
                     * @param {google.logging.v2.IListLogEntriesRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.ListLogEntriesRequest} ListLogEntriesRequest instance
                     */
                    ListLogEntriesRequest.create = function create(properties) {
                        return new ListLogEntriesRequest(properties);
                    };
    
                    /**
                     * Encodes the specified ListLogEntriesRequest message. Does not implicitly {@link google.logging.v2.ListLogEntriesRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.ListLogEntriesRequest
                     * @static
                     * @param {google.logging.v2.IListLogEntriesRequest} message ListLogEntriesRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListLogEntriesRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.filter != null && Object.hasOwnProperty.call(message, "filter"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.filter);
                        if (message.orderBy != null && Object.hasOwnProperty.call(message, "orderBy"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.orderBy);
                        if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                            writer.uint32(/* id 4, wireType 0 =*/32).int32(message.pageSize);
                        if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                            writer.uint32(/* id 5, wireType 2 =*/42).string(message.pageToken);
                        if (message.resourceNames != null && message.resourceNames.length)
                            for (var i = 0; i < message.resourceNames.length; ++i)
                                writer.uint32(/* id 8, wireType 2 =*/66).string(message.resourceNames[i]);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ListLogEntriesRequest message, length delimited. Does not implicitly {@link google.logging.v2.ListLogEntriesRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.ListLogEntriesRequest
                     * @static
                     * @param {google.logging.v2.IListLogEntriesRequest} message ListLogEntriesRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListLogEntriesRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ListLogEntriesRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.ListLogEntriesRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.ListLogEntriesRequest} ListLogEntriesRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListLogEntriesRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.ListLogEntriesRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 8:
                                if (!(message.resourceNames && message.resourceNames.length))
                                    message.resourceNames = [];
                                message.resourceNames.push(reader.string());
                                break;
                            case 2:
                                message.filter = reader.string();
                                break;
                            case 3:
                                message.orderBy = reader.string();
                                break;
                            case 4:
                                message.pageSize = reader.int32();
                                break;
                            case 5:
                                message.pageToken = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ListLogEntriesRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.ListLogEntriesRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.ListLogEntriesRequest} ListLogEntriesRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListLogEntriesRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ListLogEntriesRequest message.
                     * @function verify
                     * @memberof google.logging.v2.ListLogEntriesRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ListLogEntriesRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.resourceNames != null && message.hasOwnProperty("resourceNames")) {
                            if (!Array.isArray(message.resourceNames))
                                return "resourceNames: array expected";
                            for (var i = 0; i < message.resourceNames.length; ++i)
                                if (!$util.isString(message.resourceNames[i]))
                                    return "resourceNames: string[] expected";
                        }
                        if (message.filter != null && message.hasOwnProperty("filter"))
                            if (!$util.isString(message.filter))
                                return "filter: string expected";
                        if (message.orderBy != null && message.hasOwnProperty("orderBy"))
                            if (!$util.isString(message.orderBy))
                                return "orderBy: string expected";
                        if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                            if (!$util.isInteger(message.pageSize))
                                return "pageSize: integer expected";
                        if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                            if (!$util.isString(message.pageToken))
                                return "pageToken: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a ListLogEntriesRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.ListLogEntriesRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.ListLogEntriesRequest} ListLogEntriesRequest
                     */
                    ListLogEntriesRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.ListLogEntriesRequest)
                            return object;
                        var message = new $root.google.logging.v2.ListLogEntriesRequest();
                        if (object.resourceNames) {
                            if (!Array.isArray(object.resourceNames))
                                throw TypeError(".google.logging.v2.ListLogEntriesRequest.resourceNames: array expected");
                            message.resourceNames = [];
                            for (var i = 0; i < object.resourceNames.length; ++i)
                                message.resourceNames[i] = String(object.resourceNames[i]);
                        }
                        if (object.filter != null)
                            message.filter = String(object.filter);
                        if (object.orderBy != null)
                            message.orderBy = String(object.orderBy);
                        if (object.pageSize != null)
                            message.pageSize = object.pageSize | 0;
                        if (object.pageToken != null)
                            message.pageToken = String(object.pageToken);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ListLogEntriesRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.ListLogEntriesRequest
                     * @static
                     * @param {google.logging.v2.ListLogEntriesRequest} message ListLogEntriesRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ListLogEntriesRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.resourceNames = [];
                        if (options.defaults) {
                            object.filter = "";
                            object.orderBy = "";
                            object.pageSize = 0;
                            object.pageToken = "";
                        }
                        if (message.filter != null && message.hasOwnProperty("filter"))
                            object.filter = message.filter;
                        if (message.orderBy != null && message.hasOwnProperty("orderBy"))
                            object.orderBy = message.orderBy;
                        if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                            object.pageSize = message.pageSize;
                        if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                            object.pageToken = message.pageToken;
                        if (message.resourceNames && message.resourceNames.length) {
                            object.resourceNames = [];
                            for (var j = 0; j < message.resourceNames.length; ++j)
                                object.resourceNames[j] = message.resourceNames[j];
                        }
                        return object;
                    };
    
                    /**
                     * Converts this ListLogEntriesRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.ListLogEntriesRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ListLogEntriesRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return ListLogEntriesRequest;
                })();
    
                v2.ListLogEntriesResponse = (function() {
    
                    /**
                     * Properties of a ListLogEntriesResponse.
                     * @memberof google.logging.v2
                     * @interface IListLogEntriesResponse
                     * @property {Array.<google.logging.v2.ILogEntry>|null} [entries] ListLogEntriesResponse entries
                     * @property {string|null} [nextPageToken] ListLogEntriesResponse nextPageToken
                     */
    
                    /**
                     * Constructs a new ListLogEntriesResponse.
                     * @memberof google.logging.v2
                     * @classdesc Represents a ListLogEntriesResponse.
                     * @implements IListLogEntriesResponse
                     * @constructor
                     * @param {google.logging.v2.IListLogEntriesResponse=} [properties] Properties to set
                     */
                    function ListLogEntriesResponse(properties) {
                        this.entries = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ListLogEntriesResponse entries.
                     * @member {Array.<google.logging.v2.ILogEntry>} entries
                     * @memberof google.logging.v2.ListLogEntriesResponse
                     * @instance
                     */
                    ListLogEntriesResponse.prototype.entries = $util.emptyArray;
    
                    /**
                     * ListLogEntriesResponse nextPageToken.
                     * @member {string} nextPageToken
                     * @memberof google.logging.v2.ListLogEntriesResponse
                     * @instance
                     */
                    ListLogEntriesResponse.prototype.nextPageToken = "";
    
                    /**
                     * Creates a new ListLogEntriesResponse instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.ListLogEntriesResponse
                     * @static
                     * @param {google.logging.v2.IListLogEntriesResponse=} [properties] Properties to set
                     * @returns {google.logging.v2.ListLogEntriesResponse} ListLogEntriesResponse instance
                     */
                    ListLogEntriesResponse.create = function create(properties) {
                        return new ListLogEntriesResponse(properties);
                    };
    
                    /**
                     * Encodes the specified ListLogEntriesResponse message. Does not implicitly {@link google.logging.v2.ListLogEntriesResponse.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.ListLogEntriesResponse
                     * @static
                     * @param {google.logging.v2.IListLogEntriesResponse} message ListLogEntriesResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListLogEntriesResponse.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.entries != null && message.entries.length)
                            for (var i = 0; i < message.entries.length; ++i)
                                $root.google.logging.v2.LogEntry.encode(message.entries[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ListLogEntriesResponse message, length delimited. Does not implicitly {@link google.logging.v2.ListLogEntriesResponse.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.ListLogEntriesResponse
                     * @static
                     * @param {google.logging.v2.IListLogEntriesResponse} message ListLogEntriesResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListLogEntriesResponse.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ListLogEntriesResponse message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.ListLogEntriesResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.ListLogEntriesResponse} ListLogEntriesResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListLogEntriesResponse.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.ListLogEntriesResponse();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                if (!(message.entries && message.entries.length))
                                    message.entries = [];
                                message.entries.push($root.google.logging.v2.LogEntry.decode(reader, reader.uint32()));
                                break;
                            case 2:
                                message.nextPageToken = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ListLogEntriesResponse message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.ListLogEntriesResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.ListLogEntriesResponse} ListLogEntriesResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListLogEntriesResponse.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ListLogEntriesResponse message.
                     * @function verify
                     * @memberof google.logging.v2.ListLogEntriesResponse
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ListLogEntriesResponse.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.entries != null && message.hasOwnProperty("entries")) {
                            if (!Array.isArray(message.entries))
                                return "entries: array expected";
                            for (var i = 0; i < message.entries.length; ++i) {
                                var error = $root.google.logging.v2.LogEntry.verify(message.entries[i]);
                                if (error)
                                    return "entries." + error;
                            }
                        }
                        if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                            if (!$util.isString(message.nextPageToken))
                                return "nextPageToken: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a ListLogEntriesResponse message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.ListLogEntriesResponse
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.ListLogEntriesResponse} ListLogEntriesResponse
                     */
                    ListLogEntriesResponse.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.ListLogEntriesResponse)
                            return object;
                        var message = new $root.google.logging.v2.ListLogEntriesResponse();
                        if (object.entries) {
                            if (!Array.isArray(object.entries))
                                throw TypeError(".google.logging.v2.ListLogEntriesResponse.entries: array expected");
                            message.entries = [];
                            for (var i = 0; i < object.entries.length; ++i) {
                                if (typeof object.entries[i] !== "object")
                                    throw TypeError(".google.logging.v2.ListLogEntriesResponse.entries: object expected");
                                message.entries[i] = $root.google.logging.v2.LogEntry.fromObject(object.entries[i]);
                            }
                        }
                        if (object.nextPageToken != null)
                            message.nextPageToken = String(object.nextPageToken);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ListLogEntriesResponse message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.ListLogEntriesResponse
                     * @static
                     * @param {google.logging.v2.ListLogEntriesResponse} message ListLogEntriesResponse
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ListLogEntriesResponse.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.entries = [];
                        if (options.defaults)
                            object.nextPageToken = "";
                        if (message.entries && message.entries.length) {
                            object.entries = [];
                            for (var j = 0; j < message.entries.length; ++j)
                                object.entries[j] = $root.google.logging.v2.LogEntry.toObject(message.entries[j], options);
                        }
                        if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                            object.nextPageToken = message.nextPageToken;
                        return object;
                    };
    
                    /**
                     * Converts this ListLogEntriesResponse to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.ListLogEntriesResponse
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ListLogEntriesResponse.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return ListLogEntriesResponse;
                })();
    
                v2.ListMonitoredResourceDescriptorsRequest = (function() {
    
                    /**
                     * Properties of a ListMonitoredResourceDescriptorsRequest.
                     * @memberof google.logging.v2
                     * @interface IListMonitoredResourceDescriptorsRequest
                     * @property {number|null} [pageSize] ListMonitoredResourceDescriptorsRequest pageSize
                     * @property {string|null} [pageToken] ListMonitoredResourceDescriptorsRequest pageToken
                     */
    
                    /**
                     * Constructs a new ListMonitoredResourceDescriptorsRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a ListMonitoredResourceDescriptorsRequest.
                     * @implements IListMonitoredResourceDescriptorsRequest
                     * @constructor
                     * @param {google.logging.v2.IListMonitoredResourceDescriptorsRequest=} [properties] Properties to set
                     */
                    function ListMonitoredResourceDescriptorsRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ListMonitoredResourceDescriptorsRequest pageSize.
                     * @member {number} pageSize
                     * @memberof google.logging.v2.ListMonitoredResourceDescriptorsRequest
                     * @instance
                     */
                    ListMonitoredResourceDescriptorsRequest.prototype.pageSize = 0;
    
                    /**
                     * ListMonitoredResourceDescriptorsRequest pageToken.
                     * @member {string} pageToken
                     * @memberof google.logging.v2.ListMonitoredResourceDescriptorsRequest
                     * @instance
                     */
                    ListMonitoredResourceDescriptorsRequest.prototype.pageToken = "";
    
                    /**
                     * Creates a new ListMonitoredResourceDescriptorsRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.ListMonitoredResourceDescriptorsRequest
                     * @static
                     * @param {google.logging.v2.IListMonitoredResourceDescriptorsRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.ListMonitoredResourceDescriptorsRequest} ListMonitoredResourceDescriptorsRequest instance
                     */
                    ListMonitoredResourceDescriptorsRequest.create = function create(properties) {
                        return new ListMonitoredResourceDescriptorsRequest(properties);
                    };
    
                    /**
                     * Encodes the specified ListMonitoredResourceDescriptorsRequest message. Does not implicitly {@link google.logging.v2.ListMonitoredResourceDescriptorsRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.ListMonitoredResourceDescriptorsRequest
                     * @static
                     * @param {google.logging.v2.IListMonitoredResourceDescriptorsRequest} message ListMonitoredResourceDescriptorsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListMonitoredResourceDescriptorsRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                            writer.uint32(/* id 1, wireType 0 =*/8).int32(message.pageSize);
                        if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.pageToken);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ListMonitoredResourceDescriptorsRequest message, length delimited. Does not implicitly {@link google.logging.v2.ListMonitoredResourceDescriptorsRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.ListMonitoredResourceDescriptorsRequest
                     * @static
                     * @param {google.logging.v2.IListMonitoredResourceDescriptorsRequest} message ListMonitoredResourceDescriptorsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListMonitoredResourceDescriptorsRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ListMonitoredResourceDescriptorsRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.ListMonitoredResourceDescriptorsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.ListMonitoredResourceDescriptorsRequest} ListMonitoredResourceDescriptorsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListMonitoredResourceDescriptorsRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.ListMonitoredResourceDescriptorsRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.pageSize = reader.int32();
                                break;
                            case 2:
                                message.pageToken = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ListMonitoredResourceDescriptorsRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.ListMonitoredResourceDescriptorsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.ListMonitoredResourceDescriptorsRequest} ListMonitoredResourceDescriptorsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListMonitoredResourceDescriptorsRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ListMonitoredResourceDescriptorsRequest message.
                     * @function verify
                     * @memberof google.logging.v2.ListMonitoredResourceDescriptorsRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ListMonitoredResourceDescriptorsRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                            if (!$util.isInteger(message.pageSize))
                                return "pageSize: integer expected";
                        if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                            if (!$util.isString(message.pageToken))
                                return "pageToken: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a ListMonitoredResourceDescriptorsRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.ListMonitoredResourceDescriptorsRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.ListMonitoredResourceDescriptorsRequest} ListMonitoredResourceDescriptorsRequest
                     */
                    ListMonitoredResourceDescriptorsRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.ListMonitoredResourceDescriptorsRequest)
                            return object;
                        var message = new $root.google.logging.v2.ListMonitoredResourceDescriptorsRequest();
                        if (object.pageSize != null)
                            message.pageSize = object.pageSize | 0;
                        if (object.pageToken != null)
                            message.pageToken = String(object.pageToken);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ListMonitoredResourceDescriptorsRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.ListMonitoredResourceDescriptorsRequest
                     * @static
                     * @param {google.logging.v2.ListMonitoredResourceDescriptorsRequest} message ListMonitoredResourceDescriptorsRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ListMonitoredResourceDescriptorsRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.pageSize = 0;
                            object.pageToken = "";
                        }
                        if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                            object.pageSize = message.pageSize;
                        if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                            object.pageToken = message.pageToken;
                        return object;
                    };
    
                    /**
                     * Converts this ListMonitoredResourceDescriptorsRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.ListMonitoredResourceDescriptorsRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ListMonitoredResourceDescriptorsRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return ListMonitoredResourceDescriptorsRequest;
                })();
    
                v2.ListMonitoredResourceDescriptorsResponse = (function() {
    
                    /**
                     * Properties of a ListMonitoredResourceDescriptorsResponse.
                     * @memberof google.logging.v2
                     * @interface IListMonitoredResourceDescriptorsResponse
                     * @property {Array.<google.api.IMonitoredResourceDescriptor>|null} [resourceDescriptors] ListMonitoredResourceDescriptorsResponse resourceDescriptors
                     * @property {string|null} [nextPageToken] ListMonitoredResourceDescriptorsResponse nextPageToken
                     */
    
                    /**
                     * Constructs a new ListMonitoredResourceDescriptorsResponse.
                     * @memberof google.logging.v2
                     * @classdesc Represents a ListMonitoredResourceDescriptorsResponse.
                     * @implements IListMonitoredResourceDescriptorsResponse
                     * @constructor
                     * @param {google.logging.v2.IListMonitoredResourceDescriptorsResponse=} [properties] Properties to set
                     */
                    function ListMonitoredResourceDescriptorsResponse(properties) {
                        this.resourceDescriptors = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ListMonitoredResourceDescriptorsResponse resourceDescriptors.
                     * @member {Array.<google.api.IMonitoredResourceDescriptor>} resourceDescriptors
                     * @memberof google.logging.v2.ListMonitoredResourceDescriptorsResponse
                     * @instance
                     */
                    ListMonitoredResourceDescriptorsResponse.prototype.resourceDescriptors = $util.emptyArray;
    
                    /**
                     * ListMonitoredResourceDescriptorsResponse nextPageToken.
                     * @member {string} nextPageToken
                     * @memberof google.logging.v2.ListMonitoredResourceDescriptorsResponse
                     * @instance
                     */
                    ListMonitoredResourceDescriptorsResponse.prototype.nextPageToken = "";
    
                    /**
                     * Creates a new ListMonitoredResourceDescriptorsResponse instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.ListMonitoredResourceDescriptorsResponse
                     * @static
                     * @param {google.logging.v2.IListMonitoredResourceDescriptorsResponse=} [properties] Properties to set
                     * @returns {google.logging.v2.ListMonitoredResourceDescriptorsResponse} ListMonitoredResourceDescriptorsResponse instance
                     */
                    ListMonitoredResourceDescriptorsResponse.create = function create(properties) {
                        return new ListMonitoredResourceDescriptorsResponse(properties);
                    };
    
                    /**
                     * Encodes the specified ListMonitoredResourceDescriptorsResponse message. Does not implicitly {@link google.logging.v2.ListMonitoredResourceDescriptorsResponse.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.ListMonitoredResourceDescriptorsResponse
                     * @static
                     * @param {google.logging.v2.IListMonitoredResourceDescriptorsResponse} message ListMonitoredResourceDescriptorsResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListMonitoredResourceDescriptorsResponse.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.resourceDescriptors != null && message.resourceDescriptors.length)
                            for (var i = 0; i < message.resourceDescriptors.length; ++i)
                                $root.google.api.MonitoredResourceDescriptor.encode(message.resourceDescriptors[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ListMonitoredResourceDescriptorsResponse message, length delimited. Does not implicitly {@link google.logging.v2.ListMonitoredResourceDescriptorsResponse.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.ListMonitoredResourceDescriptorsResponse
                     * @static
                     * @param {google.logging.v2.IListMonitoredResourceDescriptorsResponse} message ListMonitoredResourceDescriptorsResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListMonitoredResourceDescriptorsResponse.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ListMonitoredResourceDescriptorsResponse message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.ListMonitoredResourceDescriptorsResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.ListMonitoredResourceDescriptorsResponse} ListMonitoredResourceDescriptorsResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListMonitoredResourceDescriptorsResponse.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.ListMonitoredResourceDescriptorsResponse();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                if (!(message.resourceDescriptors && message.resourceDescriptors.length))
                                    message.resourceDescriptors = [];
                                message.resourceDescriptors.push($root.google.api.MonitoredResourceDescriptor.decode(reader, reader.uint32()));
                                break;
                            case 2:
                                message.nextPageToken = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ListMonitoredResourceDescriptorsResponse message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.ListMonitoredResourceDescriptorsResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.ListMonitoredResourceDescriptorsResponse} ListMonitoredResourceDescriptorsResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListMonitoredResourceDescriptorsResponse.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ListMonitoredResourceDescriptorsResponse message.
                     * @function verify
                     * @memberof google.logging.v2.ListMonitoredResourceDescriptorsResponse
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ListMonitoredResourceDescriptorsResponse.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.resourceDescriptors != null && message.hasOwnProperty("resourceDescriptors")) {
                            if (!Array.isArray(message.resourceDescriptors))
                                return "resourceDescriptors: array expected";
                            for (var i = 0; i < message.resourceDescriptors.length; ++i) {
                                var error = $root.google.api.MonitoredResourceDescriptor.verify(message.resourceDescriptors[i]);
                                if (error)
                                    return "resourceDescriptors." + error;
                            }
                        }
                        if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                            if (!$util.isString(message.nextPageToken))
                                return "nextPageToken: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a ListMonitoredResourceDescriptorsResponse message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.ListMonitoredResourceDescriptorsResponse
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.ListMonitoredResourceDescriptorsResponse} ListMonitoredResourceDescriptorsResponse
                     */
                    ListMonitoredResourceDescriptorsResponse.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.ListMonitoredResourceDescriptorsResponse)
                            return object;
                        var message = new $root.google.logging.v2.ListMonitoredResourceDescriptorsResponse();
                        if (object.resourceDescriptors) {
                            if (!Array.isArray(object.resourceDescriptors))
                                throw TypeError(".google.logging.v2.ListMonitoredResourceDescriptorsResponse.resourceDescriptors: array expected");
                            message.resourceDescriptors = [];
                            for (var i = 0; i < object.resourceDescriptors.length; ++i) {
                                if (typeof object.resourceDescriptors[i] !== "object")
                                    throw TypeError(".google.logging.v2.ListMonitoredResourceDescriptorsResponse.resourceDescriptors: object expected");
                                message.resourceDescriptors[i] = $root.google.api.MonitoredResourceDescriptor.fromObject(object.resourceDescriptors[i]);
                            }
                        }
                        if (object.nextPageToken != null)
                            message.nextPageToken = String(object.nextPageToken);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ListMonitoredResourceDescriptorsResponse message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.ListMonitoredResourceDescriptorsResponse
                     * @static
                     * @param {google.logging.v2.ListMonitoredResourceDescriptorsResponse} message ListMonitoredResourceDescriptorsResponse
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ListMonitoredResourceDescriptorsResponse.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.resourceDescriptors = [];
                        if (options.defaults)
                            object.nextPageToken = "";
                        if (message.resourceDescriptors && message.resourceDescriptors.length) {
                            object.resourceDescriptors = [];
                            for (var j = 0; j < message.resourceDescriptors.length; ++j)
                                object.resourceDescriptors[j] = $root.google.api.MonitoredResourceDescriptor.toObject(message.resourceDescriptors[j], options);
                        }
                        if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                            object.nextPageToken = message.nextPageToken;
                        return object;
                    };
    
                    /**
                     * Converts this ListMonitoredResourceDescriptorsResponse to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.ListMonitoredResourceDescriptorsResponse
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ListMonitoredResourceDescriptorsResponse.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return ListMonitoredResourceDescriptorsResponse;
                })();
    
                v2.ListLogsRequest = (function() {
    
                    /**
                     * Properties of a ListLogsRequest.
                     * @memberof google.logging.v2
                     * @interface IListLogsRequest
                     * @property {string|null} [parent] ListLogsRequest parent
                     * @property {number|null} [pageSize] ListLogsRequest pageSize
                     * @property {string|null} [pageToken] ListLogsRequest pageToken
                     * @property {Array.<string>|null} [resourceNames] ListLogsRequest resourceNames
                     */
    
                    /**
                     * Constructs a new ListLogsRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a ListLogsRequest.
                     * @implements IListLogsRequest
                     * @constructor
                     * @param {google.logging.v2.IListLogsRequest=} [properties] Properties to set
                     */
                    function ListLogsRequest(properties) {
                        this.resourceNames = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ListLogsRequest parent.
                     * @member {string} parent
                     * @memberof google.logging.v2.ListLogsRequest
                     * @instance
                     */
                    ListLogsRequest.prototype.parent = "";
    
                    /**
                     * ListLogsRequest pageSize.
                     * @member {number} pageSize
                     * @memberof google.logging.v2.ListLogsRequest
                     * @instance
                     */
                    ListLogsRequest.prototype.pageSize = 0;
    
                    /**
                     * ListLogsRequest pageToken.
                     * @member {string} pageToken
                     * @memberof google.logging.v2.ListLogsRequest
                     * @instance
                     */
                    ListLogsRequest.prototype.pageToken = "";
    
                    /**
                     * ListLogsRequest resourceNames.
                     * @member {Array.<string>} resourceNames
                     * @memberof google.logging.v2.ListLogsRequest
                     * @instance
                     */
                    ListLogsRequest.prototype.resourceNames = $util.emptyArray;
    
                    /**
                     * Creates a new ListLogsRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.ListLogsRequest
                     * @static
                     * @param {google.logging.v2.IListLogsRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.ListLogsRequest} ListLogsRequest instance
                     */
                    ListLogsRequest.create = function create(properties) {
                        return new ListLogsRequest(properties);
                    };
    
                    /**
                     * Encodes the specified ListLogsRequest message. Does not implicitly {@link google.logging.v2.ListLogsRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.ListLogsRequest
                     * @static
                     * @param {google.logging.v2.IListLogsRequest} message ListLogsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListLogsRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                        if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                            writer.uint32(/* id 2, wireType 0 =*/16).int32(message.pageSize);
                        if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.pageToken);
                        if (message.resourceNames != null && message.resourceNames.length)
                            for (var i = 0; i < message.resourceNames.length; ++i)
                                writer.uint32(/* id 8, wireType 2 =*/66).string(message.resourceNames[i]);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ListLogsRequest message, length delimited. Does not implicitly {@link google.logging.v2.ListLogsRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.ListLogsRequest
                     * @static
                     * @param {google.logging.v2.IListLogsRequest} message ListLogsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListLogsRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ListLogsRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.ListLogsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.ListLogsRequest} ListLogsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListLogsRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.ListLogsRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.parent = reader.string();
                                break;
                            case 2:
                                message.pageSize = reader.int32();
                                break;
                            case 3:
                                message.pageToken = reader.string();
                                break;
                            case 8:
                                if (!(message.resourceNames && message.resourceNames.length))
                                    message.resourceNames = [];
                                message.resourceNames.push(reader.string());
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ListLogsRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.ListLogsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.ListLogsRequest} ListLogsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListLogsRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ListLogsRequest message.
                     * @function verify
                     * @memberof google.logging.v2.ListLogsRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ListLogsRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.parent != null && message.hasOwnProperty("parent"))
                            if (!$util.isString(message.parent))
                                return "parent: string expected";
                        if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                            if (!$util.isInteger(message.pageSize))
                                return "pageSize: integer expected";
                        if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                            if (!$util.isString(message.pageToken))
                                return "pageToken: string expected";
                        if (message.resourceNames != null && message.hasOwnProperty("resourceNames")) {
                            if (!Array.isArray(message.resourceNames))
                                return "resourceNames: array expected";
                            for (var i = 0; i < message.resourceNames.length; ++i)
                                if (!$util.isString(message.resourceNames[i]))
                                    return "resourceNames: string[] expected";
                        }
                        return null;
                    };
    
                    /**
                     * Creates a ListLogsRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.ListLogsRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.ListLogsRequest} ListLogsRequest
                     */
                    ListLogsRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.ListLogsRequest)
                            return object;
                        var message = new $root.google.logging.v2.ListLogsRequest();
                        if (object.parent != null)
                            message.parent = String(object.parent);
                        if (object.pageSize != null)
                            message.pageSize = object.pageSize | 0;
                        if (object.pageToken != null)
                            message.pageToken = String(object.pageToken);
                        if (object.resourceNames) {
                            if (!Array.isArray(object.resourceNames))
                                throw TypeError(".google.logging.v2.ListLogsRequest.resourceNames: array expected");
                            message.resourceNames = [];
                            for (var i = 0; i < object.resourceNames.length; ++i)
                                message.resourceNames[i] = String(object.resourceNames[i]);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ListLogsRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.ListLogsRequest
                     * @static
                     * @param {google.logging.v2.ListLogsRequest} message ListLogsRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ListLogsRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.resourceNames = [];
                        if (options.defaults) {
                            object.parent = "";
                            object.pageSize = 0;
                            object.pageToken = "";
                        }
                        if (message.parent != null && message.hasOwnProperty("parent"))
                            object.parent = message.parent;
                        if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                            object.pageSize = message.pageSize;
                        if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                            object.pageToken = message.pageToken;
                        if (message.resourceNames && message.resourceNames.length) {
                            object.resourceNames = [];
                            for (var j = 0; j < message.resourceNames.length; ++j)
                                object.resourceNames[j] = message.resourceNames[j];
                        }
                        return object;
                    };
    
                    /**
                     * Converts this ListLogsRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.ListLogsRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ListLogsRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return ListLogsRequest;
                })();
    
                v2.ListLogsResponse = (function() {
    
                    /**
                     * Properties of a ListLogsResponse.
                     * @memberof google.logging.v2
                     * @interface IListLogsResponse
                     * @property {Array.<string>|null} [logNames] ListLogsResponse logNames
                     * @property {string|null} [nextPageToken] ListLogsResponse nextPageToken
                     */
    
                    /**
                     * Constructs a new ListLogsResponse.
                     * @memberof google.logging.v2
                     * @classdesc Represents a ListLogsResponse.
                     * @implements IListLogsResponse
                     * @constructor
                     * @param {google.logging.v2.IListLogsResponse=} [properties] Properties to set
                     */
                    function ListLogsResponse(properties) {
                        this.logNames = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ListLogsResponse logNames.
                     * @member {Array.<string>} logNames
                     * @memberof google.logging.v2.ListLogsResponse
                     * @instance
                     */
                    ListLogsResponse.prototype.logNames = $util.emptyArray;
    
                    /**
                     * ListLogsResponse nextPageToken.
                     * @member {string} nextPageToken
                     * @memberof google.logging.v2.ListLogsResponse
                     * @instance
                     */
                    ListLogsResponse.prototype.nextPageToken = "";
    
                    /**
                     * Creates a new ListLogsResponse instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.ListLogsResponse
                     * @static
                     * @param {google.logging.v2.IListLogsResponse=} [properties] Properties to set
                     * @returns {google.logging.v2.ListLogsResponse} ListLogsResponse instance
                     */
                    ListLogsResponse.create = function create(properties) {
                        return new ListLogsResponse(properties);
                    };
    
                    /**
                     * Encodes the specified ListLogsResponse message. Does not implicitly {@link google.logging.v2.ListLogsResponse.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.ListLogsResponse
                     * @static
                     * @param {google.logging.v2.IListLogsResponse} message ListLogsResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListLogsResponse.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                        if (message.logNames != null && message.logNames.length)
                            for (var i = 0; i < message.logNames.length; ++i)
                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.logNames[i]);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ListLogsResponse message, length delimited. Does not implicitly {@link google.logging.v2.ListLogsResponse.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.ListLogsResponse
                     * @static
                     * @param {google.logging.v2.IListLogsResponse} message ListLogsResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListLogsResponse.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ListLogsResponse message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.ListLogsResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.ListLogsResponse} ListLogsResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListLogsResponse.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.ListLogsResponse();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 3:
                                if (!(message.logNames && message.logNames.length))
                                    message.logNames = [];
                                message.logNames.push(reader.string());
                                break;
                            case 2:
                                message.nextPageToken = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ListLogsResponse message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.ListLogsResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.ListLogsResponse} ListLogsResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListLogsResponse.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ListLogsResponse message.
                     * @function verify
                     * @memberof google.logging.v2.ListLogsResponse
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ListLogsResponse.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.logNames != null && message.hasOwnProperty("logNames")) {
                            if (!Array.isArray(message.logNames))
                                return "logNames: array expected";
                            for (var i = 0; i < message.logNames.length; ++i)
                                if (!$util.isString(message.logNames[i]))
                                    return "logNames: string[] expected";
                        }
                        if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                            if (!$util.isString(message.nextPageToken))
                                return "nextPageToken: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a ListLogsResponse message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.ListLogsResponse
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.ListLogsResponse} ListLogsResponse
                     */
                    ListLogsResponse.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.ListLogsResponse)
                            return object;
                        var message = new $root.google.logging.v2.ListLogsResponse();
                        if (object.logNames) {
                            if (!Array.isArray(object.logNames))
                                throw TypeError(".google.logging.v2.ListLogsResponse.logNames: array expected");
                            message.logNames = [];
                            for (var i = 0; i < object.logNames.length; ++i)
                                message.logNames[i] = String(object.logNames[i]);
                        }
                        if (object.nextPageToken != null)
                            message.nextPageToken = String(object.nextPageToken);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ListLogsResponse message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.ListLogsResponse
                     * @static
                     * @param {google.logging.v2.ListLogsResponse} message ListLogsResponse
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ListLogsResponse.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.logNames = [];
                        if (options.defaults)
                            object.nextPageToken = "";
                        if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                            object.nextPageToken = message.nextPageToken;
                        if (message.logNames && message.logNames.length) {
                            object.logNames = [];
                            for (var j = 0; j < message.logNames.length; ++j)
                                object.logNames[j] = message.logNames[j];
                        }
                        return object;
                    };
    
                    /**
                     * Converts this ListLogsResponse to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.ListLogsResponse
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ListLogsResponse.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return ListLogsResponse;
                })();
    
                v2.TailLogEntriesRequest = (function() {
    
                    /**
                     * Properties of a TailLogEntriesRequest.
                     * @memberof google.logging.v2
                     * @interface ITailLogEntriesRequest
                     * @property {Array.<string>|null} [resourceNames] TailLogEntriesRequest resourceNames
                     * @property {string|null} [filter] TailLogEntriesRequest filter
                     * @property {google.protobuf.IDuration|null} [bufferWindow] TailLogEntriesRequest bufferWindow
                     */
    
                    /**
                     * Constructs a new TailLogEntriesRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a TailLogEntriesRequest.
                     * @implements ITailLogEntriesRequest
                     * @constructor
                     * @param {google.logging.v2.ITailLogEntriesRequest=} [properties] Properties to set
                     */
                    function TailLogEntriesRequest(properties) {
                        this.resourceNames = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * TailLogEntriesRequest resourceNames.
                     * @member {Array.<string>} resourceNames
                     * @memberof google.logging.v2.TailLogEntriesRequest
                     * @instance
                     */
                    TailLogEntriesRequest.prototype.resourceNames = $util.emptyArray;
    
                    /**
                     * TailLogEntriesRequest filter.
                     * @member {string} filter
                     * @memberof google.logging.v2.TailLogEntriesRequest
                     * @instance
                     */
                    TailLogEntriesRequest.prototype.filter = "";
    
                    /**
                     * TailLogEntriesRequest bufferWindow.
                     * @member {google.protobuf.IDuration|null|undefined} bufferWindow
                     * @memberof google.logging.v2.TailLogEntriesRequest
                     * @instance
                     */
                    TailLogEntriesRequest.prototype.bufferWindow = null;
    
                    /**
                     * Creates a new TailLogEntriesRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.TailLogEntriesRequest
                     * @static
                     * @param {google.logging.v2.ITailLogEntriesRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.TailLogEntriesRequest} TailLogEntriesRequest instance
                     */
                    TailLogEntriesRequest.create = function create(properties) {
                        return new TailLogEntriesRequest(properties);
                    };
    
                    /**
                     * Encodes the specified TailLogEntriesRequest message. Does not implicitly {@link google.logging.v2.TailLogEntriesRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.TailLogEntriesRequest
                     * @static
                     * @param {google.logging.v2.ITailLogEntriesRequest} message TailLogEntriesRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    TailLogEntriesRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.resourceNames != null && message.resourceNames.length)
                            for (var i = 0; i < message.resourceNames.length; ++i)
                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.resourceNames[i]);
                        if (message.filter != null && Object.hasOwnProperty.call(message, "filter"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.filter);
                        if (message.bufferWindow != null && Object.hasOwnProperty.call(message, "bufferWindow"))
                            $root.google.protobuf.Duration.encode(message.bufferWindow, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified TailLogEntriesRequest message, length delimited. Does not implicitly {@link google.logging.v2.TailLogEntriesRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.TailLogEntriesRequest
                     * @static
                     * @param {google.logging.v2.ITailLogEntriesRequest} message TailLogEntriesRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    TailLogEntriesRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a TailLogEntriesRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.TailLogEntriesRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.TailLogEntriesRequest} TailLogEntriesRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    TailLogEntriesRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.TailLogEntriesRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                if (!(message.resourceNames && message.resourceNames.length))
                                    message.resourceNames = [];
                                message.resourceNames.push(reader.string());
                                break;
                            case 2:
                                message.filter = reader.string();
                                break;
                            case 3:
                                message.bufferWindow = $root.google.protobuf.Duration.decode(reader, reader.uint32());
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a TailLogEntriesRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.TailLogEntriesRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.TailLogEntriesRequest} TailLogEntriesRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    TailLogEntriesRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a TailLogEntriesRequest message.
                     * @function verify
                     * @memberof google.logging.v2.TailLogEntriesRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    TailLogEntriesRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.resourceNames != null && message.hasOwnProperty("resourceNames")) {
                            if (!Array.isArray(message.resourceNames))
                                return "resourceNames: array expected";
                            for (var i = 0; i < message.resourceNames.length; ++i)
                                if (!$util.isString(message.resourceNames[i]))
                                    return "resourceNames: string[] expected";
                        }
                        if (message.filter != null && message.hasOwnProperty("filter"))
                            if (!$util.isString(message.filter))
                                return "filter: string expected";
                        if (message.bufferWindow != null && message.hasOwnProperty("bufferWindow")) {
                            var error = $root.google.protobuf.Duration.verify(message.bufferWindow);
                            if (error)
                                return "bufferWindow." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a TailLogEntriesRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.TailLogEntriesRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.TailLogEntriesRequest} TailLogEntriesRequest
                     */
                    TailLogEntriesRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.TailLogEntriesRequest)
                            return object;
                        var message = new $root.google.logging.v2.TailLogEntriesRequest();
                        if (object.resourceNames) {
                            if (!Array.isArray(object.resourceNames))
                                throw TypeError(".google.logging.v2.TailLogEntriesRequest.resourceNames: array expected");
                            message.resourceNames = [];
                            for (var i = 0; i < object.resourceNames.length; ++i)
                                message.resourceNames[i] = String(object.resourceNames[i]);
                        }
                        if (object.filter != null)
                            message.filter = String(object.filter);
                        if (object.bufferWindow != null) {
                            if (typeof object.bufferWindow !== "object")
                                throw TypeError(".google.logging.v2.TailLogEntriesRequest.bufferWindow: object expected");
                            message.bufferWindow = $root.google.protobuf.Duration.fromObject(object.bufferWindow);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a TailLogEntriesRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.TailLogEntriesRequest
                     * @static
                     * @param {google.logging.v2.TailLogEntriesRequest} message TailLogEntriesRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    TailLogEntriesRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.resourceNames = [];
                        if (options.defaults) {
                            object.filter = "";
                            object.bufferWindow = null;
                        }
                        if (message.resourceNames && message.resourceNames.length) {
                            object.resourceNames = [];
                            for (var j = 0; j < message.resourceNames.length; ++j)
                                object.resourceNames[j] = message.resourceNames[j];
                        }
                        if (message.filter != null && message.hasOwnProperty("filter"))
                            object.filter = message.filter;
                        if (message.bufferWindow != null && message.hasOwnProperty("bufferWindow"))
                            object.bufferWindow = $root.google.protobuf.Duration.toObject(message.bufferWindow, options);
                        return object;
                    };
    
                    /**
                     * Converts this TailLogEntriesRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.TailLogEntriesRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    TailLogEntriesRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return TailLogEntriesRequest;
                })();
    
                v2.TailLogEntriesResponse = (function() {
    
                    /**
                     * Properties of a TailLogEntriesResponse.
                     * @memberof google.logging.v2
                     * @interface ITailLogEntriesResponse
                     * @property {Array.<google.logging.v2.ILogEntry>|null} [entries] TailLogEntriesResponse entries
                     * @property {Array.<google.logging.v2.TailLogEntriesResponse.ISuppressionInfo>|null} [suppressionInfo] TailLogEntriesResponse suppressionInfo
                     */
    
                    /**
                     * Constructs a new TailLogEntriesResponse.
                     * @memberof google.logging.v2
                     * @classdesc Represents a TailLogEntriesResponse.
                     * @implements ITailLogEntriesResponse
                     * @constructor
                     * @param {google.logging.v2.ITailLogEntriesResponse=} [properties] Properties to set
                     */
                    function TailLogEntriesResponse(properties) {
                        this.entries = [];
                        this.suppressionInfo = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * TailLogEntriesResponse entries.
                     * @member {Array.<google.logging.v2.ILogEntry>} entries
                     * @memberof google.logging.v2.TailLogEntriesResponse
                     * @instance
                     */
                    TailLogEntriesResponse.prototype.entries = $util.emptyArray;
    
                    /**
                     * TailLogEntriesResponse suppressionInfo.
                     * @member {Array.<google.logging.v2.TailLogEntriesResponse.ISuppressionInfo>} suppressionInfo
                     * @memberof google.logging.v2.TailLogEntriesResponse
                     * @instance
                     */
                    TailLogEntriesResponse.prototype.suppressionInfo = $util.emptyArray;
    
                    /**
                     * Creates a new TailLogEntriesResponse instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.TailLogEntriesResponse
                     * @static
                     * @param {google.logging.v2.ITailLogEntriesResponse=} [properties] Properties to set
                     * @returns {google.logging.v2.TailLogEntriesResponse} TailLogEntriesResponse instance
                     */
                    TailLogEntriesResponse.create = function create(properties) {
                        return new TailLogEntriesResponse(properties);
                    };
    
                    /**
                     * Encodes the specified TailLogEntriesResponse message. Does not implicitly {@link google.logging.v2.TailLogEntriesResponse.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.TailLogEntriesResponse
                     * @static
                     * @param {google.logging.v2.ITailLogEntriesResponse} message TailLogEntriesResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    TailLogEntriesResponse.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.entries != null && message.entries.length)
                            for (var i = 0; i < message.entries.length; ++i)
                                $root.google.logging.v2.LogEntry.encode(message.entries[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.suppressionInfo != null && message.suppressionInfo.length)
                            for (var i = 0; i < message.suppressionInfo.length; ++i)
                                $root.google.logging.v2.TailLogEntriesResponse.SuppressionInfo.encode(message.suppressionInfo[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified TailLogEntriesResponse message, length delimited. Does not implicitly {@link google.logging.v2.TailLogEntriesResponse.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.TailLogEntriesResponse
                     * @static
                     * @param {google.logging.v2.ITailLogEntriesResponse} message TailLogEntriesResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    TailLogEntriesResponse.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a TailLogEntriesResponse message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.TailLogEntriesResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.TailLogEntriesResponse} TailLogEntriesResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    TailLogEntriesResponse.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.TailLogEntriesResponse();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                if (!(message.entries && message.entries.length))
                                    message.entries = [];
                                message.entries.push($root.google.logging.v2.LogEntry.decode(reader, reader.uint32()));
                                break;
                            case 2:
                                if (!(message.suppressionInfo && message.suppressionInfo.length))
                                    message.suppressionInfo = [];
                                message.suppressionInfo.push($root.google.logging.v2.TailLogEntriesResponse.SuppressionInfo.decode(reader, reader.uint32()));
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a TailLogEntriesResponse message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.TailLogEntriesResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.TailLogEntriesResponse} TailLogEntriesResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    TailLogEntriesResponse.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a TailLogEntriesResponse message.
                     * @function verify
                     * @memberof google.logging.v2.TailLogEntriesResponse
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    TailLogEntriesResponse.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.entries != null && message.hasOwnProperty("entries")) {
                            if (!Array.isArray(message.entries))
                                return "entries: array expected";
                            for (var i = 0; i < message.entries.length; ++i) {
                                var error = $root.google.logging.v2.LogEntry.verify(message.entries[i]);
                                if (error)
                                    return "entries." + error;
                            }
                        }
                        if (message.suppressionInfo != null && message.hasOwnProperty("suppressionInfo")) {
                            if (!Array.isArray(message.suppressionInfo))
                                return "suppressionInfo: array expected";
                            for (var i = 0; i < message.suppressionInfo.length; ++i) {
                                var error = $root.google.logging.v2.TailLogEntriesResponse.SuppressionInfo.verify(message.suppressionInfo[i]);
                                if (error)
                                    return "suppressionInfo." + error;
                            }
                        }
                        return null;
                    };
    
                    /**
                     * Creates a TailLogEntriesResponse message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.TailLogEntriesResponse
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.TailLogEntriesResponse} TailLogEntriesResponse
                     */
                    TailLogEntriesResponse.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.TailLogEntriesResponse)
                            return object;
                        var message = new $root.google.logging.v2.TailLogEntriesResponse();
                        if (object.entries) {
                            if (!Array.isArray(object.entries))
                                throw TypeError(".google.logging.v2.TailLogEntriesResponse.entries: array expected");
                            message.entries = [];
                            for (var i = 0; i < object.entries.length; ++i) {
                                if (typeof object.entries[i] !== "object")
                                    throw TypeError(".google.logging.v2.TailLogEntriesResponse.entries: object expected");
                                message.entries[i] = $root.google.logging.v2.LogEntry.fromObject(object.entries[i]);
                            }
                        }
                        if (object.suppressionInfo) {
                            if (!Array.isArray(object.suppressionInfo))
                                throw TypeError(".google.logging.v2.TailLogEntriesResponse.suppressionInfo: array expected");
                            message.suppressionInfo = [];
                            for (var i = 0; i < object.suppressionInfo.length; ++i) {
                                if (typeof object.suppressionInfo[i] !== "object")
                                    throw TypeError(".google.logging.v2.TailLogEntriesResponse.suppressionInfo: object expected");
                                message.suppressionInfo[i] = $root.google.logging.v2.TailLogEntriesResponse.SuppressionInfo.fromObject(object.suppressionInfo[i]);
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a TailLogEntriesResponse message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.TailLogEntriesResponse
                     * @static
                     * @param {google.logging.v2.TailLogEntriesResponse} message TailLogEntriesResponse
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    TailLogEntriesResponse.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults) {
                            object.entries = [];
                            object.suppressionInfo = [];
                        }
                        if (message.entries && message.entries.length) {
                            object.entries = [];
                            for (var j = 0; j < message.entries.length; ++j)
                                object.entries[j] = $root.google.logging.v2.LogEntry.toObject(message.entries[j], options);
                        }
                        if (message.suppressionInfo && message.suppressionInfo.length) {
                            object.suppressionInfo = [];
                            for (var j = 0; j < message.suppressionInfo.length; ++j)
                                object.suppressionInfo[j] = $root.google.logging.v2.TailLogEntriesResponse.SuppressionInfo.toObject(message.suppressionInfo[j], options);
                        }
                        return object;
                    };
    
                    /**
                     * Converts this TailLogEntriesResponse to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.TailLogEntriesResponse
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    TailLogEntriesResponse.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    TailLogEntriesResponse.SuppressionInfo = (function() {
    
                        /**
                         * Properties of a SuppressionInfo.
                         * @memberof google.logging.v2.TailLogEntriesResponse
                         * @interface ISuppressionInfo
                         * @property {google.logging.v2.TailLogEntriesResponse.SuppressionInfo.Reason|null} [reason] SuppressionInfo reason
                         * @property {number|null} [suppressedCount] SuppressionInfo suppressedCount
                         */
    
                        /**
                         * Constructs a new SuppressionInfo.
                         * @memberof google.logging.v2.TailLogEntriesResponse
                         * @classdesc Represents a SuppressionInfo.
                         * @implements ISuppressionInfo
                         * @constructor
                         * @param {google.logging.v2.TailLogEntriesResponse.ISuppressionInfo=} [properties] Properties to set
                         */
                        function SuppressionInfo(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * SuppressionInfo reason.
                         * @member {google.logging.v2.TailLogEntriesResponse.SuppressionInfo.Reason} reason
                         * @memberof google.logging.v2.TailLogEntriesResponse.SuppressionInfo
                         * @instance
                         */
                        SuppressionInfo.prototype.reason = 0;
    
                        /**
                         * SuppressionInfo suppressedCount.
                         * @member {number} suppressedCount
                         * @memberof google.logging.v2.TailLogEntriesResponse.SuppressionInfo
                         * @instance
                         */
                        SuppressionInfo.prototype.suppressedCount = 0;
    
                        /**
                         * Creates a new SuppressionInfo instance using the specified properties.
                         * @function create
                         * @memberof google.logging.v2.TailLogEntriesResponse.SuppressionInfo
                         * @static
                         * @param {google.logging.v2.TailLogEntriesResponse.ISuppressionInfo=} [properties] Properties to set
                         * @returns {google.logging.v2.TailLogEntriesResponse.SuppressionInfo} SuppressionInfo instance
                         */
                        SuppressionInfo.create = function create(properties) {
                            return new SuppressionInfo(properties);
                        };
    
                        /**
                         * Encodes the specified SuppressionInfo message. Does not implicitly {@link google.logging.v2.TailLogEntriesResponse.SuppressionInfo.verify|verify} messages.
                         * @function encode
                         * @memberof google.logging.v2.TailLogEntriesResponse.SuppressionInfo
                         * @static
                         * @param {google.logging.v2.TailLogEntriesResponse.ISuppressionInfo} message SuppressionInfo message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        SuppressionInfo.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.reason != null && Object.hasOwnProperty.call(message, "reason"))
                                writer.uint32(/* id 1, wireType 0 =*/8).int32(message.reason);
                            if (message.suppressedCount != null && Object.hasOwnProperty.call(message, "suppressedCount"))
                                writer.uint32(/* id 2, wireType 0 =*/16).int32(message.suppressedCount);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified SuppressionInfo message, length delimited. Does not implicitly {@link google.logging.v2.TailLogEntriesResponse.SuppressionInfo.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.logging.v2.TailLogEntriesResponse.SuppressionInfo
                         * @static
                         * @param {google.logging.v2.TailLogEntriesResponse.ISuppressionInfo} message SuppressionInfo message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        SuppressionInfo.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a SuppressionInfo message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.logging.v2.TailLogEntriesResponse.SuppressionInfo
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.logging.v2.TailLogEntriesResponse.SuppressionInfo} SuppressionInfo
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        SuppressionInfo.decode = function decode(reader, length) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.TailLogEntriesResponse.SuppressionInfo();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                switch (tag >>> 3) {
                                case 1:
                                    message.reason = reader.int32();
                                    break;
                                case 2:
                                    message.suppressedCount = reader.int32();
                                    break;
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a SuppressionInfo message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.logging.v2.TailLogEntriesResponse.SuppressionInfo
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.logging.v2.TailLogEntriesResponse.SuppressionInfo} SuppressionInfo
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        SuppressionInfo.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a SuppressionInfo message.
                         * @function verify
                         * @memberof google.logging.v2.TailLogEntriesResponse.SuppressionInfo
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        SuppressionInfo.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.reason != null && message.hasOwnProperty("reason"))
                                switch (message.reason) {
                                default:
                                    return "reason: enum value expected";
                                case 0:
                                case 1:
                                case 2:
                                    break;
                                }
                            if (message.suppressedCount != null && message.hasOwnProperty("suppressedCount"))
                                if (!$util.isInteger(message.suppressedCount))
                                    return "suppressedCount: integer expected";
                            return null;
                        };
    
                        /**
                         * Creates a SuppressionInfo message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.logging.v2.TailLogEntriesResponse.SuppressionInfo
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.logging.v2.TailLogEntriesResponse.SuppressionInfo} SuppressionInfo
                         */
                        SuppressionInfo.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.logging.v2.TailLogEntriesResponse.SuppressionInfo)
                                return object;
                            var message = new $root.google.logging.v2.TailLogEntriesResponse.SuppressionInfo();
                            switch (object.reason) {
                            case "REASON_UNSPECIFIED":
                            case 0:
                                message.reason = 0;
                                break;
                            case "RATE_LIMIT":
                            case 1:
                                message.reason = 1;
                                break;
                            case "NOT_CONSUMED":
                            case 2:
                                message.reason = 2;
                                break;
                            }
                            if (object.suppressedCount != null)
                                message.suppressedCount = object.suppressedCount | 0;
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a SuppressionInfo message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.logging.v2.TailLogEntriesResponse.SuppressionInfo
                         * @static
                         * @param {google.logging.v2.TailLogEntriesResponse.SuppressionInfo} message SuppressionInfo
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        SuppressionInfo.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.reason = options.enums === String ? "REASON_UNSPECIFIED" : 0;
                                object.suppressedCount = 0;
                            }
                            if (message.reason != null && message.hasOwnProperty("reason"))
                                object.reason = options.enums === String ? $root.google.logging.v2.TailLogEntriesResponse.SuppressionInfo.Reason[message.reason] : message.reason;
                            if (message.suppressedCount != null && message.hasOwnProperty("suppressedCount"))
                                object.suppressedCount = message.suppressedCount;
                            return object;
                        };
    
                        /**
                         * Converts this SuppressionInfo to JSON.
                         * @function toJSON
                         * @memberof google.logging.v2.TailLogEntriesResponse.SuppressionInfo
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        SuppressionInfo.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        /**
                         * Reason enum.
                         * @name google.logging.v2.TailLogEntriesResponse.SuppressionInfo.Reason
                         * @enum {number}
                         * @property {number} REASON_UNSPECIFIED=0 REASON_UNSPECIFIED value
                         * @property {number} RATE_LIMIT=1 RATE_LIMIT value
                         * @property {number} NOT_CONSUMED=2 NOT_CONSUMED value
                         */
                        SuppressionInfo.Reason = (function() {
                            var valuesById = {}, values = Object.create(valuesById);
                            values[valuesById[0] = "REASON_UNSPECIFIED"] = 0;
                            values[valuesById[1] = "RATE_LIMIT"] = 1;
                            values[valuesById[2] = "NOT_CONSUMED"] = 2;
                            return values;
                        })();
    
                        return SuppressionInfo;
                    })();
    
                    return TailLogEntriesResponse;
                })();
    
                v2.ConfigServiceV2 = (function() {
    
                    /**
                     * Constructs a new ConfigServiceV2 service.
                     * @memberof google.logging.v2
                     * @classdesc Represents a ConfigServiceV2
                     * @extends $protobuf.rpc.Service
                     * @constructor
                     * @param {$protobuf.RPCImpl} rpcImpl RPC implementation
                     * @param {boolean} [requestDelimited=false] Whether requests are length-delimited
                     * @param {boolean} [responseDelimited=false] Whether responses are length-delimited
                     */
                    function ConfigServiceV2(rpcImpl, requestDelimited, responseDelimited) {
                        $protobuf.rpc.Service.call(this, rpcImpl, requestDelimited, responseDelimited);
                    }
    
                    (ConfigServiceV2.prototype = Object.create($protobuf.rpc.Service.prototype)).constructor = ConfigServiceV2;
    
                    /**
                     * Creates new ConfigServiceV2 service using the specified rpc implementation.
                     * @function create
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @static
                     * @param {$protobuf.RPCImpl} rpcImpl RPC implementation
                     * @param {boolean} [requestDelimited=false] Whether requests are length-delimited
                     * @param {boolean} [responseDelimited=false] Whether responses are length-delimited
                     * @returns {ConfigServiceV2} RPC service. Useful where requests and/or responses are streamed.
                     */
                    ConfigServiceV2.create = function create(rpcImpl, requestDelimited, responseDelimited) {
                        return new this(rpcImpl, requestDelimited, responseDelimited);
                    };
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|listBuckets}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef ListBucketsCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.ListBucketsResponse} [response] ListBucketsResponse
                     */
    
                    /**
                     * Calls ListBuckets.
                     * @function listBuckets
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IListBucketsRequest} request ListBucketsRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.ListBucketsCallback} callback Node-style callback called with the error, if any, and ListBucketsResponse
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.listBuckets = function listBuckets(request, callback) {
                        return this.rpcCall(listBuckets, $root.google.logging.v2.ListBucketsRequest, $root.google.logging.v2.ListBucketsResponse, request, callback);
                    }, "name", { value: "ListBuckets" });
    
                    /**
                     * Calls ListBuckets.
                     * @function listBuckets
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IListBucketsRequest} request ListBucketsRequest message or plain object
                     * @returns {Promise<google.logging.v2.ListBucketsResponse>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|getBucket}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef GetBucketCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.LogBucket} [response] LogBucket
                     */
    
                    /**
                     * Calls GetBucket.
                     * @function getBucket
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IGetBucketRequest} request GetBucketRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.GetBucketCallback} callback Node-style callback called with the error, if any, and LogBucket
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.getBucket = function getBucket(request, callback) {
                        return this.rpcCall(getBucket, $root.google.logging.v2.GetBucketRequest, $root.google.logging.v2.LogBucket, request, callback);
                    }, "name", { value: "GetBucket" });
    
                    /**
                     * Calls GetBucket.
                     * @function getBucket
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IGetBucketRequest} request GetBucketRequest message or plain object
                     * @returns {Promise<google.logging.v2.LogBucket>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|createBucket}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef CreateBucketCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.LogBucket} [response] LogBucket
                     */
    
                    /**
                     * Calls CreateBucket.
                     * @function createBucket
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.ICreateBucketRequest} request CreateBucketRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.CreateBucketCallback} callback Node-style callback called with the error, if any, and LogBucket
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.createBucket = function createBucket(request, callback) {
                        return this.rpcCall(createBucket, $root.google.logging.v2.CreateBucketRequest, $root.google.logging.v2.LogBucket, request, callback);
                    }, "name", { value: "CreateBucket" });
    
                    /**
                     * Calls CreateBucket.
                     * @function createBucket
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.ICreateBucketRequest} request CreateBucketRequest message or plain object
                     * @returns {Promise<google.logging.v2.LogBucket>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|updateBucket}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef UpdateBucketCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.LogBucket} [response] LogBucket
                     */
    
                    /**
                     * Calls UpdateBucket.
                     * @function updateBucket
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IUpdateBucketRequest} request UpdateBucketRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.UpdateBucketCallback} callback Node-style callback called with the error, if any, and LogBucket
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.updateBucket = function updateBucket(request, callback) {
                        return this.rpcCall(updateBucket, $root.google.logging.v2.UpdateBucketRequest, $root.google.logging.v2.LogBucket, request, callback);
                    }, "name", { value: "UpdateBucket" });
    
                    /**
                     * Calls UpdateBucket.
                     * @function updateBucket
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IUpdateBucketRequest} request UpdateBucketRequest message or plain object
                     * @returns {Promise<google.logging.v2.LogBucket>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|deleteBucket}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef DeleteBucketCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.protobuf.Empty} [response] Empty
                     */
    
                    /**
                     * Calls DeleteBucket.
                     * @function deleteBucket
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IDeleteBucketRequest} request DeleteBucketRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.DeleteBucketCallback} callback Node-style callback called with the error, if any, and Empty
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.deleteBucket = function deleteBucket(request, callback) {
                        return this.rpcCall(deleteBucket, $root.google.logging.v2.DeleteBucketRequest, $root.google.protobuf.Empty, request, callback);
                    }, "name", { value: "DeleteBucket" });
    
                    /**
                     * Calls DeleteBucket.
                     * @function deleteBucket
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IDeleteBucketRequest} request DeleteBucketRequest message or plain object
                     * @returns {Promise<google.protobuf.Empty>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|undeleteBucket}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef UndeleteBucketCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.protobuf.Empty} [response] Empty
                     */
    
                    /**
                     * Calls UndeleteBucket.
                     * @function undeleteBucket
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IUndeleteBucketRequest} request UndeleteBucketRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.UndeleteBucketCallback} callback Node-style callback called with the error, if any, and Empty
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.undeleteBucket = function undeleteBucket(request, callback) {
                        return this.rpcCall(undeleteBucket, $root.google.logging.v2.UndeleteBucketRequest, $root.google.protobuf.Empty, request, callback);
                    }, "name", { value: "UndeleteBucket" });
    
                    /**
                     * Calls UndeleteBucket.
                     * @function undeleteBucket
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IUndeleteBucketRequest} request UndeleteBucketRequest message or plain object
                     * @returns {Promise<google.protobuf.Empty>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|listViews}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef ListViewsCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.ListViewsResponse} [response] ListViewsResponse
                     */
    
                    /**
                     * Calls ListViews.
                     * @function listViews
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IListViewsRequest} request ListViewsRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.ListViewsCallback} callback Node-style callback called with the error, if any, and ListViewsResponse
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.listViews = function listViews(request, callback) {
                        return this.rpcCall(listViews, $root.google.logging.v2.ListViewsRequest, $root.google.logging.v2.ListViewsResponse, request, callback);
                    }, "name", { value: "ListViews" });
    
                    /**
                     * Calls ListViews.
                     * @function listViews
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IListViewsRequest} request ListViewsRequest message or plain object
                     * @returns {Promise<google.logging.v2.ListViewsResponse>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|getView}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef GetViewCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.LogView} [response] LogView
                     */
    
                    /**
                     * Calls GetView.
                     * @function getView
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IGetViewRequest} request GetViewRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.GetViewCallback} callback Node-style callback called with the error, if any, and LogView
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.getView = function getView(request, callback) {
                        return this.rpcCall(getView, $root.google.logging.v2.GetViewRequest, $root.google.logging.v2.LogView, request, callback);
                    }, "name", { value: "GetView" });
    
                    /**
                     * Calls GetView.
                     * @function getView
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IGetViewRequest} request GetViewRequest message or plain object
                     * @returns {Promise<google.logging.v2.LogView>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|createView}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef CreateViewCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.LogView} [response] LogView
                     */
    
                    /**
                     * Calls CreateView.
                     * @function createView
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.ICreateViewRequest} request CreateViewRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.CreateViewCallback} callback Node-style callback called with the error, if any, and LogView
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.createView = function createView(request, callback) {
                        return this.rpcCall(createView, $root.google.logging.v2.CreateViewRequest, $root.google.logging.v2.LogView, request, callback);
                    }, "name", { value: "CreateView" });
    
                    /**
                     * Calls CreateView.
                     * @function createView
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.ICreateViewRequest} request CreateViewRequest message or plain object
                     * @returns {Promise<google.logging.v2.LogView>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|updateView}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef UpdateViewCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.LogView} [response] LogView
                     */
    
                    /**
                     * Calls UpdateView.
                     * @function updateView
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IUpdateViewRequest} request UpdateViewRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.UpdateViewCallback} callback Node-style callback called with the error, if any, and LogView
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.updateView = function updateView(request, callback) {
                        return this.rpcCall(updateView, $root.google.logging.v2.UpdateViewRequest, $root.google.logging.v2.LogView, request, callback);
                    }, "name", { value: "UpdateView" });
    
                    /**
                     * Calls UpdateView.
                     * @function updateView
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IUpdateViewRequest} request UpdateViewRequest message or plain object
                     * @returns {Promise<google.logging.v2.LogView>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|deleteView}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef DeleteViewCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.protobuf.Empty} [response] Empty
                     */
    
                    /**
                     * Calls DeleteView.
                     * @function deleteView
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IDeleteViewRequest} request DeleteViewRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.DeleteViewCallback} callback Node-style callback called with the error, if any, and Empty
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.deleteView = function deleteView(request, callback) {
                        return this.rpcCall(deleteView, $root.google.logging.v2.DeleteViewRequest, $root.google.protobuf.Empty, request, callback);
                    }, "name", { value: "DeleteView" });
    
                    /**
                     * Calls DeleteView.
                     * @function deleteView
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IDeleteViewRequest} request DeleteViewRequest message or plain object
                     * @returns {Promise<google.protobuf.Empty>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|listSinks}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef ListSinksCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.ListSinksResponse} [response] ListSinksResponse
                     */
    
                    /**
                     * Calls ListSinks.
                     * @function listSinks
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IListSinksRequest} request ListSinksRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.ListSinksCallback} callback Node-style callback called with the error, if any, and ListSinksResponse
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.listSinks = function listSinks(request, callback) {
                        return this.rpcCall(listSinks, $root.google.logging.v2.ListSinksRequest, $root.google.logging.v2.ListSinksResponse, request, callback);
                    }, "name", { value: "ListSinks" });
    
                    /**
                     * Calls ListSinks.
                     * @function listSinks
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IListSinksRequest} request ListSinksRequest message or plain object
                     * @returns {Promise<google.logging.v2.ListSinksResponse>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|getSink}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef GetSinkCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.LogSink} [response] LogSink
                     */
    
                    /**
                     * Calls GetSink.
                     * @function getSink
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IGetSinkRequest} request GetSinkRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.GetSinkCallback} callback Node-style callback called with the error, if any, and LogSink
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.getSink = function getSink(request, callback) {
                        return this.rpcCall(getSink, $root.google.logging.v2.GetSinkRequest, $root.google.logging.v2.LogSink, request, callback);
                    }, "name", { value: "GetSink" });
    
                    /**
                     * Calls GetSink.
                     * @function getSink
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IGetSinkRequest} request GetSinkRequest message or plain object
                     * @returns {Promise<google.logging.v2.LogSink>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|createSink}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef CreateSinkCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.LogSink} [response] LogSink
                     */
    
                    /**
                     * Calls CreateSink.
                     * @function createSink
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.ICreateSinkRequest} request CreateSinkRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.CreateSinkCallback} callback Node-style callback called with the error, if any, and LogSink
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.createSink = function createSink(request, callback) {
                        return this.rpcCall(createSink, $root.google.logging.v2.CreateSinkRequest, $root.google.logging.v2.LogSink, request, callback);
                    }, "name", { value: "CreateSink" });
    
                    /**
                     * Calls CreateSink.
                     * @function createSink
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.ICreateSinkRequest} request CreateSinkRequest message or plain object
                     * @returns {Promise<google.logging.v2.LogSink>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|updateSink}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef UpdateSinkCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.LogSink} [response] LogSink
                     */
    
                    /**
                     * Calls UpdateSink.
                     * @function updateSink
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IUpdateSinkRequest} request UpdateSinkRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.UpdateSinkCallback} callback Node-style callback called with the error, if any, and LogSink
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.updateSink = function updateSink(request, callback) {
                        return this.rpcCall(updateSink, $root.google.logging.v2.UpdateSinkRequest, $root.google.logging.v2.LogSink, request, callback);
                    }, "name", { value: "UpdateSink" });
    
                    /**
                     * Calls UpdateSink.
                     * @function updateSink
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IUpdateSinkRequest} request UpdateSinkRequest message or plain object
                     * @returns {Promise<google.logging.v2.LogSink>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|deleteSink}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef DeleteSinkCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.protobuf.Empty} [response] Empty
                     */
    
                    /**
                     * Calls DeleteSink.
                     * @function deleteSink
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IDeleteSinkRequest} request DeleteSinkRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.DeleteSinkCallback} callback Node-style callback called with the error, if any, and Empty
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.deleteSink = function deleteSink(request, callback) {
                        return this.rpcCall(deleteSink, $root.google.logging.v2.DeleteSinkRequest, $root.google.protobuf.Empty, request, callback);
                    }, "name", { value: "DeleteSink" });
    
                    /**
                     * Calls DeleteSink.
                     * @function deleteSink
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IDeleteSinkRequest} request DeleteSinkRequest message or plain object
                     * @returns {Promise<google.protobuf.Empty>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|listExclusions}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef ListExclusionsCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.ListExclusionsResponse} [response] ListExclusionsResponse
                     */
    
                    /**
                     * Calls ListExclusions.
                     * @function listExclusions
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IListExclusionsRequest} request ListExclusionsRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.ListExclusionsCallback} callback Node-style callback called with the error, if any, and ListExclusionsResponse
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.listExclusions = function listExclusions(request, callback) {
                        return this.rpcCall(listExclusions, $root.google.logging.v2.ListExclusionsRequest, $root.google.logging.v2.ListExclusionsResponse, request, callback);
                    }, "name", { value: "ListExclusions" });
    
                    /**
                     * Calls ListExclusions.
                     * @function listExclusions
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IListExclusionsRequest} request ListExclusionsRequest message or plain object
                     * @returns {Promise<google.logging.v2.ListExclusionsResponse>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|getExclusion}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef GetExclusionCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.LogExclusion} [response] LogExclusion
                     */
    
                    /**
                     * Calls GetExclusion.
                     * @function getExclusion
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IGetExclusionRequest} request GetExclusionRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.GetExclusionCallback} callback Node-style callback called with the error, if any, and LogExclusion
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.getExclusion = function getExclusion(request, callback) {
                        return this.rpcCall(getExclusion, $root.google.logging.v2.GetExclusionRequest, $root.google.logging.v2.LogExclusion, request, callback);
                    }, "name", { value: "GetExclusion" });
    
                    /**
                     * Calls GetExclusion.
                     * @function getExclusion
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IGetExclusionRequest} request GetExclusionRequest message or plain object
                     * @returns {Promise<google.logging.v2.LogExclusion>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|createExclusion}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef CreateExclusionCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.LogExclusion} [response] LogExclusion
                     */
    
                    /**
                     * Calls CreateExclusion.
                     * @function createExclusion
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.ICreateExclusionRequest} request CreateExclusionRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.CreateExclusionCallback} callback Node-style callback called with the error, if any, and LogExclusion
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.createExclusion = function createExclusion(request, callback) {
                        return this.rpcCall(createExclusion, $root.google.logging.v2.CreateExclusionRequest, $root.google.logging.v2.LogExclusion, request, callback);
                    }, "name", { value: "CreateExclusion" });
    
                    /**
                     * Calls CreateExclusion.
                     * @function createExclusion
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.ICreateExclusionRequest} request CreateExclusionRequest message or plain object
                     * @returns {Promise<google.logging.v2.LogExclusion>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|updateExclusion}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef UpdateExclusionCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.LogExclusion} [response] LogExclusion
                     */
    
                    /**
                     * Calls UpdateExclusion.
                     * @function updateExclusion
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IUpdateExclusionRequest} request UpdateExclusionRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.UpdateExclusionCallback} callback Node-style callback called with the error, if any, and LogExclusion
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.updateExclusion = function updateExclusion(request, callback) {
                        return this.rpcCall(updateExclusion, $root.google.logging.v2.UpdateExclusionRequest, $root.google.logging.v2.LogExclusion, request, callback);
                    }, "name", { value: "UpdateExclusion" });
    
                    /**
                     * Calls UpdateExclusion.
                     * @function updateExclusion
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IUpdateExclusionRequest} request UpdateExclusionRequest message or plain object
                     * @returns {Promise<google.logging.v2.LogExclusion>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|deleteExclusion}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef DeleteExclusionCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.protobuf.Empty} [response] Empty
                     */
    
                    /**
                     * Calls DeleteExclusion.
                     * @function deleteExclusion
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IDeleteExclusionRequest} request DeleteExclusionRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.DeleteExclusionCallback} callback Node-style callback called with the error, if any, and Empty
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.deleteExclusion = function deleteExclusion(request, callback) {
                        return this.rpcCall(deleteExclusion, $root.google.logging.v2.DeleteExclusionRequest, $root.google.protobuf.Empty, request, callback);
                    }, "name", { value: "DeleteExclusion" });
    
                    /**
                     * Calls DeleteExclusion.
                     * @function deleteExclusion
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IDeleteExclusionRequest} request DeleteExclusionRequest message or plain object
                     * @returns {Promise<google.protobuf.Empty>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|getCmekSettings}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef GetCmekSettingsCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.CmekSettings} [response] CmekSettings
                     */
    
                    /**
                     * Calls GetCmekSettings.
                     * @function getCmekSettings
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IGetCmekSettingsRequest} request GetCmekSettingsRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.GetCmekSettingsCallback} callback Node-style callback called with the error, if any, and CmekSettings
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.getCmekSettings = function getCmekSettings(request, callback) {
                        return this.rpcCall(getCmekSettings, $root.google.logging.v2.GetCmekSettingsRequest, $root.google.logging.v2.CmekSettings, request, callback);
                    }, "name", { value: "GetCmekSettings" });
    
                    /**
                     * Calls GetCmekSettings.
                     * @function getCmekSettings
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IGetCmekSettingsRequest} request GetCmekSettingsRequest message or plain object
                     * @returns {Promise<google.logging.v2.CmekSettings>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|updateCmekSettings}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef UpdateCmekSettingsCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.CmekSettings} [response] CmekSettings
                     */
    
                    /**
                     * Calls UpdateCmekSettings.
                     * @function updateCmekSettings
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IUpdateCmekSettingsRequest} request UpdateCmekSettingsRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.UpdateCmekSettingsCallback} callback Node-style callback called with the error, if any, and CmekSettings
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.updateCmekSettings = function updateCmekSettings(request, callback) {
                        return this.rpcCall(updateCmekSettings, $root.google.logging.v2.UpdateCmekSettingsRequest, $root.google.logging.v2.CmekSettings, request, callback);
                    }, "name", { value: "UpdateCmekSettings" });
    
                    /**
                     * Calls UpdateCmekSettings.
                     * @function updateCmekSettings
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IUpdateCmekSettingsRequest} request UpdateCmekSettingsRequest message or plain object
                     * @returns {Promise<google.logging.v2.CmekSettings>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|getSettings}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef GetSettingsCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.Settings} [response] Settings
                     */
    
                    /**
                     * Calls GetSettings.
                     * @function getSettings
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IGetSettingsRequest} request GetSettingsRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.GetSettingsCallback} callback Node-style callback called with the error, if any, and Settings
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.getSettings = function getSettings(request, callback) {
                        return this.rpcCall(getSettings, $root.google.logging.v2.GetSettingsRequest, $root.google.logging.v2.Settings, request, callback);
                    }, "name", { value: "GetSettings" });
    
                    /**
                     * Calls GetSettings.
                     * @function getSettings
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IGetSettingsRequest} request GetSettingsRequest message or plain object
                     * @returns {Promise<google.logging.v2.Settings>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|updateSettings}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef UpdateSettingsCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.Settings} [response] Settings
                     */
    
                    /**
                     * Calls UpdateSettings.
                     * @function updateSettings
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IUpdateSettingsRequest} request UpdateSettingsRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.UpdateSettingsCallback} callback Node-style callback called with the error, if any, and Settings
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.updateSettings = function updateSettings(request, callback) {
                        return this.rpcCall(updateSettings, $root.google.logging.v2.UpdateSettingsRequest, $root.google.logging.v2.Settings, request, callback);
                    }, "name", { value: "UpdateSettings" });
    
                    /**
                     * Calls UpdateSettings.
                     * @function updateSettings
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.IUpdateSettingsRequest} request UpdateSettingsRequest message or plain object
                     * @returns {Promise<google.logging.v2.Settings>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.ConfigServiceV2|copyLogEntries}.
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @typedef CopyLogEntriesCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.longrunning.Operation} [response] Operation
                     */
    
                    /**
                     * Calls CopyLogEntries.
                     * @function copyLogEntries
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.ICopyLogEntriesRequest} request CopyLogEntriesRequest message or plain object
                     * @param {google.logging.v2.ConfigServiceV2.CopyLogEntriesCallback} callback Node-style callback called with the error, if any, and Operation
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(ConfigServiceV2.prototype.copyLogEntries = function copyLogEntries(request, callback) {
                        return this.rpcCall(copyLogEntries, $root.google.logging.v2.CopyLogEntriesRequest, $root.google.longrunning.Operation, request, callback);
                    }, "name", { value: "CopyLogEntries" });
    
                    /**
                     * Calls CopyLogEntries.
                     * @function copyLogEntries
                     * @memberof google.logging.v2.ConfigServiceV2
                     * @instance
                     * @param {google.logging.v2.ICopyLogEntriesRequest} request CopyLogEntriesRequest message or plain object
                     * @returns {Promise<google.longrunning.Operation>} Promise
                     * @variation 2
                     */
    
                    return ConfigServiceV2;
                })();
    
                v2.LogBucket = (function() {
    
                    /**
                     * Properties of a LogBucket.
                     * @memberof google.logging.v2
                     * @interface ILogBucket
                     * @property {string|null} [name] LogBucket name
                     * @property {string|null} [description] LogBucket description
                     * @property {google.protobuf.ITimestamp|null} [createTime] LogBucket createTime
                     * @property {google.protobuf.ITimestamp|null} [updateTime] LogBucket updateTime
                     * @property {number|null} [retentionDays] LogBucket retentionDays
                     * @property {boolean|null} [locked] LogBucket locked
                     * @property {google.logging.v2.LifecycleState|null} [lifecycleState] LogBucket lifecycleState
                     * @property {Array.<string>|null} [restrictedFields] LogBucket restrictedFields
                     * @property {google.logging.v2.ICmekSettings|null} [cmekSettings] LogBucket cmekSettings
                     */
    
                    /**
                     * Constructs a new LogBucket.
                     * @memberof google.logging.v2
                     * @classdesc Represents a LogBucket.
                     * @implements ILogBucket
                     * @constructor
                     * @param {google.logging.v2.ILogBucket=} [properties] Properties to set
                     */
                    function LogBucket(properties) {
                        this.restrictedFields = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * LogBucket name.
                     * @member {string} name
                     * @memberof google.logging.v2.LogBucket
                     * @instance
                     */
                    LogBucket.prototype.name = "";
    
                    /**
                     * LogBucket description.
                     * @member {string} description
                     * @memberof google.logging.v2.LogBucket
                     * @instance
                     */
                    LogBucket.prototype.description = "";
    
                    /**
                     * LogBucket createTime.
                     * @member {google.protobuf.ITimestamp|null|undefined} createTime
                     * @memberof google.logging.v2.LogBucket
                     * @instance
                     */
                    LogBucket.prototype.createTime = null;
    
                    /**
                     * LogBucket updateTime.
                     * @member {google.protobuf.ITimestamp|null|undefined} updateTime
                     * @memberof google.logging.v2.LogBucket
                     * @instance
                     */
                    LogBucket.prototype.updateTime = null;
    
                    /**
                     * LogBucket retentionDays.
                     * @member {number} retentionDays
                     * @memberof google.logging.v2.LogBucket
                     * @instance
                     */
                    LogBucket.prototype.retentionDays = 0;
    
                    /**
                     * LogBucket locked.
                     * @member {boolean} locked
                     * @memberof google.logging.v2.LogBucket
                     * @instance
                     */
                    LogBucket.prototype.locked = false;
    
                    /**
                     * LogBucket lifecycleState.
                     * @member {google.logging.v2.LifecycleState} lifecycleState
                     * @memberof google.logging.v2.LogBucket
                     * @instance
                     */
                    LogBucket.prototype.lifecycleState = 0;
    
                    /**
                     * LogBucket restrictedFields.
                     * @member {Array.<string>} restrictedFields
                     * @memberof google.logging.v2.LogBucket
                     * @instance
                     */
                    LogBucket.prototype.restrictedFields = $util.emptyArray;
    
                    /**
                     * LogBucket cmekSettings.
                     * @member {google.logging.v2.ICmekSettings|null|undefined} cmekSettings
                     * @memberof google.logging.v2.LogBucket
                     * @instance
                     */
                    LogBucket.prototype.cmekSettings = null;
    
                    /**
                     * Creates a new LogBucket instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.LogBucket
                     * @static
                     * @param {google.logging.v2.ILogBucket=} [properties] Properties to set
                     * @returns {google.logging.v2.LogBucket} LogBucket instance
                     */
                    LogBucket.create = function create(properties) {
                        return new LogBucket(properties);
                    };
    
                    /**
                     * Encodes the specified LogBucket message. Does not implicitly {@link google.logging.v2.LogBucket.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.LogBucket
                     * @static
                     * @param {google.logging.v2.ILogBucket} message LogBucket message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    LogBucket.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        if (message.description != null && Object.hasOwnProperty.call(message, "description"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.description);
                        if (message.createTime != null && Object.hasOwnProperty.call(message, "createTime"))
                            $root.google.protobuf.Timestamp.encode(message.createTime, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                        if (message.updateTime != null && Object.hasOwnProperty.call(message, "updateTime"))
                            $root.google.protobuf.Timestamp.encode(message.updateTime, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                        if (message.locked != null && Object.hasOwnProperty.call(message, "locked"))
                            writer.uint32(/* id 9, wireType 0 =*/72).bool(message.locked);
                        if (message.retentionDays != null && Object.hasOwnProperty.call(message, "retentionDays"))
                            writer.uint32(/* id 11, wireType 0 =*/88).int32(message.retentionDays);
                        if (message.lifecycleState != null && Object.hasOwnProperty.call(message, "lifecycleState"))
                            writer.uint32(/* id 12, wireType 0 =*/96).int32(message.lifecycleState);
                        if (message.restrictedFields != null && message.restrictedFields.length)
                            for (var i = 0; i < message.restrictedFields.length; ++i)
                                writer.uint32(/* id 15, wireType 2 =*/122).string(message.restrictedFields[i]);
                        if (message.cmekSettings != null && Object.hasOwnProperty.call(message, "cmekSettings"))
                            $root.google.logging.v2.CmekSettings.encode(message.cmekSettings, writer.uint32(/* id 19, wireType 2 =*/154).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified LogBucket message, length delimited. Does not implicitly {@link google.logging.v2.LogBucket.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.LogBucket
                     * @static
                     * @param {google.logging.v2.ILogBucket} message LogBucket message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    LogBucket.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a LogBucket message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.LogBucket
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.LogBucket} LogBucket
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    LogBucket.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.LogBucket();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.name = reader.string();
                                break;
                            case 3:
                                message.description = reader.string();
                                break;
                            case 4:
                                message.createTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                break;
                            case 5:
                                message.updateTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                break;
                            case 11:
                                message.retentionDays = reader.int32();
                                break;
                            case 9:
                                message.locked = reader.bool();
                                break;
                            case 12:
                                message.lifecycleState = reader.int32();
                                break;
                            case 15:
                                if (!(message.restrictedFields && message.restrictedFields.length))
                                    message.restrictedFields = [];
                                message.restrictedFields.push(reader.string());
                                break;
                            case 19:
                                message.cmekSettings = $root.google.logging.v2.CmekSettings.decode(reader, reader.uint32());
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a LogBucket message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.LogBucket
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.LogBucket} LogBucket
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    LogBucket.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a LogBucket message.
                     * @function verify
                     * @memberof google.logging.v2.LogBucket
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    LogBucket.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        if (message.description != null && message.hasOwnProperty("description"))
                            if (!$util.isString(message.description))
                                return "description: string expected";
                        if (message.createTime != null && message.hasOwnProperty("createTime")) {
                            var error = $root.google.protobuf.Timestamp.verify(message.createTime);
                            if (error)
                                return "createTime." + error;
                        }
                        if (message.updateTime != null && message.hasOwnProperty("updateTime")) {
                            var error = $root.google.protobuf.Timestamp.verify(message.updateTime);
                            if (error)
                                return "updateTime." + error;
                        }
                        if (message.retentionDays != null && message.hasOwnProperty("retentionDays"))
                            if (!$util.isInteger(message.retentionDays))
                                return "retentionDays: integer expected";
                        if (message.locked != null && message.hasOwnProperty("locked"))
                            if (typeof message.locked !== "boolean")
                                return "locked: boolean expected";
                        if (message.lifecycleState != null && message.hasOwnProperty("lifecycleState"))
                            switch (message.lifecycleState) {
                            default:
                                return "lifecycleState: enum value expected";
                            case 0:
                            case 1:
                            case 2:
                                break;
                            }
                        if (message.restrictedFields != null && message.hasOwnProperty("restrictedFields")) {
                            if (!Array.isArray(message.restrictedFields))
                                return "restrictedFields: array expected";
                            for (var i = 0; i < message.restrictedFields.length; ++i)
                                if (!$util.isString(message.restrictedFields[i]))
                                    return "restrictedFields: string[] expected";
                        }
                        if (message.cmekSettings != null && message.hasOwnProperty("cmekSettings")) {
                            var error = $root.google.logging.v2.CmekSettings.verify(message.cmekSettings);
                            if (error)
                                return "cmekSettings." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a LogBucket message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.LogBucket
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.LogBucket} LogBucket
                     */
                    LogBucket.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.LogBucket)
                            return object;
                        var message = new $root.google.logging.v2.LogBucket();
                        if (object.name != null)
                            message.name = String(object.name);
                        if (object.description != null)
                            message.description = String(object.description);
                        if (object.createTime != null) {
                            if (typeof object.createTime !== "object")
                                throw TypeError(".google.logging.v2.LogBucket.createTime: object expected");
                            message.createTime = $root.google.protobuf.Timestamp.fromObject(object.createTime);
                        }
                        if (object.updateTime != null) {
                            if (typeof object.updateTime !== "object")
                                throw TypeError(".google.logging.v2.LogBucket.updateTime: object expected");
                            message.updateTime = $root.google.protobuf.Timestamp.fromObject(object.updateTime);
                        }
                        if (object.retentionDays != null)
                            message.retentionDays = object.retentionDays | 0;
                        if (object.locked != null)
                            message.locked = Boolean(object.locked);
                        switch (object.lifecycleState) {
                        case "LIFECYCLE_STATE_UNSPECIFIED":
                        case 0:
                            message.lifecycleState = 0;
                            break;
                        case "ACTIVE":
                        case 1:
                            message.lifecycleState = 1;
                            break;
                        case "DELETE_REQUESTED":
                        case 2:
                            message.lifecycleState = 2;
                            break;
                        }
                        if (object.restrictedFields) {
                            if (!Array.isArray(object.restrictedFields))
                                throw TypeError(".google.logging.v2.LogBucket.restrictedFields: array expected");
                            message.restrictedFields = [];
                            for (var i = 0; i < object.restrictedFields.length; ++i)
                                message.restrictedFields[i] = String(object.restrictedFields[i]);
                        }
                        if (object.cmekSettings != null) {
                            if (typeof object.cmekSettings !== "object")
                                throw TypeError(".google.logging.v2.LogBucket.cmekSettings: object expected");
                            message.cmekSettings = $root.google.logging.v2.CmekSettings.fromObject(object.cmekSettings);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a LogBucket message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.LogBucket
                     * @static
                     * @param {google.logging.v2.LogBucket} message LogBucket
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    LogBucket.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.restrictedFields = [];
                        if (options.defaults) {
                            object.name = "";
                            object.description = "";
                            object.createTime = null;
                            object.updateTime = null;
                            object.locked = false;
                            object.retentionDays = 0;
                            object.lifecycleState = options.enums === String ? "LIFECYCLE_STATE_UNSPECIFIED" : 0;
                            object.cmekSettings = null;
                        }
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        if (message.description != null && message.hasOwnProperty("description"))
                            object.description = message.description;
                        if (message.createTime != null && message.hasOwnProperty("createTime"))
                            object.createTime = $root.google.protobuf.Timestamp.toObject(message.createTime, options);
                        if (message.updateTime != null && message.hasOwnProperty("updateTime"))
                            object.updateTime = $root.google.protobuf.Timestamp.toObject(message.updateTime, options);
                        if (message.locked != null && message.hasOwnProperty("locked"))
                            object.locked = message.locked;
                        if (message.retentionDays != null && message.hasOwnProperty("retentionDays"))
                            object.retentionDays = message.retentionDays;
                        if (message.lifecycleState != null && message.hasOwnProperty("lifecycleState"))
                            object.lifecycleState = options.enums === String ? $root.google.logging.v2.LifecycleState[message.lifecycleState] : message.lifecycleState;
                        if (message.restrictedFields && message.restrictedFields.length) {
                            object.restrictedFields = [];
                            for (var j = 0; j < message.restrictedFields.length; ++j)
                                object.restrictedFields[j] = message.restrictedFields[j];
                        }
                        if (message.cmekSettings != null && message.hasOwnProperty("cmekSettings"))
                            object.cmekSettings = $root.google.logging.v2.CmekSettings.toObject(message.cmekSettings, options);
                        return object;
                    };
    
                    /**
                     * Converts this LogBucket to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.LogBucket
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    LogBucket.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return LogBucket;
                })();
    
                v2.LogView = (function() {
    
                    /**
                     * Properties of a LogView.
                     * @memberof google.logging.v2
                     * @interface ILogView
                     * @property {string|null} [name] LogView name
                     * @property {string|null} [description] LogView description
                     * @property {google.protobuf.ITimestamp|null} [createTime] LogView createTime
                     * @property {google.protobuf.ITimestamp|null} [updateTime] LogView updateTime
                     * @property {string|null} [filter] LogView filter
                     */
    
                    /**
                     * Constructs a new LogView.
                     * @memberof google.logging.v2
                     * @classdesc Represents a LogView.
                     * @implements ILogView
                     * @constructor
                     * @param {google.logging.v2.ILogView=} [properties] Properties to set
                     */
                    function LogView(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * LogView name.
                     * @member {string} name
                     * @memberof google.logging.v2.LogView
                     * @instance
                     */
                    LogView.prototype.name = "";
    
                    /**
                     * LogView description.
                     * @member {string} description
                     * @memberof google.logging.v2.LogView
                     * @instance
                     */
                    LogView.prototype.description = "";
    
                    /**
                     * LogView createTime.
                     * @member {google.protobuf.ITimestamp|null|undefined} createTime
                     * @memberof google.logging.v2.LogView
                     * @instance
                     */
                    LogView.prototype.createTime = null;
    
                    /**
                     * LogView updateTime.
                     * @member {google.protobuf.ITimestamp|null|undefined} updateTime
                     * @memberof google.logging.v2.LogView
                     * @instance
                     */
                    LogView.prototype.updateTime = null;
    
                    /**
                     * LogView filter.
                     * @member {string} filter
                     * @memberof google.logging.v2.LogView
                     * @instance
                     */
                    LogView.prototype.filter = "";
    
                    /**
                     * Creates a new LogView instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.LogView
                     * @static
                     * @param {google.logging.v2.ILogView=} [properties] Properties to set
                     * @returns {google.logging.v2.LogView} LogView instance
                     */
                    LogView.create = function create(properties) {
                        return new LogView(properties);
                    };
    
                    /**
                     * Encodes the specified LogView message. Does not implicitly {@link google.logging.v2.LogView.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.LogView
                     * @static
                     * @param {google.logging.v2.ILogView} message LogView message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    LogView.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        if (message.description != null && Object.hasOwnProperty.call(message, "description"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.description);
                        if (message.createTime != null && Object.hasOwnProperty.call(message, "createTime"))
                            $root.google.protobuf.Timestamp.encode(message.createTime, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                        if (message.updateTime != null && Object.hasOwnProperty.call(message, "updateTime"))
                            $root.google.protobuf.Timestamp.encode(message.updateTime, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                        if (message.filter != null && Object.hasOwnProperty.call(message, "filter"))
                            writer.uint32(/* id 7, wireType 2 =*/58).string(message.filter);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified LogView message, length delimited. Does not implicitly {@link google.logging.v2.LogView.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.LogView
                     * @static
                     * @param {google.logging.v2.ILogView} message LogView message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    LogView.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a LogView message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.LogView
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.LogView} LogView
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    LogView.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.LogView();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.name = reader.string();
                                break;
                            case 3:
                                message.description = reader.string();
                                break;
                            case 4:
                                message.createTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                break;
                            case 5:
                                message.updateTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                break;
                            case 7:
                                message.filter = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a LogView message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.LogView
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.LogView} LogView
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    LogView.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a LogView message.
                     * @function verify
                     * @memberof google.logging.v2.LogView
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    LogView.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        if (message.description != null && message.hasOwnProperty("description"))
                            if (!$util.isString(message.description))
                                return "description: string expected";
                        if (message.createTime != null && message.hasOwnProperty("createTime")) {
                            var error = $root.google.protobuf.Timestamp.verify(message.createTime);
                            if (error)
                                return "createTime." + error;
                        }
                        if (message.updateTime != null && message.hasOwnProperty("updateTime")) {
                            var error = $root.google.protobuf.Timestamp.verify(message.updateTime);
                            if (error)
                                return "updateTime." + error;
                        }
                        if (message.filter != null && message.hasOwnProperty("filter"))
                            if (!$util.isString(message.filter))
                                return "filter: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a LogView message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.LogView
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.LogView} LogView
                     */
                    LogView.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.LogView)
                            return object;
                        var message = new $root.google.logging.v2.LogView();
                        if (object.name != null)
                            message.name = String(object.name);
                        if (object.description != null)
                            message.description = String(object.description);
                        if (object.createTime != null) {
                            if (typeof object.createTime !== "object")
                                throw TypeError(".google.logging.v2.LogView.createTime: object expected");
                            message.createTime = $root.google.protobuf.Timestamp.fromObject(object.createTime);
                        }
                        if (object.updateTime != null) {
                            if (typeof object.updateTime !== "object")
                                throw TypeError(".google.logging.v2.LogView.updateTime: object expected");
                            message.updateTime = $root.google.protobuf.Timestamp.fromObject(object.updateTime);
                        }
                        if (object.filter != null)
                            message.filter = String(object.filter);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a LogView message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.LogView
                     * @static
                     * @param {google.logging.v2.LogView} message LogView
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    LogView.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.name = "";
                            object.description = "";
                            object.createTime = null;
                            object.updateTime = null;
                            object.filter = "";
                        }
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        if (message.description != null && message.hasOwnProperty("description"))
                            object.description = message.description;
                        if (message.createTime != null && message.hasOwnProperty("createTime"))
                            object.createTime = $root.google.protobuf.Timestamp.toObject(message.createTime, options);
                        if (message.updateTime != null && message.hasOwnProperty("updateTime"))
                            object.updateTime = $root.google.protobuf.Timestamp.toObject(message.updateTime, options);
                        if (message.filter != null && message.hasOwnProperty("filter"))
                            object.filter = message.filter;
                        return object;
                    };
    
                    /**
                     * Converts this LogView to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.LogView
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    LogView.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return LogView;
                })();
    
                v2.LogSink = (function() {
    
                    /**
                     * Properties of a LogSink.
                     * @memberof google.logging.v2
                     * @interface ILogSink
                     * @property {string|null} [name] LogSink name
                     * @property {string|null} [destination] LogSink destination
                     * @property {string|null} [filter] LogSink filter
                     * @property {string|null} [description] LogSink description
                     * @property {boolean|null} [disabled] LogSink disabled
                     * @property {Array.<google.logging.v2.ILogExclusion>|null} [exclusions] LogSink exclusions
                     * @property {google.logging.v2.LogSink.VersionFormat|null} [outputVersionFormat] LogSink outputVersionFormat
                     * @property {string|null} [writerIdentity] LogSink writerIdentity
                     * @property {boolean|null} [includeChildren] LogSink includeChildren
                     * @property {google.logging.v2.IBigQueryOptions|null} [bigqueryOptions] LogSink bigqueryOptions
                     * @property {google.protobuf.ITimestamp|null} [createTime] LogSink createTime
                     * @property {google.protobuf.ITimestamp|null} [updateTime] LogSink updateTime
                     */
    
                    /**
                     * Constructs a new LogSink.
                     * @memberof google.logging.v2
                     * @classdesc Represents a LogSink.
                     * @implements ILogSink
                     * @constructor
                     * @param {google.logging.v2.ILogSink=} [properties] Properties to set
                     */
                    function LogSink(properties) {
                        this.exclusions = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * LogSink name.
                     * @member {string} name
                     * @memberof google.logging.v2.LogSink
                     * @instance
                     */
                    LogSink.prototype.name = "";
    
                    /**
                     * LogSink destination.
                     * @member {string} destination
                     * @memberof google.logging.v2.LogSink
                     * @instance
                     */
                    LogSink.prototype.destination = "";
    
                    /**
                     * LogSink filter.
                     * @member {string} filter
                     * @memberof google.logging.v2.LogSink
                     * @instance
                     */
                    LogSink.prototype.filter = "";
    
                    /**
                     * LogSink description.
                     * @member {string} description
                     * @memberof google.logging.v2.LogSink
                     * @instance
                     */
                    LogSink.prototype.description = "";
    
                    /**
                     * LogSink disabled.
                     * @member {boolean} disabled
                     * @memberof google.logging.v2.LogSink
                     * @instance
                     */
                    LogSink.prototype.disabled = false;
    
                    /**
                     * LogSink exclusions.
                     * @member {Array.<google.logging.v2.ILogExclusion>} exclusions
                     * @memberof google.logging.v2.LogSink
                     * @instance
                     */
                    LogSink.prototype.exclusions = $util.emptyArray;
    
                    /**
                     * LogSink outputVersionFormat.
                     * @member {google.logging.v2.LogSink.VersionFormat} outputVersionFormat
                     * @memberof google.logging.v2.LogSink
                     * @instance
                     */
                    LogSink.prototype.outputVersionFormat = 0;
    
                    /**
                     * LogSink writerIdentity.
                     * @member {string} writerIdentity
                     * @memberof google.logging.v2.LogSink
                     * @instance
                     */
                    LogSink.prototype.writerIdentity = "";
    
                    /**
                     * LogSink includeChildren.
                     * @member {boolean} includeChildren
                     * @memberof google.logging.v2.LogSink
                     * @instance
                     */
                    LogSink.prototype.includeChildren = false;
    
                    /**
                     * LogSink bigqueryOptions.
                     * @member {google.logging.v2.IBigQueryOptions|null|undefined} bigqueryOptions
                     * @memberof google.logging.v2.LogSink
                     * @instance
                     */
                    LogSink.prototype.bigqueryOptions = null;
    
                    /**
                     * LogSink createTime.
                     * @member {google.protobuf.ITimestamp|null|undefined} createTime
                     * @memberof google.logging.v2.LogSink
                     * @instance
                     */
                    LogSink.prototype.createTime = null;
    
                    /**
                     * LogSink updateTime.
                     * @member {google.protobuf.ITimestamp|null|undefined} updateTime
                     * @memberof google.logging.v2.LogSink
                     * @instance
                     */
                    LogSink.prototype.updateTime = null;
    
                    // OneOf field names bound to virtual getters and setters
                    var $oneOfFields;
    
                    /**
                     * LogSink options.
                     * @member {"bigqueryOptions"|undefined} options
                     * @memberof google.logging.v2.LogSink
                     * @instance
                     */
                    Object.defineProperty(LogSink.prototype, "options", {
                        get: $util.oneOfGetter($oneOfFields = ["bigqueryOptions"]),
                        set: $util.oneOfSetter($oneOfFields)
                    });
    
                    /**
                     * Creates a new LogSink instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.LogSink
                     * @static
                     * @param {google.logging.v2.ILogSink=} [properties] Properties to set
                     * @returns {google.logging.v2.LogSink} LogSink instance
                     */
                    LogSink.create = function create(properties) {
                        return new LogSink(properties);
                    };
    
                    /**
                     * Encodes the specified LogSink message. Does not implicitly {@link google.logging.v2.LogSink.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.LogSink
                     * @static
                     * @param {google.logging.v2.ILogSink} message LogSink message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    LogSink.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        if (message.destination != null && Object.hasOwnProperty.call(message, "destination"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.destination);
                        if (message.filter != null && Object.hasOwnProperty.call(message, "filter"))
                            writer.uint32(/* id 5, wireType 2 =*/42).string(message.filter);
                        if (message.outputVersionFormat != null && Object.hasOwnProperty.call(message, "outputVersionFormat"))
                            writer.uint32(/* id 6, wireType 0 =*/48).int32(message.outputVersionFormat);
                        if (message.writerIdentity != null && Object.hasOwnProperty.call(message, "writerIdentity"))
                            writer.uint32(/* id 8, wireType 2 =*/66).string(message.writerIdentity);
                        if (message.includeChildren != null && Object.hasOwnProperty.call(message, "includeChildren"))
                            writer.uint32(/* id 9, wireType 0 =*/72).bool(message.includeChildren);
                        if (message.bigqueryOptions != null && Object.hasOwnProperty.call(message, "bigqueryOptions"))
                            $root.google.logging.v2.BigQueryOptions.encode(message.bigqueryOptions, writer.uint32(/* id 12, wireType 2 =*/98).fork()).ldelim();
                        if (message.createTime != null && Object.hasOwnProperty.call(message, "createTime"))
                            $root.google.protobuf.Timestamp.encode(message.createTime, writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim();
                        if (message.updateTime != null && Object.hasOwnProperty.call(message, "updateTime"))
                            $root.google.protobuf.Timestamp.encode(message.updateTime, writer.uint32(/* id 14, wireType 2 =*/114).fork()).ldelim();
                        if (message.exclusions != null && message.exclusions.length)
                            for (var i = 0; i < message.exclusions.length; ++i)
                                $root.google.logging.v2.LogExclusion.encode(message.exclusions[i], writer.uint32(/* id 16, wireType 2 =*/130).fork()).ldelim();
                        if (message.description != null && Object.hasOwnProperty.call(message, "description"))
                            writer.uint32(/* id 18, wireType 2 =*/146).string(message.description);
                        if (message.disabled != null && Object.hasOwnProperty.call(message, "disabled"))
                            writer.uint32(/* id 19, wireType 0 =*/152).bool(message.disabled);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified LogSink message, length delimited. Does not implicitly {@link google.logging.v2.LogSink.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.LogSink
                     * @static
                     * @param {google.logging.v2.ILogSink} message LogSink message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    LogSink.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a LogSink message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.LogSink
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.LogSink} LogSink
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    LogSink.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.LogSink();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.name = reader.string();
                                break;
                            case 3:
                                message.destination = reader.string();
                                break;
                            case 5:
                                message.filter = reader.string();
                                break;
                            case 18:
                                message.description = reader.string();
                                break;
                            case 19:
                                message.disabled = reader.bool();
                                break;
                            case 16:
                                if (!(message.exclusions && message.exclusions.length))
                                    message.exclusions = [];
                                message.exclusions.push($root.google.logging.v2.LogExclusion.decode(reader, reader.uint32()));
                                break;
                            case 6:
                                message.outputVersionFormat = reader.int32();
                                break;
                            case 8:
                                message.writerIdentity = reader.string();
                                break;
                            case 9:
                                message.includeChildren = reader.bool();
                                break;
                            case 12:
                                message.bigqueryOptions = $root.google.logging.v2.BigQueryOptions.decode(reader, reader.uint32());
                                break;
                            case 13:
                                message.createTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                break;
                            case 14:
                                message.updateTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a LogSink message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.LogSink
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.LogSink} LogSink
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    LogSink.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a LogSink message.
                     * @function verify
                     * @memberof google.logging.v2.LogSink
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    LogSink.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        var properties = {};
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        if (message.destination != null && message.hasOwnProperty("destination"))
                            if (!$util.isString(message.destination))
                                return "destination: string expected";
                        if (message.filter != null && message.hasOwnProperty("filter"))
                            if (!$util.isString(message.filter))
                                return "filter: string expected";
                        if (message.description != null && message.hasOwnProperty("description"))
                            if (!$util.isString(message.description))
                                return "description: string expected";
                        if (message.disabled != null && message.hasOwnProperty("disabled"))
                            if (typeof message.disabled !== "boolean")
                                return "disabled: boolean expected";
                        if (message.exclusions != null && message.hasOwnProperty("exclusions")) {
                            if (!Array.isArray(message.exclusions))
                                return "exclusions: array expected";
                            for (var i = 0; i < message.exclusions.length; ++i) {
                                var error = $root.google.logging.v2.LogExclusion.verify(message.exclusions[i]);
                                if (error)
                                    return "exclusions." + error;
                            }
                        }
                        if (message.outputVersionFormat != null && message.hasOwnProperty("outputVersionFormat"))
                            switch (message.outputVersionFormat) {
                            default:
                                return "outputVersionFormat: enum value expected";
                            case 0:
                            case 1:
                            case 2:
                                break;
                            }
                        if (message.writerIdentity != null && message.hasOwnProperty("writerIdentity"))
                            if (!$util.isString(message.writerIdentity))
                                return "writerIdentity: string expected";
                        if (message.includeChildren != null && message.hasOwnProperty("includeChildren"))
                            if (typeof message.includeChildren !== "boolean")
                                return "includeChildren: boolean expected";
                        if (message.bigqueryOptions != null && message.hasOwnProperty("bigqueryOptions")) {
                            properties.options = 1;
                            {
                                var error = $root.google.logging.v2.BigQueryOptions.verify(message.bigqueryOptions);
                                if (error)
                                    return "bigqueryOptions." + error;
                            }
                        }
                        if (message.createTime != null && message.hasOwnProperty("createTime")) {
                            var error = $root.google.protobuf.Timestamp.verify(message.createTime);
                            if (error)
                                return "createTime." + error;
                        }
                        if (message.updateTime != null && message.hasOwnProperty("updateTime")) {
                            var error = $root.google.protobuf.Timestamp.verify(message.updateTime);
                            if (error)
                                return "updateTime." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a LogSink message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.LogSink
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.LogSink} LogSink
                     */
                    LogSink.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.LogSink)
                            return object;
                        var message = new $root.google.logging.v2.LogSink();
                        if (object.name != null)
                            message.name = String(object.name);
                        if (object.destination != null)
                            message.destination = String(object.destination);
                        if (object.filter != null)
                            message.filter = String(object.filter);
                        if (object.description != null)
                            message.description = String(object.description);
                        if (object.disabled != null)
                            message.disabled = Boolean(object.disabled);
                        if (object.exclusions) {
                            if (!Array.isArray(object.exclusions))
                                throw TypeError(".google.logging.v2.LogSink.exclusions: array expected");
                            message.exclusions = [];
                            for (var i = 0; i < object.exclusions.length; ++i) {
                                if (typeof object.exclusions[i] !== "object")
                                    throw TypeError(".google.logging.v2.LogSink.exclusions: object expected");
                                message.exclusions[i] = $root.google.logging.v2.LogExclusion.fromObject(object.exclusions[i]);
                            }
                        }
                        switch (object.outputVersionFormat) {
                        case "VERSION_FORMAT_UNSPECIFIED":
                        case 0:
                            message.outputVersionFormat = 0;
                            break;
                        case "V2":
                        case 1:
                            message.outputVersionFormat = 1;
                            break;
                        case "V1":
                        case 2:
                            message.outputVersionFormat = 2;
                            break;
                        }
                        if (object.writerIdentity != null)
                            message.writerIdentity = String(object.writerIdentity);
                        if (object.includeChildren != null)
                            message.includeChildren = Boolean(object.includeChildren);
                        if (object.bigqueryOptions != null) {
                            if (typeof object.bigqueryOptions !== "object")
                                throw TypeError(".google.logging.v2.LogSink.bigqueryOptions: object expected");
                            message.bigqueryOptions = $root.google.logging.v2.BigQueryOptions.fromObject(object.bigqueryOptions);
                        }
                        if (object.createTime != null) {
                            if (typeof object.createTime !== "object")
                                throw TypeError(".google.logging.v2.LogSink.createTime: object expected");
                            message.createTime = $root.google.protobuf.Timestamp.fromObject(object.createTime);
                        }
                        if (object.updateTime != null) {
                            if (typeof object.updateTime !== "object")
                                throw TypeError(".google.logging.v2.LogSink.updateTime: object expected");
                            message.updateTime = $root.google.protobuf.Timestamp.fromObject(object.updateTime);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a LogSink message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.LogSink
                     * @static
                     * @param {google.logging.v2.LogSink} message LogSink
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    LogSink.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.exclusions = [];
                        if (options.defaults) {
                            object.name = "";
                            object.destination = "";
                            object.filter = "";
                            object.outputVersionFormat = options.enums === String ? "VERSION_FORMAT_UNSPECIFIED" : 0;
                            object.writerIdentity = "";
                            object.includeChildren = false;
                            object.createTime = null;
                            object.updateTime = null;
                            object.description = "";
                            object.disabled = false;
                        }
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        if (message.destination != null && message.hasOwnProperty("destination"))
                            object.destination = message.destination;
                        if (message.filter != null && message.hasOwnProperty("filter"))
                            object.filter = message.filter;
                        if (message.outputVersionFormat != null && message.hasOwnProperty("outputVersionFormat"))
                            object.outputVersionFormat = options.enums === String ? $root.google.logging.v2.LogSink.VersionFormat[message.outputVersionFormat] : message.outputVersionFormat;
                        if (message.writerIdentity != null && message.hasOwnProperty("writerIdentity"))
                            object.writerIdentity = message.writerIdentity;
                        if (message.includeChildren != null && message.hasOwnProperty("includeChildren"))
                            object.includeChildren = message.includeChildren;
                        if (message.bigqueryOptions != null && message.hasOwnProperty("bigqueryOptions")) {
                            object.bigqueryOptions = $root.google.logging.v2.BigQueryOptions.toObject(message.bigqueryOptions, options);
                            if (options.oneofs)
                                object.options = "bigqueryOptions";
                        }
                        if (message.createTime != null && message.hasOwnProperty("createTime"))
                            object.createTime = $root.google.protobuf.Timestamp.toObject(message.createTime, options);
                        if (message.updateTime != null && message.hasOwnProperty("updateTime"))
                            object.updateTime = $root.google.protobuf.Timestamp.toObject(message.updateTime, options);
                        if (message.exclusions && message.exclusions.length) {
                            object.exclusions = [];
                            for (var j = 0; j < message.exclusions.length; ++j)
                                object.exclusions[j] = $root.google.logging.v2.LogExclusion.toObject(message.exclusions[j], options);
                        }
                        if (message.description != null && message.hasOwnProperty("description"))
                            object.description = message.description;
                        if (message.disabled != null && message.hasOwnProperty("disabled"))
                            object.disabled = message.disabled;
                        return object;
                    };
    
                    /**
                     * Converts this LogSink to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.LogSink
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    LogSink.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * VersionFormat enum.
                     * @name google.logging.v2.LogSink.VersionFormat
                     * @enum {number}
                     * @property {number} VERSION_FORMAT_UNSPECIFIED=0 VERSION_FORMAT_UNSPECIFIED value
                     * @property {number} V2=1 V2 value
                     * @property {number} V1=2 V1 value
                     */
                    LogSink.VersionFormat = (function() {
                        var valuesById = {}, values = Object.create(valuesById);
                        values[valuesById[0] = "VERSION_FORMAT_UNSPECIFIED"] = 0;
                        values[valuesById[1] = "V2"] = 1;
                        values[valuesById[2] = "V1"] = 2;
                        return values;
                    })();
    
                    return LogSink;
                })();
    
                v2.BigQueryOptions = (function() {
    
                    /**
                     * Properties of a BigQueryOptions.
                     * @memberof google.logging.v2
                     * @interface IBigQueryOptions
                     * @property {boolean|null} [usePartitionedTables] BigQueryOptions usePartitionedTables
                     * @property {boolean|null} [usesTimestampColumnPartitioning] BigQueryOptions usesTimestampColumnPartitioning
                     */
    
                    /**
                     * Constructs a new BigQueryOptions.
                     * @memberof google.logging.v2
                     * @classdesc Represents a BigQueryOptions.
                     * @implements IBigQueryOptions
                     * @constructor
                     * @param {google.logging.v2.IBigQueryOptions=} [properties] Properties to set
                     */
                    function BigQueryOptions(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * BigQueryOptions usePartitionedTables.
                     * @member {boolean} usePartitionedTables
                     * @memberof google.logging.v2.BigQueryOptions
                     * @instance
                     */
                    BigQueryOptions.prototype.usePartitionedTables = false;
    
                    /**
                     * BigQueryOptions usesTimestampColumnPartitioning.
                     * @member {boolean} usesTimestampColumnPartitioning
                     * @memberof google.logging.v2.BigQueryOptions
                     * @instance
                     */
                    BigQueryOptions.prototype.usesTimestampColumnPartitioning = false;
    
                    /**
                     * Creates a new BigQueryOptions instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.BigQueryOptions
                     * @static
                     * @param {google.logging.v2.IBigQueryOptions=} [properties] Properties to set
                     * @returns {google.logging.v2.BigQueryOptions} BigQueryOptions instance
                     */
                    BigQueryOptions.create = function create(properties) {
                        return new BigQueryOptions(properties);
                    };
    
                    /**
                     * Encodes the specified BigQueryOptions message. Does not implicitly {@link google.logging.v2.BigQueryOptions.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.BigQueryOptions
                     * @static
                     * @param {google.logging.v2.IBigQueryOptions} message BigQueryOptions message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    BigQueryOptions.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.usePartitionedTables != null && Object.hasOwnProperty.call(message, "usePartitionedTables"))
                            writer.uint32(/* id 1, wireType 0 =*/8).bool(message.usePartitionedTables);
                        if (message.usesTimestampColumnPartitioning != null && Object.hasOwnProperty.call(message, "usesTimestampColumnPartitioning"))
                            writer.uint32(/* id 3, wireType 0 =*/24).bool(message.usesTimestampColumnPartitioning);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified BigQueryOptions message, length delimited. Does not implicitly {@link google.logging.v2.BigQueryOptions.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.BigQueryOptions
                     * @static
                     * @param {google.logging.v2.IBigQueryOptions} message BigQueryOptions message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    BigQueryOptions.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a BigQueryOptions message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.BigQueryOptions
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.BigQueryOptions} BigQueryOptions
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    BigQueryOptions.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.BigQueryOptions();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.usePartitionedTables = reader.bool();
                                break;
                            case 3:
                                message.usesTimestampColumnPartitioning = reader.bool();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a BigQueryOptions message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.BigQueryOptions
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.BigQueryOptions} BigQueryOptions
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    BigQueryOptions.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a BigQueryOptions message.
                     * @function verify
                     * @memberof google.logging.v2.BigQueryOptions
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    BigQueryOptions.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.usePartitionedTables != null && message.hasOwnProperty("usePartitionedTables"))
                            if (typeof message.usePartitionedTables !== "boolean")
                                return "usePartitionedTables: boolean expected";
                        if (message.usesTimestampColumnPartitioning != null && message.hasOwnProperty("usesTimestampColumnPartitioning"))
                            if (typeof message.usesTimestampColumnPartitioning !== "boolean")
                                return "usesTimestampColumnPartitioning: boolean expected";
                        return null;
                    };
    
                    /**
                     * Creates a BigQueryOptions message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.BigQueryOptions
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.BigQueryOptions} BigQueryOptions
                     */
                    BigQueryOptions.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.BigQueryOptions)
                            return object;
                        var message = new $root.google.logging.v2.BigQueryOptions();
                        if (object.usePartitionedTables != null)
                            message.usePartitionedTables = Boolean(object.usePartitionedTables);
                        if (object.usesTimestampColumnPartitioning != null)
                            message.usesTimestampColumnPartitioning = Boolean(object.usesTimestampColumnPartitioning);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a BigQueryOptions message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.BigQueryOptions
                     * @static
                     * @param {google.logging.v2.BigQueryOptions} message BigQueryOptions
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    BigQueryOptions.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.usePartitionedTables = false;
                            object.usesTimestampColumnPartitioning = false;
                        }
                        if (message.usePartitionedTables != null && message.hasOwnProperty("usePartitionedTables"))
                            object.usePartitionedTables = message.usePartitionedTables;
                        if (message.usesTimestampColumnPartitioning != null && message.hasOwnProperty("usesTimestampColumnPartitioning"))
                            object.usesTimestampColumnPartitioning = message.usesTimestampColumnPartitioning;
                        return object;
                    };
    
                    /**
                     * Converts this BigQueryOptions to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.BigQueryOptions
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    BigQueryOptions.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return BigQueryOptions;
                })();
    
                v2.ListBucketsRequest = (function() {
    
                    /**
                     * Properties of a ListBucketsRequest.
                     * @memberof google.logging.v2
                     * @interface IListBucketsRequest
                     * @property {string|null} [parent] ListBucketsRequest parent
                     * @property {string|null} [pageToken] ListBucketsRequest pageToken
                     * @property {number|null} [pageSize] ListBucketsRequest pageSize
                     */
    
                    /**
                     * Constructs a new ListBucketsRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a ListBucketsRequest.
                     * @implements IListBucketsRequest
                     * @constructor
                     * @param {google.logging.v2.IListBucketsRequest=} [properties] Properties to set
                     */
                    function ListBucketsRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ListBucketsRequest parent.
                     * @member {string} parent
                     * @memberof google.logging.v2.ListBucketsRequest
                     * @instance
                     */
                    ListBucketsRequest.prototype.parent = "";
    
                    /**
                     * ListBucketsRequest pageToken.
                     * @member {string} pageToken
                     * @memberof google.logging.v2.ListBucketsRequest
                     * @instance
                     */
                    ListBucketsRequest.prototype.pageToken = "";
    
                    /**
                     * ListBucketsRequest pageSize.
                     * @member {number} pageSize
                     * @memberof google.logging.v2.ListBucketsRequest
                     * @instance
                     */
                    ListBucketsRequest.prototype.pageSize = 0;
    
                    /**
                     * Creates a new ListBucketsRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.ListBucketsRequest
                     * @static
                     * @param {google.logging.v2.IListBucketsRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.ListBucketsRequest} ListBucketsRequest instance
                     */
                    ListBucketsRequest.create = function create(properties) {
                        return new ListBucketsRequest(properties);
                    };
    
                    /**
                     * Encodes the specified ListBucketsRequest message. Does not implicitly {@link google.logging.v2.ListBucketsRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.ListBucketsRequest
                     * @static
                     * @param {google.logging.v2.IListBucketsRequest} message ListBucketsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListBucketsRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                        if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.pageToken);
                        if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                            writer.uint32(/* id 3, wireType 0 =*/24).int32(message.pageSize);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ListBucketsRequest message, length delimited. Does not implicitly {@link google.logging.v2.ListBucketsRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.ListBucketsRequest
                     * @static
                     * @param {google.logging.v2.IListBucketsRequest} message ListBucketsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListBucketsRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ListBucketsRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.ListBucketsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.ListBucketsRequest} ListBucketsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListBucketsRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.ListBucketsRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.parent = reader.string();
                                break;
                            case 2:
                                message.pageToken = reader.string();
                                break;
                            case 3:
                                message.pageSize = reader.int32();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ListBucketsRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.ListBucketsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.ListBucketsRequest} ListBucketsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListBucketsRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ListBucketsRequest message.
                     * @function verify
                     * @memberof google.logging.v2.ListBucketsRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ListBucketsRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.parent != null && message.hasOwnProperty("parent"))
                            if (!$util.isString(message.parent))
                                return "parent: string expected";
                        if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                            if (!$util.isString(message.pageToken))
                                return "pageToken: string expected";
                        if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                            if (!$util.isInteger(message.pageSize))
                                return "pageSize: integer expected";
                        return null;
                    };
    
                    /**
                     * Creates a ListBucketsRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.ListBucketsRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.ListBucketsRequest} ListBucketsRequest
                     */
                    ListBucketsRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.ListBucketsRequest)
                            return object;
                        var message = new $root.google.logging.v2.ListBucketsRequest();
                        if (object.parent != null)
                            message.parent = String(object.parent);
                        if (object.pageToken != null)
                            message.pageToken = String(object.pageToken);
                        if (object.pageSize != null)
                            message.pageSize = object.pageSize | 0;
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ListBucketsRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.ListBucketsRequest
                     * @static
                     * @param {google.logging.v2.ListBucketsRequest} message ListBucketsRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ListBucketsRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.parent = "";
                            object.pageToken = "";
                            object.pageSize = 0;
                        }
                        if (message.parent != null && message.hasOwnProperty("parent"))
                            object.parent = message.parent;
                        if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                            object.pageToken = message.pageToken;
                        if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                            object.pageSize = message.pageSize;
                        return object;
                    };
    
                    /**
                     * Converts this ListBucketsRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.ListBucketsRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ListBucketsRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return ListBucketsRequest;
                })();
    
                v2.ListBucketsResponse = (function() {
    
                    /**
                     * Properties of a ListBucketsResponse.
                     * @memberof google.logging.v2
                     * @interface IListBucketsResponse
                     * @property {Array.<google.logging.v2.ILogBucket>|null} [buckets] ListBucketsResponse buckets
                     * @property {string|null} [nextPageToken] ListBucketsResponse nextPageToken
                     */
    
                    /**
                     * Constructs a new ListBucketsResponse.
                     * @memberof google.logging.v2
                     * @classdesc Represents a ListBucketsResponse.
                     * @implements IListBucketsResponse
                     * @constructor
                     * @param {google.logging.v2.IListBucketsResponse=} [properties] Properties to set
                     */
                    function ListBucketsResponse(properties) {
                        this.buckets = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ListBucketsResponse buckets.
                     * @member {Array.<google.logging.v2.ILogBucket>} buckets
                     * @memberof google.logging.v2.ListBucketsResponse
                     * @instance
                     */
                    ListBucketsResponse.prototype.buckets = $util.emptyArray;
    
                    /**
                     * ListBucketsResponse nextPageToken.
                     * @member {string} nextPageToken
                     * @memberof google.logging.v2.ListBucketsResponse
                     * @instance
                     */
                    ListBucketsResponse.prototype.nextPageToken = "";
    
                    /**
                     * Creates a new ListBucketsResponse instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.ListBucketsResponse
                     * @static
                     * @param {google.logging.v2.IListBucketsResponse=} [properties] Properties to set
                     * @returns {google.logging.v2.ListBucketsResponse} ListBucketsResponse instance
                     */
                    ListBucketsResponse.create = function create(properties) {
                        return new ListBucketsResponse(properties);
                    };
    
                    /**
                     * Encodes the specified ListBucketsResponse message. Does not implicitly {@link google.logging.v2.ListBucketsResponse.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.ListBucketsResponse
                     * @static
                     * @param {google.logging.v2.IListBucketsResponse} message ListBucketsResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListBucketsResponse.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.buckets != null && message.buckets.length)
                            for (var i = 0; i < message.buckets.length; ++i)
                                $root.google.logging.v2.LogBucket.encode(message.buckets[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ListBucketsResponse message, length delimited. Does not implicitly {@link google.logging.v2.ListBucketsResponse.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.ListBucketsResponse
                     * @static
                     * @param {google.logging.v2.IListBucketsResponse} message ListBucketsResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListBucketsResponse.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ListBucketsResponse message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.ListBucketsResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.ListBucketsResponse} ListBucketsResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListBucketsResponse.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.ListBucketsResponse();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                if (!(message.buckets && message.buckets.length))
                                    message.buckets = [];
                                message.buckets.push($root.google.logging.v2.LogBucket.decode(reader, reader.uint32()));
                                break;
                            case 2:
                                message.nextPageToken = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ListBucketsResponse message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.ListBucketsResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.ListBucketsResponse} ListBucketsResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListBucketsResponse.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ListBucketsResponse message.
                     * @function verify
                     * @memberof google.logging.v2.ListBucketsResponse
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ListBucketsResponse.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.buckets != null && message.hasOwnProperty("buckets")) {
                            if (!Array.isArray(message.buckets))
                                return "buckets: array expected";
                            for (var i = 0; i < message.buckets.length; ++i) {
                                var error = $root.google.logging.v2.LogBucket.verify(message.buckets[i]);
                                if (error)
                                    return "buckets." + error;
                            }
                        }
                        if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                            if (!$util.isString(message.nextPageToken))
                                return "nextPageToken: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a ListBucketsResponse message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.ListBucketsResponse
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.ListBucketsResponse} ListBucketsResponse
                     */
                    ListBucketsResponse.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.ListBucketsResponse)
                            return object;
                        var message = new $root.google.logging.v2.ListBucketsResponse();
                        if (object.buckets) {
                            if (!Array.isArray(object.buckets))
                                throw TypeError(".google.logging.v2.ListBucketsResponse.buckets: array expected");
                            message.buckets = [];
                            for (var i = 0; i < object.buckets.length; ++i) {
                                if (typeof object.buckets[i] !== "object")
                                    throw TypeError(".google.logging.v2.ListBucketsResponse.buckets: object expected");
                                message.buckets[i] = $root.google.logging.v2.LogBucket.fromObject(object.buckets[i]);
                            }
                        }
                        if (object.nextPageToken != null)
                            message.nextPageToken = String(object.nextPageToken);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ListBucketsResponse message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.ListBucketsResponse
                     * @static
                     * @param {google.logging.v2.ListBucketsResponse} message ListBucketsResponse
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ListBucketsResponse.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.buckets = [];
                        if (options.defaults)
                            object.nextPageToken = "";
                        if (message.buckets && message.buckets.length) {
                            object.buckets = [];
                            for (var j = 0; j < message.buckets.length; ++j)
                                object.buckets[j] = $root.google.logging.v2.LogBucket.toObject(message.buckets[j], options);
                        }
                        if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                            object.nextPageToken = message.nextPageToken;
                        return object;
                    };
    
                    /**
                     * Converts this ListBucketsResponse to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.ListBucketsResponse
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ListBucketsResponse.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return ListBucketsResponse;
                })();
    
                v2.CreateBucketRequest = (function() {
    
                    /**
                     * Properties of a CreateBucketRequest.
                     * @memberof google.logging.v2
                     * @interface ICreateBucketRequest
                     * @property {string|null} [parent] CreateBucketRequest parent
                     * @property {string|null} [bucketId] CreateBucketRequest bucketId
                     * @property {google.logging.v2.ILogBucket|null} [bucket] CreateBucketRequest bucket
                     */
    
                    /**
                     * Constructs a new CreateBucketRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a CreateBucketRequest.
                     * @implements ICreateBucketRequest
                     * @constructor
                     * @param {google.logging.v2.ICreateBucketRequest=} [properties] Properties to set
                     */
                    function CreateBucketRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * CreateBucketRequest parent.
                     * @member {string} parent
                     * @memberof google.logging.v2.CreateBucketRequest
                     * @instance
                     */
                    CreateBucketRequest.prototype.parent = "";
    
                    /**
                     * CreateBucketRequest bucketId.
                     * @member {string} bucketId
                     * @memberof google.logging.v2.CreateBucketRequest
                     * @instance
                     */
                    CreateBucketRequest.prototype.bucketId = "";
    
                    /**
                     * CreateBucketRequest bucket.
                     * @member {google.logging.v2.ILogBucket|null|undefined} bucket
                     * @memberof google.logging.v2.CreateBucketRequest
                     * @instance
                     */
                    CreateBucketRequest.prototype.bucket = null;
    
                    /**
                     * Creates a new CreateBucketRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.CreateBucketRequest
                     * @static
                     * @param {google.logging.v2.ICreateBucketRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.CreateBucketRequest} CreateBucketRequest instance
                     */
                    CreateBucketRequest.create = function create(properties) {
                        return new CreateBucketRequest(properties);
                    };
    
                    /**
                     * Encodes the specified CreateBucketRequest message. Does not implicitly {@link google.logging.v2.CreateBucketRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.CreateBucketRequest
                     * @static
                     * @param {google.logging.v2.ICreateBucketRequest} message CreateBucketRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    CreateBucketRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                        if (message.bucketId != null && Object.hasOwnProperty.call(message, "bucketId"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.bucketId);
                        if (message.bucket != null && Object.hasOwnProperty.call(message, "bucket"))
                            $root.google.logging.v2.LogBucket.encode(message.bucket, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified CreateBucketRequest message, length delimited. Does not implicitly {@link google.logging.v2.CreateBucketRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.CreateBucketRequest
                     * @static
                     * @param {google.logging.v2.ICreateBucketRequest} message CreateBucketRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    CreateBucketRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a CreateBucketRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.CreateBucketRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.CreateBucketRequest} CreateBucketRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    CreateBucketRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.CreateBucketRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.parent = reader.string();
                                break;
                            case 2:
                                message.bucketId = reader.string();
                                break;
                            case 3:
                                message.bucket = $root.google.logging.v2.LogBucket.decode(reader, reader.uint32());
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a CreateBucketRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.CreateBucketRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.CreateBucketRequest} CreateBucketRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    CreateBucketRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a CreateBucketRequest message.
                     * @function verify
                     * @memberof google.logging.v2.CreateBucketRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    CreateBucketRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.parent != null && message.hasOwnProperty("parent"))
                            if (!$util.isString(message.parent))
                                return "parent: string expected";
                        if (message.bucketId != null && message.hasOwnProperty("bucketId"))
                            if (!$util.isString(message.bucketId))
                                return "bucketId: string expected";
                        if (message.bucket != null && message.hasOwnProperty("bucket")) {
                            var error = $root.google.logging.v2.LogBucket.verify(message.bucket);
                            if (error)
                                return "bucket." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a CreateBucketRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.CreateBucketRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.CreateBucketRequest} CreateBucketRequest
                     */
                    CreateBucketRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.CreateBucketRequest)
                            return object;
                        var message = new $root.google.logging.v2.CreateBucketRequest();
                        if (object.parent != null)
                            message.parent = String(object.parent);
                        if (object.bucketId != null)
                            message.bucketId = String(object.bucketId);
                        if (object.bucket != null) {
                            if (typeof object.bucket !== "object")
                                throw TypeError(".google.logging.v2.CreateBucketRequest.bucket: object expected");
                            message.bucket = $root.google.logging.v2.LogBucket.fromObject(object.bucket);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a CreateBucketRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.CreateBucketRequest
                     * @static
                     * @param {google.logging.v2.CreateBucketRequest} message CreateBucketRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    CreateBucketRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.parent = "";
                            object.bucketId = "";
                            object.bucket = null;
                        }
                        if (message.parent != null && message.hasOwnProperty("parent"))
                            object.parent = message.parent;
                        if (message.bucketId != null && message.hasOwnProperty("bucketId"))
                            object.bucketId = message.bucketId;
                        if (message.bucket != null && message.hasOwnProperty("bucket"))
                            object.bucket = $root.google.logging.v2.LogBucket.toObject(message.bucket, options);
                        return object;
                    };
    
                    /**
                     * Converts this CreateBucketRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.CreateBucketRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    CreateBucketRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return CreateBucketRequest;
                })();
    
                v2.UpdateBucketRequest = (function() {
    
                    /**
                     * Properties of an UpdateBucketRequest.
                     * @memberof google.logging.v2
                     * @interface IUpdateBucketRequest
                     * @property {string|null} [name] UpdateBucketRequest name
                     * @property {google.logging.v2.ILogBucket|null} [bucket] UpdateBucketRequest bucket
                     * @property {google.protobuf.IFieldMask|null} [updateMask] UpdateBucketRequest updateMask
                     */
    
                    /**
                     * Constructs a new UpdateBucketRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents an UpdateBucketRequest.
                     * @implements IUpdateBucketRequest
                     * @constructor
                     * @param {google.logging.v2.IUpdateBucketRequest=} [properties] Properties to set
                     */
                    function UpdateBucketRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * UpdateBucketRequest name.
                     * @member {string} name
                     * @memberof google.logging.v2.UpdateBucketRequest
                     * @instance
                     */
                    UpdateBucketRequest.prototype.name = "";
    
                    /**
                     * UpdateBucketRequest bucket.
                     * @member {google.logging.v2.ILogBucket|null|undefined} bucket
                     * @memberof google.logging.v2.UpdateBucketRequest
                     * @instance
                     */
                    UpdateBucketRequest.prototype.bucket = null;
    
                    /**
                     * UpdateBucketRequest updateMask.
                     * @member {google.protobuf.IFieldMask|null|undefined} updateMask
                     * @memberof google.logging.v2.UpdateBucketRequest
                     * @instance
                     */
                    UpdateBucketRequest.prototype.updateMask = null;
    
                    /**
                     * Creates a new UpdateBucketRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.UpdateBucketRequest
                     * @static
                     * @param {google.logging.v2.IUpdateBucketRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.UpdateBucketRequest} UpdateBucketRequest instance
                     */
                    UpdateBucketRequest.create = function create(properties) {
                        return new UpdateBucketRequest(properties);
                    };
    
                    /**
                     * Encodes the specified UpdateBucketRequest message. Does not implicitly {@link google.logging.v2.UpdateBucketRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.UpdateBucketRequest
                     * @static
                     * @param {google.logging.v2.IUpdateBucketRequest} message UpdateBucketRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    UpdateBucketRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        if (message.bucket != null && Object.hasOwnProperty.call(message, "bucket"))
                            $root.google.logging.v2.LogBucket.encode(message.bucket, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.updateMask != null && Object.hasOwnProperty.call(message, "updateMask"))
                            $root.google.protobuf.FieldMask.encode(message.updateMask, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified UpdateBucketRequest message, length delimited. Does not implicitly {@link google.logging.v2.UpdateBucketRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.UpdateBucketRequest
                     * @static
                     * @param {google.logging.v2.IUpdateBucketRequest} message UpdateBucketRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    UpdateBucketRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes an UpdateBucketRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.UpdateBucketRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.UpdateBucketRequest} UpdateBucketRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    UpdateBucketRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.UpdateBucketRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.name = reader.string();
                                break;
                            case 2:
                                message.bucket = $root.google.logging.v2.LogBucket.decode(reader, reader.uint32());
                                break;
                            case 4:
                                message.updateMask = $root.google.protobuf.FieldMask.decode(reader, reader.uint32());
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes an UpdateBucketRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.UpdateBucketRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.UpdateBucketRequest} UpdateBucketRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    UpdateBucketRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies an UpdateBucketRequest message.
                     * @function verify
                     * @memberof google.logging.v2.UpdateBucketRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    UpdateBucketRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        if (message.bucket != null && message.hasOwnProperty("bucket")) {
                            var error = $root.google.logging.v2.LogBucket.verify(message.bucket);
                            if (error)
                                return "bucket." + error;
                        }
                        if (message.updateMask != null && message.hasOwnProperty("updateMask")) {
                            var error = $root.google.protobuf.FieldMask.verify(message.updateMask);
                            if (error)
                                return "updateMask." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates an UpdateBucketRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.UpdateBucketRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.UpdateBucketRequest} UpdateBucketRequest
                     */
                    UpdateBucketRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.UpdateBucketRequest)
                            return object;
                        var message = new $root.google.logging.v2.UpdateBucketRequest();
                        if (object.name != null)
                            message.name = String(object.name);
                        if (object.bucket != null) {
                            if (typeof object.bucket !== "object")
                                throw TypeError(".google.logging.v2.UpdateBucketRequest.bucket: object expected");
                            message.bucket = $root.google.logging.v2.LogBucket.fromObject(object.bucket);
                        }
                        if (object.updateMask != null) {
                            if (typeof object.updateMask !== "object")
                                throw TypeError(".google.logging.v2.UpdateBucketRequest.updateMask: object expected");
                            message.updateMask = $root.google.protobuf.FieldMask.fromObject(object.updateMask);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from an UpdateBucketRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.UpdateBucketRequest
                     * @static
                     * @param {google.logging.v2.UpdateBucketRequest} message UpdateBucketRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    UpdateBucketRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.name = "";
                            object.bucket = null;
                            object.updateMask = null;
                        }
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        if (message.bucket != null && message.hasOwnProperty("bucket"))
                            object.bucket = $root.google.logging.v2.LogBucket.toObject(message.bucket, options);
                        if (message.updateMask != null && message.hasOwnProperty("updateMask"))
                            object.updateMask = $root.google.protobuf.FieldMask.toObject(message.updateMask, options);
                        return object;
                    };
    
                    /**
                     * Converts this UpdateBucketRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.UpdateBucketRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    UpdateBucketRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return UpdateBucketRequest;
                })();
    
                v2.GetBucketRequest = (function() {
    
                    /**
                     * Properties of a GetBucketRequest.
                     * @memberof google.logging.v2
                     * @interface IGetBucketRequest
                     * @property {string|null} [name] GetBucketRequest name
                     */
    
                    /**
                     * Constructs a new GetBucketRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a GetBucketRequest.
                     * @implements IGetBucketRequest
                     * @constructor
                     * @param {google.logging.v2.IGetBucketRequest=} [properties] Properties to set
                     */
                    function GetBucketRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * GetBucketRequest name.
                     * @member {string} name
                     * @memberof google.logging.v2.GetBucketRequest
                     * @instance
                     */
                    GetBucketRequest.prototype.name = "";
    
                    /**
                     * Creates a new GetBucketRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.GetBucketRequest
                     * @static
                     * @param {google.logging.v2.IGetBucketRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.GetBucketRequest} GetBucketRequest instance
                     */
                    GetBucketRequest.create = function create(properties) {
                        return new GetBucketRequest(properties);
                    };
    
                    /**
                     * Encodes the specified GetBucketRequest message. Does not implicitly {@link google.logging.v2.GetBucketRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.GetBucketRequest
                     * @static
                     * @param {google.logging.v2.IGetBucketRequest} message GetBucketRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    GetBucketRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified GetBucketRequest message, length delimited. Does not implicitly {@link google.logging.v2.GetBucketRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.GetBucketRequest
                     * @static
                     * @param {google.logging.v2.IGetBucketRequest} message GetBucketRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    GetBucketRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a GetBucketRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.GetBucketRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.GetBucketRequest} GetBucketRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    GetBucketRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.GetBucketRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.name = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a GetBucketRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.GetBucketRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.GetBucketRequest} GetBucketRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    GetBucketRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a GetBucketRequest message.
                     * @function verify
                     * @memberof google.logging.v2.GetBucketRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    GetBucketRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a GetBucketRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.GetBucketRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.GetBucketRequest} GetBucketRequest
                     */
                    GetBucketRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.GetBucketRequest)
                            return object;
                        var message = new $root.google.logging.v2.GetBucketRequest();
                        if (object.name != null)
                            message.name = String(object.name);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a GetBucketRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.GetBucketRequest
                     * @static
                     * @param {google.logging.v2.GetBucketRequest} message GetBucketRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    GetBucketRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults)
                            object.name = "";
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        return object;
                    };
    
                    /**
                     * Converts this GetBucketRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.GetBucketRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    GetBucketRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return GetBucketRequest;
                })();
    
                v2.DeleteBucketRequest = (function() {
    
                    /**
                     * Properties of a DeleteBucketRequest.
                     * @memberof google.logging.v2
                     * @interface IDeleteBucketRequest
                     * @property {string|null} [name] DeleteBucketRequest name
                     */
    
                    /**
                     * Constructs a new DeleteBucketRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a DeleteBucketRequest.
                     * @implements IDeleteBucketRequest
                     * @constructor
                     * @param {google.logging.v2.IDeleteBucketRequest=} [properties] Properties to set
                     */
                    function DeleteBucketRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * DeleteBucketRequest name.
                     * @member {string} name
                     * @memberof google.logging.v2.DeleteBucketRequest
                     * @instance
                     */
                    DeleteBucketRequest.prototype.name = "";
    
                    /**
                     * Creates a new DeleteBucketRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.DeleteBucketRequest
                     * @static
                     * @param {google.logging.v2.IDeleteBucketRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.DeleteBucketRequest} DeleteBucketRequest instance
                     */
                    DeleteBucketRequest.create = function create(properties) {
                        return new DeleteBucketRequest(properties);
                    };
    
                    /**
                     * Encodes the specified DeleteBucketRequest message. Does not implicitly {@link google.logging.v2.DeleteBucketRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.DeleteBucketRequest
                     * @static
                     * @param {google.logging.v2.IDeleteBucketRequest} message DeleteBucketRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    DeleteBucketRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified DeleteBucketRequest message, length delimited. Does not implicitly {@link google.logging.v2.DeleteBucketRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.DeleteBucketRequest
                     * @static
                     * @param {google.logging.v2.IDeleteBucketRequest} message DeleteBucketRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    DeleteBucketRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a DeleteBucketRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.DeleteBucketRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.DeleteBucketRequest} DeleteBucketRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    DeleteBucketRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.DeleteBucketRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.name = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a DeleteBucketRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.DeleteBucketRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.DeleteBucketRequest} DeleteBucketRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    DeleteBucketRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a DeleteBucketRequest message.
                     * @function verify
                     * @memberof google.logging.v2.DeleteBucketRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    DeleteBucketRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a DeleteBucketRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.DeleteBucketRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.DeleteBucketRequest} DeleteBucketRequest
                     */
                    DeleteBucketRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.DeleteBucketRequest)
                            return object;
                        var message = new $root.google.logging.v2.DeleteBucketRequest();
                        if (object.name != null)
                            message.name = String(object.name);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a DeleteBucketRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.DeleteBucketRequest
                     * @static
                     * @param {google.logging.v2.DeleteBucketRequest} message DeleteBucketRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    DeleteBucketRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults)
                            object.name = "";
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        return object;
                    };
    
                    /**
                     * Converts this DeleteBucketRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.DeleteBucketRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    DeleteBucketRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return DeleteBucketRequest;
                })();
    
                v2.UndeleteBucketRequest = (function() {
    
                    /**
                     * Properties of an UndeleteBucketRequest.
                     * @memberof google.logging.v2
                     * @interface IUndeleteBucketRequest
                     * @property {string|null} [name] UndeleteBucketRequest name
                     */
    
                    /**
                     * Constructs a new UndeleteBucketRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents an UndeleteBucketRequest.
                     * @implements IUndeleteBucketRequest
                     * @constructor
                     * @param {google.logging.v2.IUndeleteBucketRequest=} [properties] Properties to set
                     */
                    function UndeleteBucketRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * UndeleteBucketRequest name.
                     * @member {string} name
                     * @memberof google.logging.v2.UndeleteBucketRequest
                     * @instance
                     */
                    UndeleteBucketRequest.prototype.name = "";
    
                    /**
                     * Creates a new UndeleteBucketRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.UndeleteBucketRequest
                     * @static
                     * @param {google.logging.v2.IUndeleteBucketRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.UndeleteBucketRequest} UndeleteBucketRequest instance
                     */
                    UndeleteBucketRequest.create = function create(properties) {
                        return new UndeleteBucketRequest(properties);
                    };
    
                    /**
                     * Encodes the specified UndeleteBucketRequest message. Does not implicitly {@link google.logging.v2.UndeleteBucketRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.UndeleteBucketRequest
                     * @static
                     * @param {google.logging.v2.IUndeleteBucketRequest} message UndeleteBucketRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    UndeleteBucketRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified UndeleteBucketRequest message, length delimited. Does not implicitly {@link google.logging.v2.UndeleteBucketRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.UndeleteBucketRequest
                     * @static
                     * @param {google.logging.v2.IUndeleteBucketRequest} message UndeleteBucketRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    UndeleteBucketRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes an UndeleteBucketRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.UndeleteBucketRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.UndeleteBucketRequest} UndeleteBucketRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    UndeleteBucketRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.UndeleteBucketRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.name = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes an UndeleteBucketRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.UndeleteBucketRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.UndeleteBucketRequest} UndeleteBucketRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    UndeleteBucketRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies an UndeleteBucketRequest message.
                     * @function verify
                     * @memberof google.logging.v2.UndeleteBucketRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    UndeleteBucketRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        return null;
                    };
    
                    /**
                     * Creates an UndeleteBucketRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.UndeleteBucketRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.UndeleteBucketRequest} UndeleteBucketRequest
                     */
                    UndeleteBucketRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.UndeleteBucketRequest)
                            return object;
                        var message = new $root.google.logging.v2.UndeleteBucketRequest();
                        if (object.name != null)
                            message.name = String(object.name);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from an UndeleteBucketRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.UndeleteBucketRequest
                     * @static
                     * @param {google.logging.v2.UndeleteBucketRequest} message UndeleteBucketRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    UndeleteBucketRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults)
                            object.name = "";
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        return object;
                    };
    
                    /**
                     * Converts this UndeleteBucketRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.UndeleteBucketRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    UndeleteBucketRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return UndeleteBucketRequest;
                })();
    
                v2.ListViewsRequest = (function() {
    
                    /**
                     * Properties of a ListViewsRequest.
                     * @memberof google.logging.v2
                     * @interface IListViewsRequest
                     * @property {string|null} [parent] ListViewsRequest parent
                     * @property {string|null} [pageToken] ListViewsRequest pageToken
                     * @property {number|null} [pageSize] ListViewsRequest pageSize
                     */
    
                    /**
                     * Constructs a new ListViewsRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a ListViewsRequest.
                     * @implements IListViewsRequest
                     * @constructor
                     * @param {google.logging.v2.IListViewsRequest=} [properties] Properties to set
                     */
                    function ListViewsRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ListViewsRequest parent.
                     * @member {string} parent
                     * @memberof google.logging.v2.ListViewsRequest
                     * @instance
                     */
                    ListViewsRequest.prototype.parent = "";
    
                    /**
                     * ListViewsRequest pageToken.
                     * @member {string} pageToken
                     * @memberof google.logging.v2.ListViewsRequest
                     * @instance
                     */
                    ListViewsRequest.prototype.pageToken = "";
    
                    /**
                     * ListViewsRequest pageSize.
                     * @member {number} pageSize
                     * @memberof google.logging.v2.ListViewsRequest
                     * @instance
                     */
                    ListViewsRequest.prototype.pageSize = 0;
    
                    /**
                     * Creates a new ListViewsRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.ListViewsRequest
                     * @static
                     * @param {google.logging.v2.IListViewsRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.ListViewsRequest} ListViewsRequest instance
                     */
                    ListViewsRequest.create = function create(properties) {
                        return new ListViewsRequest(properties);
                    };
    
                    /**
                     * Encodes the specified ListViewsRequest message. Does not implicitly {@link google.logging.v2.ListViewsRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.ListViewsRequest
                     * @static
                     * @param {google.logging.v2.IListViewsRequest} message ListViewsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListViewsRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                        if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.pageToken);
                        if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                            writer.uint32(/* id 3, wireType 0 =*/24).int32(message.pageSize);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ListViewsRequest message, length delimited. Does not implicitly {@link google.logging.v2.ListViewsRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.ListViewsRequest
                     * @static
                     * @param {google.logging.v2.IListViewsRequest} message ListViewsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListViewsRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ListViewsRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.ListViewsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.ListViewsRequest} ListViewsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListViewsRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.ListViewsRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.parent = reader.string();
                                break;
                            case 2:
                                message.pageToken = reader.string();
                                break;
                            case 3:
                                message.pageSize = reader.int32();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ListViewsRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.ListViewsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.ListViewsRequest} ListViewsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListViewsRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ListViewsRequest message.
                     * @function verify
                     * @memberof google.logging.v2.ListViewsRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ListViewsRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.parent != null && message.hasOwnProperty("parent"))
                            if (!$util.isString(message.parent))
                                return "parent: string expected";
                        if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                            if (!$util.isString(message.pageToken))
                                return "pageToken: string expected";
                        if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                            if (!$util.isInteger(message.pageSize))
                                return "pageSize: integer expected";
                        return null;
                    };
    
                    /**
                     * Creates a ListViewsRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.ListViewsRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.ListViewsRequest} ListViewsRequest
                     */
                    ListViewsRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.ListViewsRequest)
                            return object;
                        var message = new $root.google.logging.v2.ListViewsRequest();
                        if (object.parent != null)
                            message.parent = String(object.parent);
                        if (object.pageToken != null)
                            message.pageToken = String(object.pageToken);
                        if (object.pageSize != null)
                            message.pageSize = object.pageSize | 0;
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ListViewsRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.ListViewsRequest
                     * @static
                     * @param {google.logging.v2.ListViewsRequest} message ListViewsRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ListViewsRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.parent = "";
                            object.pageToken = "";
                            object.pageSize = 0;
                        }
                        if (message.parent != null && message.hasOwnProperty("parent"))
                            object.parent = message.parent;
                        if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                            object.pageToken = message.pageToken;
                        if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                            object.pageSize = message.pageSize;
                        return object;
                    };
    
                    /**
                     * Converts this ListViewsRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.ListViewsRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ListViewsRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return ListViewsRequest;
                })();
    
                v2.ListViewsResponse = (function() {
    
                    /**
                     * Properties of a ListViewsResponse.
                     * @memberof google.logging.v2
                     * @interface IListViewsResponse
                     * @property {Array.<google.logging.v2.ILogView>|null} [views] ListViewsResponse views
                     * @property {string|null} [nextPageToken] ListViewsResponse nextPageToken
                     */
    
                    /**
                     * Constructs a new ListViewsResponse.
                     * @memberof google.logging.v2
                     * @classdesc Represents a ListViewsResponse.
                     * @implements IListViewsResponse
                     * @constructor
                     * @param {google.logging.v2.IListViewsResponse=} [properties] Properties to set
                     */
                    function ListViewsResponse(properties) {
                        this.views = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ListViewsResponse views.
                     * @member {Array.<google.logging.v2.ILogView>} views
                     * @memberof google.logging.v2.ListViewsResponse
                     * @instance
                     */
                    ListViewsResponse.prototype.views = $util.emptyArray;
    
                    /**
                     * ListViewsResponse nextPageToken.
                     * @member {string} nextPageToken
                     * @memberof google.logging.v2.ListViewsResponse
                     * @instance
                     */
                    ListViewsResponse.prototype.nextPageToken = "";
    
                    /**
                     * Creates a new ListViewsResponse instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.ListViewsResponse
                     * @static
                     * @param {google.logging.v2.IListViewsResponse=} [properties] Properties to set
                     * @returns {google.logging.v2.ListViewsResponse} ListViewsResponse instance
                     */
                    ListViewsResponse.create = function create(properties) {
                        return new ListViewsResponse(properties);
                    };
    
                    /**
                     * Encodes the specified ListViewsResponse message. Does not implicitly {@link google.logging.v2.ListViewsResponse.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.ListViewsResponse
                     * @static
                     * @param {google.logging.v2.IListViewsResponse} message ListViewsResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListViewsResponse.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.views != null && message.views.length)
                            for (var i = 0; i < message.views.length; ++i)
                                $root.google.logging.v2.LogView.encode(message.views[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ListViewsResponse message, length delimited. Does not implicitly {@link google.logging.v2.ListViewsResponse.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.ListViewsResponse
                     * @static
                     * @param {google.logging.v2.IListViewsResponse} message ListViewsResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListViewsResponse.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ListViewsResponse message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.ListViewsResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.ListViewsResponse} ListViewsResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListViewsResponse.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.ListViewsResponse();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                if (!(message.views && message.views.length))
                                    message.views = [];
                                message.views.push($root.google.logging.v2.LogView.decode(reader, reader.uint32()));
                                break;
                            case 2:
                                message.nextPageToken = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ListViewsResponse message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.ListViewsResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.ListViewsResponse} ListViewsResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListViewsResponse.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ListViewsResponse message.
                     * @function verify
                     * @memberof google.logging.v2.ListViewsResponse
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ListViewsResponse.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.views != null && message.hasOwnProperty("views")) {
                            if (!Array.isArray(message.views))
                                return "views: array expected";
                            for (var i = 0; i < message.views.length; ++i) {
                                var error = $root.google.logging.v2.LogView.verify(message.views[i]);
                                if (error)
                                    return "views." + error;
                            }
                        }
                        if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                            if (!$util.isString(message.nextPageToken))
                                return "nextPageToken: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a ListViewsResponse message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.ListViewsResponse
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.ListViewsResponse} ListViewsResponse
                     */
                    ListViewsResponse.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.ListViewsResponse)
                            return object;
                        var message = new $root.google.logging.v2.ListViewsResponse();
                        if (object.views) {
                            if (!Array.isArray(object.views))
                                throw TypeError(".google.logging.v2.ListViewsResponse.views: array expected");
                            message.views = [];
                            for (var i = 0; i < object.views.length; ++i) {
                                if (typeof object.views[i] !== "object")
                                    throw TypeError(".google.logging.v2.ListViewsResponse.views: object expected");
                                message.views[i] = $root.google.logging.v2.LogView.fromObject(object.views[i]);
                            }
                        }
                        if (object.nextPageToken != null)
                            message.nextPageToken = String(object.nextPageToken);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ListViewsResponse message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.ListViewsResponse
                     * @static
                     * @param {google.logging.v2.ListViewsResponse} message ListViewsResponse
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ListViewsResponse.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.views = [];
                        if (options.defaults)
                            object.nextPageToken = "";
                        if (message.views && message.views.length) {
                            object.views = [];
                            for (var j = 0; j < message.views.length; ++j)
                                object.views[j] = $root.google.logging.v2.LogView.toObject(message.views[j], options);
                        }
                        if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                            object.nextPageToken = message.nextPageToken;
                        return object;
                    };
    
                    /**
                     * Converts this ListViewsResponse to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.ListViewsResponse
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ListViewsResponse.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return ListViewsResponse;
                })();
    
                v2.CreateViewRequest = (function() {
    
                    /**
                     * Properties of a CreateViewRequest.
                     * @memberof google.logging.v2
                     * @interface ICreateViewRequest
                     * @property {string|null} [parent] CreateViewRequest parent
                     * @property {string|null} [viewId] CreateViewRequest viewId
                     * @property {google.logging.v2.ILogView|null} [view] CreateViewRequest view
                     */
    
                    /**
                     * Constructs a new CreateViewRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a CreateViewRequest.
                     * @implements ICreateViewRequest
                     * @constructor
                     * @param {google.logging.v2.ICreateViewRequest=} [properties] Properties to set
                     */
                    function CreateViewRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * CreateViewRequest parent.
                     * @member {string} parent
                     * @memberof google.logging.v2.CreateViewRequest
                     * @instance
                     */
                    CreateViewRequest.prototype.parent = "";
    
                    /**
                     * CreateViewRequest viewId.
                     * @member {string} viewId
                     * @memberof google.logging.v2.CreateViewRequest
                     * @instance
                     */
                    CreateViewRequest.prototype.viewId = "";
    
                    /**
                     * CreateViewRequest view.
                     * @member {google.logging.v2.ILogView|null|undefined} view
                     * @memberof google.logging.v2.CreateViewRequest
                     * @instance
                     */
                    CreateViewRequest.prototype.view = null;
    
                    /**
                     * Creates a new CreateViewRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.CreateViewRequest
                     * @static
                     * @param {google.logging.v2.ICreateViewRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.CreateViewRequest} CreateViewRequest instance
                     */
                    CreateViewRequest.create = function create(properties) {
                        return new CreateViewRequest(properties);
                    };
    
                    /**
                     * Encodes the specified CreateViewRequest message. Does not implicitly {@link google.logging.v2.CreateViewRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.CreateViewRequest
                     * @static
                     * @param {google.logging.v2.ICreateViewRequest} message CreateViewRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    CreateViewRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                        if (message.viewId != null && Object.hasOwnProperty.call(message, "viewId"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.viewId);
                        if (message.view != null && Object.hasOwnProperty.call(message, "view"))
                            $root.google.logging.v2.LogView.encode(message.view, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified CreateViewRequest message, length delimited. Does not implicitly {@link google.logging.v2.CreateViewRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.CreateViewRequest
                     * @static
                     * @param {google.logging.v2.ICreateViewRequest} message CreateViewRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    CreateViewRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a CreateViewRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.CreateViewRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.CreateViewRequest} CreateViewRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    CreateViewRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.CreateViewRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.parent = reader.string();
                                break;
                            case 2:
                                message.viewId = reader.string();
                                break;
                            case 3:
                                message.view = $root.google.logging.v2.LogView.decode(reader, reader.uint32());
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a CreateViewRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.CreateViewRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.CreateViewRequest} CreateViewRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    CreateViewRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a CreateViewRequest message.
                     * @function verify
                     * @memberof google.logging.v2.CreateViewRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    CreateViewRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.parent != null && message.hasOwnProperty("parent"))
                            if (!$util.isString(message.parent))
                                return "parent: string expected";
                        if (message.viewId != null && message.hasOwnProperty("viewId"))
                            if (!$util.isString(message.viewId))
                                return "viewId: string expected";
                        if (message.view != null && message.hasOwnProperty("view")) {
                            var error = $root.google.logging.v2.LogView.verify(message.view);
                            if (error)
                                return "view." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a CreateViewRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.CreateViewRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.CreateViewRequest} CreateViewRequest
                     */
                    CreateViewRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.CreateViewRequest)
                            return object;
                        var message = new $root.google.logging.v2.CreateViewRequest();
                        if (object.parent != null)
                            message.parent = String(object.parent);
                        if (object.viewId != null)
                            message.viewId = String(object.viewId);
                        if (object.view != null) {
                            if (typeof object.view !== "object")
                                throw TypeError(".google.logging.v2.CreateViewRequest.view: object expected");
                            message.view = $root.google.logging.v2.LogView.fromObject(object.view);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a CreateViewRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.CreateViewRequest
                     * @static
                     * @param {google.logging.v2.CreateViewRequest} message CreateViewRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    CreateViewRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.parent = "";
                            object.viewId = "";
                            object.view = null;
                        }
                        if (message.parent != null && message.hasOwnProperty("parent"))
                            object.parent = message.parent;
                        if (message.viewId != null && message.hasOwnProperty("viewId"))
                            object.viewId = message.viewId;
                        if (message.view != null && message.hasOwnProperty("view"))
                            object.view = $root.google.logging.v2.LogView.toObject(message.view, options);
                        return object;
                    };
    
                    /**
                     * Converts this CreateViewRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.CreateViewRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    CreateViewRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return CreateViewRequest;
                })();
    
                v2.UpdateViewRequest = (function() {
    
                    /**
                     * Properties of an UpdateViewRequest.
                     * @memberof google.logging.v2
                     * @interface IUpdateViewRequest
                     * @property {string|null} [name] UpdateViewRequest name
                     * @property {google.logging.v2.ILogView|null} [view] UpdateViewRequest view
                     * @property {google.protobuf.IFieldMask|null} [updateMask] UpdateViewRequest updateMask
                     */
    
                    /**
                     * Constructs a new UpdateViewRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents an UpdateViewRequest.
                     * @implements IUpdateViewRequest
                     * @constructor
                     * @param {google.logging.v2.IUpdateViewRequest=} [properties] Properties to set
                     */
                    function UpdateViewRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * UpdateViewRequest name.
                     * @member {string} name
                     * @memberof google.logging.v2.UpdateViewRequest
                     * @instance
                     */
                    UpdateViewRequest.prototype.name = "";
    
                    /**
                     * UpdateViewRequest view.
                     * @member {google.logging.v2.ILogView|null|undefined} view
                     * @memberof google.logging.v2.UpdateViewRequest
                     * @instance
                     */
                    UpdateViewRequest.prototype.view = null;
    
                    /**
                     * UpdateViewRequest updateMask.
                     * @member {google.protobuf.IFieldMask|null|undefined} updateMask
                     * @memberof google.logging.v2.UpdateViewRequest
                     * @instance
                     */
                    UpdateViewRequest.prototype.updateMask = null;
    
                    /**
                     * Creates a new UpdateViewRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.UpdateViewRequest
                     * @static
                     * @param {google.logging.v2.IUpdateViewRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.UpdateViewRequest} UpdateViewRequest instance
                     */
                    UpdateViewRequest.create = function create(properties) {
                        return new UpdateViewRequest(properties);
                    };
    
                    /**
                     * Encodes the specified UpdateViewRequest message. Does not implicitly {@link google.logging.v2.UpdateViewRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.UpdateViewRequest
                     * @static
                     * @param {google.logging.v2.IUpdateViewRequest} message UpdateViewRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    UpdateViewRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        if (message.view != null && Object.hasOwnProperty.call(message, "view"))
                            $root.google.logging.v2.LogView.encode(message.view, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.updateMask != null && Object.hasOwnProperty.call(message, "updateMask"))
                            $root.google.protobuf.FieldMask.encode(message.updateMask, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified UpdateViewRequest message, length delimited. Does not implicitly {@link google.logging.v2.UpdateViewRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.UpdateViewRequest
                     * @static
                     * @param {google.logging.v2.IUpdateViewRequest} message UpdateViewRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    UpdateViewRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes an UpdateViewRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.UpdateViewRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.UpdateViewRequest} UpdateViewRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    UpdateViewRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.UpdateViewRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.name = reader.string();
                                break;
                            case 2:
                                message.view = $root.google.logging.v2.LogView.decode(reader, reader.uint32());
                                break;
                            case 4:
                                message.updateMask = $root.google.protobuf.FieldMask.decode(reader, reader.uint32());
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes an UpdateViewRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.UpdateViewRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.UpdateViewRequest} UpdateViewRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    UpdateViewRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies an UpdateViewRequest message.
                     * @function verify
                     * @memberof google.logging.v2.UpdateViewRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    UpdateViewRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        if (message.view != null && message.hasOwnProperty("view")) {
                            var error = $root.google.logging.v2.LogView.verify(message.view);
                            if (error)
                                return "view." + error;
                        }
                        if (message.updateMask != null && message.hasOwnProperty("updateMask")) {
                            var error = $root.google.protobuf.FieldMask.verify(message.updateMask);
                            if (error)
                                return "updateMask." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates an UpdateViewRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.UpdateViewRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.UpdateViewRequest} UpdateViewRequest
                     */
                    UpdateViewRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.UpdateViewRequest)
                            return object;
                        var message = new $root.google.logging.v2.UpdateViewRequest();
                        if (object.name != null)
                            message.name = String(object.name);
                        if (object.view != null) {
                            if (typeof object.view !== "object")
                                throw TypeError(".google.logging.v2.UpdateViewRequest.view: object expected");
                            message.view = $root.google.logging.v2.LogView.fromObject(object.view);
                        }
                        if (object.updateMask != null) {
                            if (typeof object.updateMask !== "object")
                                throw TypeError(".google.logging.v2.UpdateViewRequest.updateMask: object expected");
                            message.updateMask = $root.google.protobuf.FieldMask.fromObject(object.updateMask);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from an UpdateViewRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.UpdateViewRequest
                     * @static
                     * @param {google.logging.v2.UpdateViewRequest} message UpdateViewRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    UpdateViewRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.name = "";
                            object.view = null;
                            object.updateMask = null;
                        }
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        if (message.view != null && message.hasOwnProperty("view"))
                            object.view = $root.google.logging.v2.LogView.toObject(message.view, options);
                        if (message.updateMask != null && message.hasOwnProperty("updateMask"))
                            object.updateMask = $root.google.protobuf.FieldMask.toObject(message.updateMask, options);
                        return object;
                    };
    
                    /**
                     * Converts this UpdateViewRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.UpdateViewRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    UpdateViewRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return UpdateViewRequest;
                })();
    
                v2.GetViewRequest = (function() {
    
                    /**
                     * Properties of a GetViewRequest.
                     * @memberof google.logging.v2
                     * @interface IGetViewRequest
                     * @property {string|null} [name] GetViewRequest name
                     */
    
                    /**
                     * Constructs a new GetViewRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a GetViewRequest.
                     * @implements IGetViewRequest
                     * @constructor
                     * @param {google.logging.v2.IGetViewRequest=} [properties] Properties to set
                     */
                    function GetViewRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * GetViewRequest name.
                     * @member {string} name
                     * @memberof google.logging.v2.GetViewRequest
                     * @instance
                     */
                    GetViewRequest.prototype.name = "";
    
                    /**
                     * Creates a new GetViewRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.GetViewRequest
                     * @static
                     * @param {google.logging.v2.IGetViewRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.GetViewRequest} GetViewRequest instance
                     */
                    GetViewRequest.create = function create(properties) {
                        return new GetViewRequest(properties);
                    };
    
                    /**
                     * Encodes the specified GetViewRequest message. Does not implicitly {@link google.logging.v2.GetViewRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.GetViewRequest
                     * @static
                     * @param {google.logging.v2.IGetViewRequest} message GetViewRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    GetViewRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified GetViewRequest message, length delimited. Does not implicitly {@link google.logging.v2.GetViewRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.GetViewRequest
                     * @static
                     * @param {google.logging.v2.IGetViewRequest} message GetViewRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    GetViewRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a GetViewRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.GetViewRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.GetViewRequest} GetViewRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    GetViewRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.GetViewRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.name = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a GetViewRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.GetViewRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.GetViewRequest} GetViewRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    GetViewRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a GetViewRequest message.
                     * @function verify
                     * @memberof google.logging.v2.GetViewRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    GetViewRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a GetViewRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.GetViewRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.GetViewRequest} GetViewRequest
                     */
                    GetViewRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.GetViewRequest)
                            return object;
                        var message = new $root.google.logging.v2.GetViewRequest();
                        if (object.name != null)
                            message.name = String(object.name);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a GetViewRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.GetViewRequest
                     * @static
                     * @param {google.logging.v2.GetViewRequest} message GetViewRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    GetViewRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults)
                            object.name = "";
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        return object;
                    };
    
                    /**
                     * Converts this GetViewRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.GetViewRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    GetViewRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return GetViewRequest;
                })();
    
                v2.DeleteViewRequest = (function() {
    
                    /**
                     * Properties of a DeleteViewRequest.
                     * @memberof google.logging.v2
                     * @interface IDeleteViewRequest
                     * @property {string|null} [name] DeleteViewRequest name
                     */
    
                    /**
                     * Constructs a new DeleteViewRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a DeleteViewRequest.
                     * @implements IDeleteViewRequest
                     * @constructor
                     * @param {google.logging.v2.IDeleteViewRequest=} [properties] Properties to set
                     */
                    function DeleteViewRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * DeleteViewRequest name.
                     * @member {string} name
                     * @memberof google.logging.v2.DeleteViewRequest
                     * @instance
                     */
                    DeleteViewRequest.prototype.name = "";
    
                    /**
                     * Creates a new DeleteViewRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.DeleteViewRequest
                     * @static
                     * @param {google.logging.v2.IDeleteViewRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.DeleteViewRequest} DeleteViewRequest instance
                     */
                    DeleteViewRequest.create = function create(properties) {
                        return new DeleteViewRequest(properties);
                    };
    
                    /**
                     * Encodes the specified DeleteViewRequest message. Does not implicitly {@link google.logging.v2.DeleteViewRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.DeleteViewRequest
                     * @static
                     * @param {google.logging.v2.IDeleteViewRequest} message DeleteViewRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    DeleteViewRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified DeleteViewRequest message, length delimited. Does not implicitly {@link google.logging.v2.DeleteViewRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.DeleteViewRequest
                     * @static
                     * @param {google.logging.v2.IDeleteViewRequest} message DeleteViewRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    DeleteViewRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a DeleteViewRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.DeleteViewRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.DeleteViewRequest} DeleteViewRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    DeleteViewRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.DeleteViewRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.name = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a DeleteViewRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.DeleteViewRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.DeleteViewRequest} DeleteViewRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    DeleteViewRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a DeleteViewRequest message.
                     * @function verify
                     * @memberof google.logging.v2.DeleteViewRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    DeleteViewRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a DeleteViewRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.DeleteViewRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.DeleteViewRequest} DeleteViewRequest
                     */
                    DeleteViewRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.DeleteViewRequest)
                            return object;
                        var message = new $root.google.logging.v2.DeleteViewRequest();
                        if (object.name != null)
                            message.name = String(object.name);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a DeleteViewRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.DeleteViewRequest
                     * @static
                     * @param {google.logging.v2.DeleteViewRequest} message DeleteViewRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    DeleteViewRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults)
                            object.name = "";
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        return object;
                    };
    
                    /**
                     * Converts this DeleteViewRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.DeleteViewRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    DeleteViewRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return DeleteViewRequest;
                })();
    
                v2.ListSinksRequest = (function() {
    
                    /**
                     * Properties of a ListSinksRequest.
                     * @memberof google.logging.v2
                     * @interface IListSinksRequest
                     * @property {string|null} [parent] ListSinksRequest parent
                     * @property {string|null} [pageToken] ListSinksRequest pageToken
                     * @property {number|null} [pageSize] ListSinksRequest pageSize
                     */
    
                    /**
                     * Constructs a new ListSinksRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a ListSinksRequest.
                     * @implements IListSinksRequest
                     * @constructor
                     * @param {google.logging.v2.IListSinksRequest=} [properties] Properties to set
                     */
                    function ListSinksRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ListSinksRequest parent.
                     * @member {string} parent
                     * @memberof google.logging.v2.ListSinksRequest
                     * @instance
                     */
                    ListSinksRequest.prototype.parent = "";
    
                    /**
                     * ListSinksRequest pageToken.
                     * @member {string} pageToken
                     * @memberof google.logging.v2.ListSinksRequest
                     * @instance
                     */
                    ListSinksRequest.prototype.pageToken = "";
    
                    /**
                     * ListSinksRequest pageSize.
                     * @member {number} pageSize
                     * @memberof google.logging.v2.ListSinksRequest
                     * @instance
                     */
                    ListSinksRequest.prototype.pageSize = 0;
    
                    /**
                     * Creates a new ListSinksRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.ListSinksRequest
                     * @static
                     * @param {google.logging.v2.IListSinksRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.ListSinksRequest} ListSinksRequest instance
                     */
                    ListSinksRequest.create = function create(properties) {
                        return new ListSinksRequest(properties);
                    };
    
                    /**
                     * Encodes the specified ListSinksRequest message. Does not implicitly {@link google.logging.v2.ListSinksRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.ListSinksRequest
                     * @static
                     * @param {google.logging.v2.IListSinksRequest} message ListSinksRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListSinksRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                        if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.pageToken);
                        if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                            writer.uint32(/* id 3, wireType 0 =*/24).int32(message.pageSize);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ListSinksRequest message, length delimited. Does not implicitly {@link google.logging.v2.ListSinksRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.ListSinksRequest
                     * @static
                     * @param {google.logging.v2.IListSinksRequest} message ListSinksRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListSinksRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ListSinksRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.ListSinksRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.ListSinksRequest} ListSinksRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListSinksRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.ListSinksRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.parent = reader.string();
                                break;
                            case 2:
                                message.pageToken = reader.string();
                                break;
                            case 3:
                                message.pageSize = reader.int32();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ListSinksRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.ListSinksRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.ListSinksRequest} ListSinksRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListSinksRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ListSinksRequest message.
                     * @function verify
                     * @memberof google.logging.v2.ListSinksRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ListSinksRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.parent != null && message.hasOwnProperty("parent"))
                            if (!$util.isString(message.parent))
                                return "parent: string expected";
                        if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                            if (!$util.isString(message.pageToken))
                                return "pageToken: string expected";
                        if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                            if (!$util.isInteger(message.pageSize))
                                return "pageSize: integer expected";
                        return null;
                    };
    
                    /**
                     * Creates a ListSinksRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.ListSinksRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.ListSinksRequest} ListSinksRequest
                     */
                    ListSinksRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.ListSinksRequest)
                            return object;
                        var message = new $root.google.logging.v2.ListSinksRequest();
                        if (object.parent != null)
                            message.parent = String(object.parent);
                        if (object.pageToken != null)
                            message.pageToken = String(object.pageToken);
                        if (object.pageSize != null)
                            message.pageSize = object.pageSize | 0;
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ListSinksRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.ListSinksRequest
                     * @static
                     * @param {google.logging.v2.ListSinksRequest} message ListSinksRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ListSinksRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.parent = "";
                            object.pageToken = "";
                            object.pageSize = 0;
                        }
                        if (message.parent != null && message.hasOwnProperty("parent"))
                            object.parent = message.parent;
                        if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                            object.pageToken = message.pageToken;
                        if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                            object.pageSize = message.pageSize;
                        return object;
                    };
    
                    /**
                     * Converts this ListSinksRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.ListSinksRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ListSinksRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return ListSinksRequest;
                })();
    
                v2.ListSinksResponse = (function() {
    
                    /**
                     * Properties of a ListSinksResponse.
                     * @memberof google.logging.v2
                     * @interface IListSinksResponse
                     * @property {Array.<google.logging.v2.ILogSink>|null} [sinks] ListSinksResponse sinks
                     * @property {string|null} [nextPageToken] ListSinksResponse nextPageToken
                     */
    
                    /**
                     * Constructs a new ListSinksResponse.
                     * @memberof google.logging.v2
                     * @classdesc Represents a ListSinksResponse.
                     * @implements IListSinksResponse
                     * @constructor
                     * @param {google.logging.v2.IListSinksResponse=} [properties] Properties to set
                     */
                    function ListSinksResponse(properties) {
                        this.sinks = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ListSinksResponse sinks.
                     * @member {Array.<google.logging.v2.ILogSink>} sinks
                     * @memberof google.logging.v2.ListSinksResponse
                     * @instance
                     */
                    ListSinksResponse.prototype.sinks = $util.emptyArray;
    
                    /**
                     * ListSinksResponse nextPageToken.
                     * @member {string} nextPageToken
                     * @memberof google.logging.v2.ListSinksResponse
                     * @instance
                     */
                    ListSinksResponse.prototype.nextPageToken = "";
    
                    /**
                     * Creates a new ListSinksResponse instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.ListSinksResponse
                     * @static
                     * @param {google.logging.v2.IListSinksResponse=} [properties] Properties to set
                     * @returns {google.logging.v2.ListSinksResponse} ListSinksResponse instance
                     */
                    ListSinksResponse.create = function create(properties) {
                        return new ListSinksResponse(properties);
                    };
    
                    /**
                     * Encodes the specified ListSinksResponse message. Does not implicitly {@link google.logging.v2.ListSinksResponse.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.ListSinksResponse
                     * @static
                     * @param {google.logging.v2.IListSinksResponse} message ListSinksResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListSinksResponse.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.sinks != null && message.sinks.length)
                            for (var i = 0; i < message.sinks.length; ++i)
                                $root.google.logging.v2.LogSink.encode(message.sinks[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ListSinksResponse message, length delimited. Does not implicitly {@link google.logging.v2.ListSinksResponse.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.ListSinksResponse
                     * @static
                     * @param {google.logging.v2.IListSinksResponse} message ListSinksResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListSinksResponse.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ListSinksResponse message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.ListSinksResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.ListSinksResponse} ListSinksResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListSinksResponse.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.ListSinksResponse();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                if (!(message.sinks && message.sinks.length))
                                    message.sinks = [];
                                message.sinks.push($root.google.logging.v2.LogSink.decode(reader, reader.uint32()));
                                break;
                            case 2:
                                message.nextPageToken = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ListSinksResponse message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.ListSinksResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.ListSinksResponse} ListSinksResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListSinksResponse.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ListSinksResponse message.
                     * @function verify
                     * @memberof google.logging.v2.ListSinksResponse
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ListSinksResponse.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.sinks != null && message.hasOwnProperty("sinks")) {
                            if (!Array.isArray(message.sinks))
                                return "sinks: array expected";
                            for (var i = 0; i < message.sinks.length; ++i) {
                                var error = $root.google.logging.v2.LogSink.verify(message.sinks[i]);
                                if (error)
                                    return "sinks." + error;
                            }
                        }
                        if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                            if (!$util.isString(message.nextPageToken))
                                return "nextPageToken: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a ListSinksResponse message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.ListSinksResponse
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.ListSinksResponse} ListSinksResponse
                     */
                    ListSinksResponse.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.ListSinksResponse)
                            return object;
                        var message = new $root.google.logging.v2.ListSinksResponse();
                        if (object.sinks) {
                            if (!Array.isArray(object.sinks))
                                throw TypeError(".google.logging.v2.ListSinksResponse.sinks: array expected");
                            message.sinks = [];
                            for (var i = 0; i < object.sinks.length; ++i) {
                                if (typeof object.sinks[i] !== "object")
                                    throw TypeError(".google.logging.v2.ListSinksResponse.sinks: object expected");
                                message.sinks[i] = $root.google.logging.v2.LogSink.fromObject(object.sinks[i]);
                            }
                        }
                        if (object.nextPageToken != null)
                            message.nextPageToken = String(object.nextPageToken);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ListSinksResponse message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.ListSinksResponse
                     * @static
                     * @param {google.logging.v2.ListSinksResponse} message ListSinksResponse
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ListSinksResponse.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.sinks = [];
                        if (options.defaults)
                            object.nextPageToken = "";
                        if (message.sinks && message.sinks.length) {
                            object.sinks = [];
                            for (var j = 0; j < message.sinks.length; ++j)
                                object.sinks[j] = $root.google.logging.v2.LogSink.toObject(message.sinks[j], options);
                        }
                        if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                            object.nextPageToken = message.nextPageToken;
                        return object;
                    };
    
                    /**
                     * Converts this ListSinksResponse to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.ListSinksResponse
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ListSinksResponse.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return ListSinksResponse;
                })();
    
                v2.GetSinkRequest = (function() {
    
                    /**
                     * Properties of a GetSinkRequest.
                     * @memberof google.logging.v2
                     * @interface IGetSinkRequest
                     * @property {string|null} [sinkName] GetSinkRequest sinkName
                     */
    
                    /**
                     * Constructs a new GetSinkRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a GetSinkRequest.
                     * @implements IGetSinkRequest
                     * @constructor
                     * @param {google.logging.v2.IGetSinkRequest=} [properties] Properties to set
                     */
                    function GetSinkRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * GetSinkRequest sinkName.
                     * @member {string} sinkName
                     * @memberof google.logging.v2.GetSinkRequest
                     * @instance
                     */
                    GetSinkRequest.prototype.sinkName = "";
    
                    /**
                     * Creates a new GetSinkRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.GetSinkRequest
                     * @static
                     * @param {google.logging.v2.IGetSinkRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.GetSinkRequest} GetSinkRequest instance
                     */
                    GetSinkRequest.create = function create(properties) {
                        return new GetSinkRequest(properties);
                    };
    
                    /**
                     * Encodes the specified GetSinkRequest message. Does not implicitly {@link google.logging.v2.GetSinkRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.GetSinkRequest
                     * @static
                     * @param {google.logging.v2.IGetSinkRequest} message GetSinkRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    GetSinkRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.sinkName != null && Object.hasOwnProperty.call(message, "sinkName"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.sinkName);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified GetSinkRequest message, length delimited. Does not implicitly {@link google.logging.v2.GetSinkRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.GetSinkRequest
                     * @static
                     * @param {google.logging.v2.IGetSinkRequest} message GetSinkRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    GetSinkRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a GetSinkRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.GetSinkRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.GetSinkRequest} GetSinkRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    GetSinkRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.GetSinkRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.sinkName = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a GetSinkRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.GetSinkRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.GetSinkRequest} GetSinkRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    GetSinkRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a GetSinkRequest message.
                     * @function verify
                     * @memberof google.logging.v2.GetSinkRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    GetSinkRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.sinkName != null && message.hasOwnProperty("sinkName"))
                            if (!$util.isString(message.sinkName))
                                return "sinkName: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a GetSinkRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.GetSinkRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.GetSinkRequest} GetSinkRequest
                     */
                    GetSinkRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.GetSinkRequest)
                            return object;
                        var message = new $root.google.logging.v2.GetSinkRequest();
                        if (object.sinkName != null)
                            message.sinkName = String(object.sinkName);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a GetSinkRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.GetSinkRequest
                     * @static
                     * @param {google.logging.v2.GetSinkRequest} message GetSinkRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    GetSinkRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults)
                            object.sinkName = "";
                        if (message.sinkName != null && message.hasOwnProperty("sinkName"))
                            object.sinkName = message.sinkName;
                        return object;
                    };
    
                    /**
                     * Converts this GetSinkRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.GetSinkRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    GetSinkRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return GetSinkRequest;
                })();
    
                v2.CreateSinkRequest = (function() {
    
                    /**
                     * Properties of a CreateSinkRequest.
                     * @memberof google.logging.v2
                     * @interface ICreateSinkRequest
                     * @property {string|null} [parent] CreateSinkRequest parent
                     * @property {google.logging.v2.ILogSink|null} [sink] CreateSinkRequest sink
                     * @property {boolean|null} [uniqueWriterIdentity] CreateSinkRequest uniqueWriterIdentity
                     */
    
                    /**
                     * Constructs a new CreateSinkRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a CreateSinkRequest.
                     * @implements ICreateSinkRequest
                     * @constructor
                     * @param {google.logging.v2.ICreateSinkRequest=} [properties] Properties to set
                     */
                    function CreateSinkRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * CreateSinkRequest parent.
                     * @member {string} parent
                     * @memberof google.logging.v2.CreateSinkRequest
                     * @instance
                     */
                    CreateSinkRequest.prototype.parent = "";
    
                    /**
                     * CreateSinkRequest sink.
                     * @member {google.logging.v2.ILogSink|null|undefined} sink
                     * @memberof google.logging.v2.CreateSinkRequest
                     * @instance
                     */
                    CreateSinkRequest.prototype.sink = null;
    
                    /**
                     * CreateSinkRequest uniqueWriterIdentity.
                     * @member {boolean} uniqueWriterIdentity
                     * @memberof google.logging.v2.CreateSinkRequest
                     * @instance
                     */
                    CreateSinkRequest.prototype.uniqueWriterIdentity = false;
    
                    /**
                     * Creates a new CreateSinkRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.CreateSinkRequest
                     * @static
                     * @param {google.logging.v2.ICreateSinkRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.CreateSinkRequest} CreateSinkRequest instance
                     */
                    CreateSinkRequest.create = function create(properties) {
                        return new CreateSinkRequest(properties);
                    };
    
                    /**
                     * Encodes the specified CreateSinkRequest message. Does not implicitly {@link google.logging.v2.CreateSinkRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.CreateSinkRequest
                     * @static
                     * @param {google.logging.v2.ICreateSinkRequest} message CreateSinkRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    CreateSinkRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                        if (message.sink != null && Object.hasOwnProperty.call(message, "sink"))
                            $root.google.logging.v2.LogSink.encode(message.sink, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.uniqueWriterIdentity != null && Object.hasOwnProperty.call(message, "uniqueWriterIdentity"))
                            writer.uint32(/* id 3, wireType 0 =*/24).bool(message.uniqueWriterIdentity);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified CreateSinkRequest message, length delimited. Does not implicitly {@link google.logging.v2.CreateSinkRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.CreateSinkRequest
                     * @static
                     * @param {google.logging.v2.ICreateSinkRequest} message CreateSinkRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    CreateSinkRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a CreateSinkRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.CreateSinkRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.CreateSinkRequest} CreateSinkRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    CreateSinkRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.CreateSinkRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.parent = reader.string();
                                break;
                            case 2:
                                message.sink = $root.google.logging.v2.LogSink.decode(reader, reader.uint32());
                                break;
                            case 3:
                                message.uniqueWriterIdentity = reader.bool();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a CreateSinkRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.CreateSinkRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.CreateSinkRequest} CreateSinkRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    CreateSinkRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a CreateSinkRequest message.
                     * @function verify
                     * @memberof google.logging.v2.CreateSinkRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    CreateSinkRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.parent != null && message.hasOwnProperty("parent"))
                            if (!$util.isString(message.parent))
                                return "parent: string expected";
                        if (message.sink != null && message.hasOwnProperty("sink")) {
                            var error = $root.google.logging.v2.LogSink.verify(message.sink);
                            if (error)
                                return "sink." + error;
                        }
                        if (message.uniqueWriterIdentity != null && message.hasOwnProperty("uniqueWriterIdentity"))
                            if (typeof message.uniqueWriterIdentity !== "boolean")
                                return "uniqueWriterIdentity: boolean expected";
                        return null;
                    };
    
                    /**
                     * Creates a CreateSinkRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.CreateSinkRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.CreateSinkRequest} CreateSinkRequest
                     */
                    CreateSinkRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.CreateSinkRequest)
                            return object;
                        var message = new $root.google.logging.v2.CreateSinkRequest();
                        if (object.parent != null)
                            message.parent = String(object.parent);
                        if (object.sink != null) {
                            if (typeof object.sink !== "object")
                                throw TypeError(".google.logging.v2.CreateSinkRequest.sink: object expected");
                            message.sink = $root.google.logging.v2.LogSink.fromObject(object.sink);
                        }
                        if (object.uniqueWriterIdentity != null)
                            message.uniqueWriterIdentity = Boolean(object.uniqueWriterIdentity);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a CreateSinkRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.CreateSinkRequest
                     * @static
                     * @param {google.logging.v2.CreateSinkRequest} message CreateSinkRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    CreateSinkRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.parent = "";
                            object.sink = null;
                            object.uniqueWriterIdentity = false;
                        }
                        if (message.parent != null && message.hasOwnProperty("parent"))
                            object.parent = message.parent;
                        if (message.sink != null && message.hasOwnProperty("sink"))
                            object.sink = $root.google.logging.v2.LogSink.toObject(message.sink, options);
                        if (message.uniqueWriterIdentity != null && message.hasOwnProperty("uniqueWriterIdentity"))
                            object.uniqueWriterIdentity = message.uniqueWriterIdentity;
                        return object;
                    };
    
                    /**
                     * Converts this CreateSinkRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.CreateSinkRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    CreateSinkRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return CreateSinkRequest;
                })();
    
                v2.UpdateSinkRequest = (function() {
    
                    /**
                     * Properties of an UpdateSinkRequest.
                     * @memberof google.logging.v2
                     * @interface IUpdateSinkRequest
                     * @property {string|null} [sinkName] UpdateSinkRequest sinkName
                     * @property {google.logging.v2.ILogSink|null} [sink] UpdateSinkRequest sink
                     * @property {boolean|null} [uniqueWriterIdentity] UpdateSinkRequest uniqueWriterIdentity
                     * @property {google.protobuf.IFieldMask|null} [updateMask] UpdateSinkRequest updateMask
                     */
    
                    /**
                     * Constructs a new UpdateSinkRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents an UpdateSinkRequest.
                     * @implements IUpdateSinkRequest
                     * @constructor
                     * @param {google.logging.v2.IUpdateSinkRequest=} [properties] Properties to set
                     */
                    function UpdateSinkRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * UpdateSinkRequest sinkName.
                     * @member {string} sinkName
                     * @memberof google.logging.v2.UpdateSinkRequest
                     * @instance
                     */
                    UpdateSinkRequest.prototype.sinkName = "";
    
                    /**
                     * UpdateSinkRequest sink.
                     * @member {google.logging.v2.ILogSink|null|undefined} sink
                     * @memberof google.logging.v2.UpdateSinkRequest
                     * @instance
                     */
                    UpdateSinkRequest.prototype.sink = null;
    
                    /**
                     * UpdateSinkRequest uniqueWriterIdentity.
                     * @member {boolean} uniqueWriterIdentity
                     * @memberof google.logging.v2.UpdateSinkRequest
                     * @instance
                     */
                    UpdateSinkRequest.prototype.uniqueWriterIdentity = false;
    
                    /**
                     * UpdateSinkRequest updateMask.
                     * @member {google.protobuf.IFieldMask|null|undefined} updateMask
                     * @memberof google.logging.v2.UpdateSinkRequest
                     * @instance
                     */
                    UpdateSinkRequest.prototype.updateMask = null;
    
                    /**
                     * Creates a new UpdateSinkRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.UpdateSinkRequest
                     * @static
                     * @param {google.logging.v2.IUpdateSinkRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.UpdateSinkRequest} UpdateSinkRequest instance
                     */
                    UpdateSinkRequest.create = function create(properties) {
                        return new UpdateSinkRequest(properties);
                    };
    
                    /**
                     * Encodes the specified UpdateSinkRequest message. Does not implicitly {@link google.logging.v2.UpdateSinkRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.UpdateSinkRequest
                     * @static
                     * @param {google.logging.v2.IUpdateSinkRequest} message UpdateSinkRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    UpdateSinkRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.sinkName != null && Object.hasOwnProperty.call(message, "sinkName"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.sinkName);
                        if (message.sink != null && Object.hasOwnProperty.call(message, "sink"))
                            $root.google.logging.v2.LogSink.encode(message.sink, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.uniqueWriterIdentity != null && Object.hasOwnProperty.call(message, "uniqueWriterIdentity"))
                            writer.uint32(/* id 3, wireType 0 =*/24).bool(message.uniqueWriterIdentity);
                        if (message.updateMask != null && Object.hasOwnProperty.call(message, "updateMask"))
                            $root.google.protobuf.FieldMask.encode(message.updateMask, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified UpdateSinkRequest message, length delimited. Does not implicitly {@link google.logging.v2.UpdateSinkRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.UpdateSinkRequest
                     * @static
                     * @param {google.logging.v2.IUpdateSinkRequest} message UpdateSinkRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    UpdateSinkRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes an UpdateSinkRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.UpdateSinkRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.UpdateSinkRequest} UpdateSinkRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    UpdateSinkRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.UpdateSinkRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.sinkName = reader.string();
                                break;
                            case 2:
                                message.sink = $root.google.logging.v2.LogSink.decode(reader, reader.uint32());
                                break;
                            case 3:
                                message.uniqueWriterIdentity = reader.bool();
                                break;
                            case 4:
                                message.updateMask = $root.google.protobuf.FieldMask.decode(reader, reader.uint32());
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes an UpdateSinkRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.UpdateSinkRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.UpdateSinkRequest} UpdateSinkRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    UpdateSinkRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies an UpdateSinkRequest message.
                     * @function verify
                     * @memberof google.logging.v2.UpdateSinkRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    UpdateSinkRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.sinkName != null && message.hasOwnProperty("sinkName"))
                            if (!$util.isString(message.sinkName))
                                return "sinkName: string expected";
                        if (message.sink != null && message.hasOwnProperty("sink")) {
                            var error = $root.google.logging.v2.LogSink.verify(message.sink);
                            if (error)
                                return "sink." + error;
                        }
                        if (message.uniqueWriterIdentity != null && message.hasOwnProperty("uniqueWriterIdentity"))
                            if (typeof message.uniqueWriterIdentity !== "boolean")
                                return "uniqueWriterIdentity: boolean expected";
                        if (message.updateMask != null && message.hasOwnProperty("updateMask")) {
                            var error = $root.google.protobuf.FieldMask.verify(message.updateMask);
                            if (error)
                                return "updateMask." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates an UpdateSinkRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.UpdateSinkRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.UpdateSinkRequest} UpdateSinkRequest
                     */
                    UpdateSinkRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.UpdateSinkRequest)
                            return object;
                        var message = new $root.google.logging.v2.UpdateSinkRequest();
                        if (object.sinkName != null)
                            message.sinkName = String(object.sinkName);
                        if (object.sink != null) {
                            if (typeof object.sink !== "object")
                                throw TypeError(".google.logging.v2.UpdateSinkRequest.sink: object expected");
                            message.sink = $root.google.logging.v2.LogSink.fromObject(object.sink);
                        }
                        if (object.uniqueWriterIdentity != null)
                            message.uniqueWriterIdentity = Boolean(object.uniqueWriterIdentity);
                        if (object.updateMask != null) {
                            if (typeof object.updateMask !== "object")
                                throw TypeError(".google.logging.v2.UpdateSinkRequest.updateMask: object expected");
                            message.updateMask = $root.google.protobuf.FieldMask.fromObject(object.updateMask);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from an UpdateSinkRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.UpdateSinkRequest
                     * @static
                     * @param {google.logging.v2.UpdateSinkRequest} message UpdateSinkRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    UpdateSinkRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.sinkName = "";
                            object.sink = null;
                            object.uniqueWriterIdentity = false;
                            object.updateMask = null;
                        }
                        if (message.sinkName != null && message.hasOwnProperty("sinkName"))
                            object.sinkName = message.sinkName;
                        if (message.sink != null && message.hasOwnProperty("sink"))
                            object.sink = $root.google.logging.v2.LogSink.toObject(message.sink, options);
                        if (message.uniqueWriterIdentity != null && message.hasOwnProperty("uniqueWriterIdentity"))
                            object.uniqueWriterIdentity = message.uniqueWriterIdentity;
                        if (message.updateMask != null && message.hasOwnProperty("updateMask"))
                            object.updateMask = $root.google.protobuf.FieldMask.toObject(message.updateMask, options);
                        return object;
                    };
    
                    /**
                     * Converts this UpdateSinkRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.UpdateSinkRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    UpdateSinkRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return UpdateSinkRequest;
                })();
    
                v2.DeleteSinkRequest = (function() {
    
                    /**
                     * Properties of a DeleteSinkRequest.
                     * @memberof google.logging.v2
                     * @interface IDeleteSinkRequest
                     * @property {string|null} [sinkName] DeleteSinkRequest sinkName
                     */
    
                    /**
                     * Constructs a new DeleteSinkRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a DeleteSinkRequest.
                     * @implements IDeleteSinkRequest
                     * @constructor
                     * @param {google.logging.v2.IDeleteSinkRequest=} [properties] Properties to set
                     */
                    function DeleteSinkRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * DeleteSinkRequest sinkName.
                     * @member {string} sinkName
                     * @memberof google.logging.v2.DeleteSinkRequest
                     * @instance
                     */
                    DeleteSinkRequest.prototype.sinkName = "";
    
                    /**
                     * Creates a new DeleteSinkRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.DeleteSinkRequest
                     * @static
                     * @param {google.logging.v2.IDeleteSinkRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.DeleteSinkRequest} DeleteSinkRequest instance
                     */
                    DeleteSinkRequest.create = function create(properties) {
                        return new DeleteSinkRequest(properties);
                    };
    
                    /**
                     * Encodes the specified DeleteSinkRequest message. Does not implicitly {@link google.logging.v2.DeleteSinkRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.DeleteSinkRequest
                     * @static
                     * @param {google.logging.v2.IDeleteSinkRequest} message DeleteSinkRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    DeleteSinkRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.sinkName != null && Object.hasOwnProperty.call(message, "sinkName"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.sinkName);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified DeleteSinkRequest message, length delimited. Does not implicitly {@link google.logging.v2.DeleteSinkRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.DeleteSinkRequest
                     * @static
                     * @param {google.logging.v2.IDeleteSinkRequest} message DeleteSinkRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    DeleteSinkRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a DeleteSinkRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.DeleteSinkRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.DeleteSinkRequest} DeleteSinkRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    DeleteSinkRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.DeleteSinkRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.sinkName = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a DeleteSinkRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.DeleteSinkRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.DeleteSinkRequest} DeleteSinkRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    DeleteSinkRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a DeleteSinkRequest message.
                     * @function verify
                     * @memberof google.logging.v2.DeleteSinkRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    DeleteSinkRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.sinkName != null && message.hasOwnProperty("sinkName"))
                            if (!$util.isString(message.sinkName))
                                return "sinkName: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a DeleteSinkRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.DeleteSinkRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.DeleteSinkRequest} DeleteSinkRequest
                     */
                    DeleteSinkRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.DeleteSinkRequest)
                            return object;
                        var message = new $root.google.logging.v2.DeleteSinkRequest();
                        if (object.sinkName != null)
                            message.sinkName = String(object.sinkName);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a DeleteSinkRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.DeleteSinkRequest
                     * @static
                     * @param {google.logging.v2.DeleteSinkRequest} message DeleteSinkRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    DeleteSinkRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults)
                            object.sinkName = "";
                        if (message.sinkName != null && message.hasOwnProperty("sinkName"))
                            object.sinkName = message.sinkName;
                        return object;
                    };
    
                    /**
                     * Converts this DeleteSinkRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.DeleteSinkRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    DeleteSinkRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return DeleteSinkRequest;
                })();
    
                v2.LogExclusion = (function() {
    
                    /**
                     * Properties of a LogExclusion.
                     * @memberof google.logging.v2
                     * @interface ILogExclusion
                     * @property {string|null} [name] LogExclusion name
                     * @property {string|null} [description] LogExclusion description
                     * @property {string|null} [filter] LogExclusion filter
                     * @property {boolean|null} [disabled] LogExclusion disabled
                     * @property {google.protobuf.ITimestamp|null} [createTime] LogExclusion createTime
                     * @property {google.protobuf.ITimestamp|null} [updateTime] LogExclusion updateTime
                     */
    
                    /**
                     * Constructs a new LogExclusion.
                     * @memberof google.logging.v2
                     * @classdesc Represents a LogExclusion.
                     * @implements ILogExclusion
                     * @constructor
                     * @param {google.logging.v2.ILogExclusion=} [properties] Properties to set
                     */
                    function LogExclusion(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * LogExclusion name.
                     * @member {string} name
                     * @memberof google.logging.v2.LogExclusion
                     * @instance
                     */
                    LogExclusion.prototype.name = "";
    
                    /**
                     * LogExclusion description.
                     * @member {string} description
                     * @memberof google.logging.v2.LogExclusion
                     * @instance
                     */
                    LogExclusion.prototype.description = "";
    
                    /**
                     * LogExclusion filter.
                     * @member {string} filter
                     * @memberof google.logging.v2.LogExclusion
                     * @instance
                     */
                    LogExclusion.prototype.filter = "";
    
                    /**
                     * LogExclusion disabled.
                     * @member {boolean} disabled
                     * @memberof google.logging.v2.LogExclusion
                     * @instance
                     */
                    LogExclusion.prototype.disabled = false;
    
                    /**
                     * LogExclusion createTime.
                     * @member {google.protobuf.ITimestamp|null|undefined} createTime
                     * @memberof google.logging.v2.LogExclusion
                     * @instance
                     */
                    LogExclusion.prototype.createTime = null;
    
                    /**
                     * LogExclusion updateTime.
                     * @member {google.protobuf.ITimestamp|null|undefined} updateTime
                     * @memberof google.logging.v2.LogExclusion
                     * @instance
                     */
                    LogExclusion.prototype.updateTime = null;
    
                    /**
                     * Creates a new LogExclusion instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.LogExclusion
                     * @static
                     * @param {google.logging.v2.ILogExclusion=} [properties] Properties to set
                     * @returns {google.logging.v2.LogExclusion} LogExclusion instance
                     */
                    LogExclusion.create = function create(properties) {
                        return new LogExclusion(properties);
                    };
    
                    /**
                     * Encodes the specified LogExclusion message. Does not implicitly {@link google.logging.v2.LogExclusion.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.LogExclusion
                     * @static
                     * @param {google.logging.v2.ILogExclusion} message LogExclusion message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    LogExclusion.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        if (message.description != null && Object.hasOwnProperty.call(message, "description"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.description);
                        if (message.filter != null && Object.hasOwnProperty.call(message, "filter"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.filter);
                        if (message.disabled != null && Object.hasOwnProperty.call(message, "disabled"))
                            writer.uint32(/* id 4, wireType 0 =*/32).bool(message.disabled);
                        if (message.createTime != null && Object.hasOwnProperty.call(message, "createTime"))
                            $root.google.protobuf.Timestamp.encode(message.createTime, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                        if (message.updateTime != null && Object.hasOwnProperty.call(message, "updateTime"))
                            $root.google.protobuf.Timestamp.encode(message.updateTime, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified LogExclusion message, length delimited. Does not implicitly {@link google.logging.v2.LogExclusion.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.LogExclusion
                     * @static
                     * @param {google.logging.v2.ILogExclusion} message LogExclusion message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    LogExclusion.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a LogExclusion message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.LogExclusion
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.LogExclusion} LogExclusion
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    LogExclusion.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.LogExclusion();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.name = reader.string();
                                break;
                            case 2:
                                message.description = reader.string();
                                break;
                            case 3:
                                message.filter = reader.string();
                                break;
                            case 4:
                                message.disabled = reader.bool();
                                break;
                            case 5:
                                message.createTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                break;
                            case 6:
                                message.updateTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a LogExclusion message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.LogExclusion
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.LogExclusion} LogExclusion
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    LogExclusion.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a LogExclusion message.
                     * @function verify
                     * @memberof google.logging.v2.LogExclusion
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    LogExclusion.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        if (message.description != null && message.hasOwnProperty("description"))
                            if (!$util.isString(message.description))
                                return "description: string expected";
                        if (message.filter != null && message.hasOwnProperty("filter"))
                            if (!$util.isString(message.filter))
                                return "filter: string expected";
                        if (message.disabled != null && message.hasOwnProperty("disabled"))
                            if (typeof message.disabled !== "boolean")
                                return "disabled: boolean expected";
                        if (message.createTime != null && message.hasOwnProperty("createTime")) {
                            var error = $root.google.protobuf.Timestamp.verify(message.createTime);
                            if (error)
                                return "createTime." + error;
                        }
                        if (message.updateTime != null && message.hasOwnProperty("updateTime")) {
                            var error = $root.google.protobuf.Timestamp.verify(message.updateTime);
                            if (error)
                                return "updateTime." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a LogExclusion message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.LogExclusion
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.LogExclusion} LogExclusion
                     */
                    LogExclusion.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.LogExclusion)
                            return object;
                        var message = new $root.google.logging.v2.LogExclusion();
                        if (object.name != null)
                            message.name = String(object.name);
                        if (object.description != null)
                            message.description = String(object.description);
                        if (object.filter != null)
                            message.filter = String(object.filter);
                        if (object.disabled != null)
                            message.disabled = Boolean(object.disabled);
                        if (object.createTime != null) {
                            if (typeof object.createTime !== "object")
                                throw TypeError(".google.logging.v2.LogExclusion.createTime: object expected");
                            message.createTime = $root.google.protobuf.Timestamp.fromObject(object.createTime);
                        }
                        if (object.updateTime != null) {
                            if (typeof object.updateTime !== "object")
                                throw TypeError(".google.logging.v2.LogExclusion.updateTime: object expected");
                            message.updateTime = $root.google.protobuf.Timestamp.fromObject(object.updateTime);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a LogExclusion message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.LogExclusion
                     * @static
                     * @param {google.logging.v2.LogExclusion} message LogExclusion
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    LogExclusion.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.name = "";
                            object.description = "";
                            object.filter = "";
                            object.disabled = false;
                            object.createTime = null;
                            object.updateTime = null;
                        }
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        if (message.description != null && message.hasOwnProperty("description"))
                            object.description = message.description;
                        if (message.filter != null && message.hasOwnProperty("filter"))
                            object.filter = message.filter;
                        if (message.disabled != null && message.hasOwnProperty("disabled"))
                            object.disabled = message.disabled;
                        if (message.createTime != null && message.hasOwnProperty("createTime"))
                            object.createTime = $root.google.protobuf.Timestamp.toObject(message.createTime, options);
                        if (message.updateTime != null && message.hasOwnProperty("updateTime"))
                            object.updateTime = $root.google.protobuf.Timestamp.toObject(message.updateTime, options);
                        return object;
                    };
    
                    /**
                     * Converts this LogExclusion to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.LogExclusion
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    LogExclusion.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return LogExclusion;
                })();
    
                v2.ListExclusionsRequest = (function() {
    
                    /**
                     * Properties of a ListExclusionsRequest.
                     * @memberof google.logging.v2
                     * @interface IListExclusionsRequest
                     * @property {string|null} [parent] ListExclusionsRequest parent
                     * @property {string|null} [pageToken] ListExclusionsRequest pageToken
                     * @property {number|null} [pageSize] ListExclusionsRequest pageSize
                     */
    
                    /**
                     * Constructs a new ListExclusionsRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a ListExclusionsRequest.
                     * @implements IListExclusionsRequest
                     * @constructor
                     * @param {google.logging.v2.IListExclusionsRequest=} [properties] Properties to set
                     */
                    function ListExclusionsRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ListExclusionsRequest parent.
                     * @member {string} parent
                     * @memberof google.logging.v2.ListExclusionsRequest
                     * @instance
                     */
                    ListExclusionsRequest.prototype.parent = "";
    
                    /**
                     * ListExclusionsRequest pageToken.
                     * @member {string} pageToken
                     * @memberof google.logging.v2.ListExclusionsRequest
                     * @instance
                     */
                    ListExclusionsRequest.prototype.pageToken = "";
    
                    /**
                     * ListExclusionsRequest pageSize.
                     * @member {number} pageSize
                     * @memberof google.logging.v2.ListExclusionsRequest
                     * @instance
                     */
                    ListExclusionsRequest.prototype.pageSize = 0;
    
                    /**
                     * Creates a new ListExclusionsRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.ListExclusionsRequest
                     * @static
                     * @param {google.logging.v2.IListExclusionsRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.ListExclusionsRequest} ListExclusionsRequest instance
                     */
                    ListExclusionsRequest.create = function create(properties) {
                        return new ListExclusionsRequest(properties);
                    };
    
                    /**
                     * Encodes the specified ListExclusionsRequest message. Does not implicitly {@link google.logging.v2.ListExclusionsRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.ListExclusionsRequest
                     * @static
                     * @param {google.logging.v2.IListExclusionsRequest} message ListExclusionsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListExclusionsRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                        if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.pageToken);
                        if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                            writer.uint32(/* id 3, wireType 0 =*/24).int32(message.pageSize);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ListExclusionsRequest message, length delimited. Does not implicitly {@link google.logging.v2.ListExclusionsRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.ListExclusionsRequest
                     * @static
                     * @param {google.logging.v2.IListExclusionsRequest} message ListExclusionsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListExclusionsRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ListExclusionsRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.ListExclusionsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.ListExclusionsRequest} ListExclusionsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListExclusionsRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.ListExclusionsRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.parent = reader.string();
                                break;
                            case 2:
                                message.pageToken = reader.string();
                                break;
                            case 3:
                                message.pageSize = reader.int32();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ListExclusionsRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.ListExclusionsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.ListExclusionsRequest} ListExclusionsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListExclusionsRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ListExclusionsRequest message.
                     * @function verify
                     * @memberof google.logging.v2.ListExclusionsRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ListExclusionsRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.parent != null && message.hasOwnProperty("parent"))
                            if (!$util.isString(message.parent))
                                return "parent: string expected";
                        if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                            if (!$util.isString(message.pageToken))
                                return "pageToken: string expected";
                        if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                            if (!$util.isInteger(message.pageSize))
                                return "pageSize: integer expected";
                        return null;
                    };
    
                    /**
                     * Creates a ListExclusionsRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.ListExclusionsRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.ListExclusionsRequest} ListExclusionsRequest
                     */
                    ListExclusionsRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.ListExclusionsRequest)
                            return object;
                        var message = new $root.google.logging.v2.ListExclusionsRequest();
                        if (object.parent != null)
                            message.parent = String(object.parent);
                        if (object.pageToken != null)
                            message.pageToken = String(object.pageToken);
                        if (object.pageSize != null)
                            message.pageSize = object.pageSize | 0;
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ListExclusionsRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.ListExclusionsRequest
                     * @static
                     * @param {google.logging.v2.ListExclusionsRequest} message ListExclusionsRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ListExclusionsRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.parent = "";
                            object.pageToken = "";
                            object.pageSize = 0;
                        }
                        if (message.parent != null && message.hasOwnProperty("parent"))
                            object.parent = message.parent;
                        if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                            object.pageToken = message.pageToken;
                        if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                            object.pageSize = message.pageSize;
                        return object;
                    };
    
                    /**
                     * Converts this ListExclusionsRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.ListExclusionsRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ListExclusionsRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return ListExclusionsRequest;
                })();
    
                v2.ListExclusionsResponse = (function() {
    
                    /**
                     * Properties of a ListExclusionsResponse.
                     * @memberof google.logging.v2
                     * @interface IListExclusionsResponse
                     * @property {Array.<google.logging.v2.ILogExclusion>|null} [exclusions] ListExclusionsResponse exclusions
                     * @property {string|null} [nextPageToken] ListExclusionsResponse nextPageToken
                     */
    
                    /**
                     * Constructs a new ListExclusionsResponse.
                     * @memberof google.logging.v2
                     * @classdesc Represents a ListExclusionsResponse.
                     * @implements IListExclusionsResponse
                     * @constructor
                     * @param {google.logging.v2.IListExclusionsResponse=} [properties] Properties to set
                     */
                    function ListExclusionsResponse(properties) {
                        this.exclusions = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ListExclusionsResponse exclusions.
                     * @member {Array.<google.logging.v2.ILogExclusion>} exclusions
                     * @memberof google.logging.v2.ListExclusionsResponse
                     * @instance
                     */
                    ListExclusionsResponse.prototype.exclusions = $util.emptyArray;
    
                    /**
                     * ListExclusionsResponse nextPageToken.
                     * @member {string} nextPageToken
                     * @memberof google.logging.v2.ListExclusionsResponse
                     * @instance
                     */
                    ListExclusionsResponse.prototype.nextPageToken = "";
    
                    /**
                     * Creates a new ListExclusionsResponse instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.ListExclusionsResponse
                     * @static
                     * @param {google.logging.v2.IListExclusionsResponse=} [properties] Properties to set
                     * @returns {google.logging.v2.ListExclusionsResponse} ListExclusionsResponse instance
                     */
                    ListExclusionsResponse.create = function create(properties) {
                        return new ListExclusionsResponse(properties);
                    };
    
                    /**
                     * Encodes the specified ListExclusionsResponse message. Does not implicitly {@link google.logging.v2.ListExclusionsResponse.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.ListExclusionsResponse
                     * @static
                     * @param {google.logging.v2.IListExclusionsResponse} message ListExclusionsResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListExclusionsResponse.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.exclusions != null && message.exclusions.length)
                            for (var i = 0; i < message.exclusions.length; ++i)
                                $root.google.logging.v2.LogExclusion.encode(message.exclusions[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ListExclusionsResponse message, length delimited. Does not implicitly {@link google.logging.v2.ListExclusionsResponse.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.ListExclusionsResponse
                     * @static
                     * @param {google.logging.v2.IListExclusionsResponse} message ListExclusionsResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListExclusionsResponse.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ListExclusionsResponse message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.ListExclusionsResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.ListExclusionsResponse} ListExclusionsResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListExclusionsResponse.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.ListExclusionsResponse();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                if (!(message.exclusions && message.exclusions.length))
                                    message.exclusions = [];
                                message.exclusions.push($root.google.logging.v2.LogExclusion.decode(reader, reader.uint32()));
                                break;
                            case 2:
                                message.nextPageToken = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ListExclusionsResponse message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.ListExclusionsResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.ListExclusionsResponse} ListExclusionsResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListExclusionsResponse.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ListExclusionsResponse message.
                     * @function verify
                     * @memberof google.logging.v2.ListExclusionsResponse
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ListExclusionsResponse.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.exclusions != null && message.hasOwnProperty("exclusions")) {
                            if (!Array.isArray(message.exclusions))
                                return "exclusions: array expected";
                            for (var i = 0; i < message.exclusions.length; ++i) {
                                var error = $root.google.logging.v2.LogExclusion.verify(message.exclusions[i]);
                                if (error)
                                    return "exclusions." + error;
                            }
                        }
                        if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                            if (!$util.isString(message.nextPageToken))
                                return "nextPageToken: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a ListExclusionsResponse message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.ListExclusionsResponse
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.ListExclusionsResponse} ListExclusionsResponse
                     */
                    ListExclusionsResponse.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.ListExclusionsResponse)
                            return object;
                        var message = new $root.google.logging.v2.ListExclusionsResponse();
                        if (object.exclusions) {
                            if (!Array.isArray(object.exclusions))
                                throw TypeError(".google.logging.v2.ListExclusionsResponse.exclusions: array expected");
                            message.exclusions = [];
                            for (var i = 0; i < object.exclusions.length; ++i) {
                                if (typeof object.exclusions[i] !== "object")
                                    throw TypeError(".google.logging.v2.ListExclusionsResponse.exclusions: object expected");
                                message.exclusions[i] = $root.google.logging.v2.LogExclusion.fromObject(object.exclusions[i]);
                            }
                        }
                        if (object.nextPageToken != null)
                            message.nextPageToken = String(object.nextPageToken);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ListExclusionsResponse message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.ListExclusionsResponse
                     * @static
                     * @param {google.logging.v2.ListExclusionsResponse} message ListExclusionsResponse
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ListExclusionsResponse.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.exclusions = [];
                        if (options.defaults)
                            object.nextPageToken = "";
                        if (message.exclusions && message.exclusions.length) {
                            object.exclusions = [];
                            for (var j = 0; j < message.exclusions.length; ++j)
                                object.exclusions[j] = $root.google.logging.v2.LogExclusion.toObject(message.exclusions[j], options);
                        }
                        if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                            object.nextPageToken = message.nextPageToken;
                        return object;
                    };
    
                    /**
                     * Converts this ListExclusionsResponse to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.ListExclusionsResponse
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ListExclusionsResponse.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return ListExclusionsResponse;
                })();
    
                v2.GetExclusionRequest = (function() {
    
                    /**
                     * Properties of a GetExclusionRequest.
                     * @memberof google.logging.v2
                     * @interface IGetExclusionRequest
                     * @property {string|null} [name] GetExclusionRequest name
                     */
    
                    /**
                     * Constructs a new GetExclusionRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a GetExclusionRequest.
                     * @implements IGetExclusionRequest
                     * @constructor
                     * @param {google.logging.v2.IGetExclusionRequest=} [properties] Properties to set
                     */
                    function GetExclusionRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * GetExclusionRequest name.
                     * @member {string} name
                     * @memberof google.logging.v2.GetExclusionRequest
                     * @instance
                     */
                    GetExclusionRequest.prototype.name = "";
    
                    /**
                     * Creates a new GetExclusionRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.GetExclusionRequest
                     * @static
                     * @param {google.logging.v2.IGetExclusionRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.GetExclusionRequest} GetExclusionRequest instance
                     */
                    GetExclusionRequest.create = function create(properties) {
                        return new GetExclusionRequest(properties);
                    };
    
                    /**
                     * Encodes the specified GetExclusionRequest message. Does not implicitly {@link google.logging.v2.GetExclusionRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.GetExclusionRequest
                     * @static
                     * @param {google.logging.v2.IGetExclusionRequest} message GetExclusionRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    GetExclusionRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified GetExclusionRequest message, length delimited. Does not implicitly {@link google.logging.v2.GetExclusionRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.GetExclusionRequest
                     * @static
                     * @param {google.logging.v2.IGetExclusionRequest} message GetExclusionRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    GetExclusionRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a GetExclusionRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.GetExclusionRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.GetExclusionRequest} GetExclusionRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    GetExclusionRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.GetExclusionRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.name = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a GetExclusionRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.GetExclusionRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.GetExclusionRequest} GetExclusionRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    GetExclusionRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a GetExclusionRequest message.
                     * @function verify
                     * @memberof google.logging.v2.GetExclusionRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    GetExclusionRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a GetExclusionRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.GetExclusionRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.GetExclusionRequest} GetExclusionRequest
                     */
                    GetExclusionRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.GetExclusionRequest)
                            return object;
                        var message = new $root.google.logging.v2.GetExclusionRequest();
                        if (object.name != null)
                            message.name = String(object.name);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a GetExclusionRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.GetExclusionRequest
                     * @static
                     * @param {google.logging.v2.GetExclusionRequest} message GetExclusionRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    GetExclusionRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults)
                            object.name = "";
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        return object;
                    };
    
                    /**
                     * Converts this GetExclusionRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.GetExclusionRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    GetExclusionRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return GetExclusionRequest;
                })();
    
                v2.CreateExclusionRequest = (function() {
    
                    /**
                     * Properties of a CreateExclusionRequest.
                     * @memberof google.logging.v2
                     * @interface ICreateExclusionRequest
                     * @property {string|null} [parent] CreateExclusionRequest parent
                     * @property {google.logging.v2.ILogExclusion|null} [exclusion] CreateExclusionRequest exclusion
                     */
    
                    /**
                     * Constructs a new CreateExclusionRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a CreateExclusionRequest.
                     * @implements ICreateExclusionRequest
                     * @constructor
                     * @param {google.logging.v2.ICreateExclusionRequest=} [properties] Properties to set
                     */
                    function CreateExclusionRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * CreateExclusionRequest parent.
                     * @member {string} parent
                     * @memberof google.logging.v2.CreateExclusionRequest
                     * @instance
                     */
                    CreateExclusionRequest.prototype.parent = "";
    
                    /**
                     * CreateExclusionRequest exclusion.
                     * @member {google.logging.v2.ILogExclusion|null|undefined} exclusion
                     * @memberof google.logging.v2.CreateExclusionRequest
                     * @instance
                     */
                    CreateExclusionRequest.prototype.exclusion = null;
    
                    /**
                     * Creates a new CreateExclusionRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.CreateExclusionRequest
                     * @static
                     * @param {google.logging.v2.ICreateExclusionRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.CreateExclusionRequest} CreateExclusionRequest instance
                     */
                    CreateExclusionRequest.create = function create(properties) {
                        return new CreateExclusionRequest(properties);
                    };
    
                    /**
                     * Encodes the specified CreateExclusionRequest message. Does not implicitly {@link google.logging.v2.CreateExclusionRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.CreateExclusionRequest
                     * @static
                     * @param {google.logging.v2.ICreateExclusionRequest} message CreateExclusionRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    CreateExclusionRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                        if (message.exclusion != null && Object.hasOwnProperty.call(message, "exclusion"))
                            $root.google.logging.v2.LogExclusion.encode(message.exclusion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified CreateExclusionRequest message, length delimited. Does not implicitly {@link google.logging.v2.CreateExclusionRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.CreateExclusionRequest
                     * @static
                     * @param {google.logging.v2.ICreateExclusionRequest} message CreateExclusionRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    CreateExclusionRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a CreateExclusionRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.CreateExclusionRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.CreateExclusionRequest} CreateExclusionRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    CreateExclusionRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.CreateExclusionRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.parent = reader.string();
                                break;
                            case 2:
                                message.exclusion = $root.google.logging.v2.LogExclusion.decode(reader, reader.uint32());
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a CreateExclusionRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.CreateExclusionRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.CreateExclusionRequest} CreateExclusionRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    CreateExclusionRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a CreateExclusionRequest message.
                     * @function verify
                     * @memberof google.logging.v2.CreateExclusionRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    CreateExclusionRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.parent != null && message.hasOwnProperty("parent"))
                            if (!$util.isString(message.parent))
                                return "parent: string expected";
                        if (message.exclusion != null && message.hasOwnProperty("exclusion")) {
                            var error = $root.google.logging.v2.LogExclusion.verify(message.exclusion);
                            if (error)
                                return "exclusion." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a CreateExclusionRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.CreateExclusionRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.CreateExclusionRequest} CreateExclusionRequest
                     */
                    CreateExclusionRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.CreateExclusionRequest)
                            return object;
                        var message = new $root.google.logging.v2.CreateExclusionRequest();
                        if (object.parent != null)
                            message.parent = String(object.parent);
                        if (object.exclusion != null) {
                            if (typeof object.exclusion !== "object")
                                throw TypeError(".google.logging.v2.CreateExclusionRequest.exclusion: object expected");
                            message.exclusion = $root.google.logging.v2.LogExclusion.fromObject(object.exclusion);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a CreateExclusionRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.CreateExclusionRequest
                     * @static
                     * @param {google.logging.v2.CreateExclusionRequest} message CreateExclusionRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    CreateExclusionRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.parent = "";
                            object.exclusion = null;
                        }
                        if (message.parent != null && message.hasOwnProperty("parent"))
                            object.parent = message.parent;
                        if (message.exclusion != null && message.hasOwnProperty("exclusion"))
                            object.exclusion = $root.google.logging.v2.LogExclusion.toObject(message.exclusion, options);
                        return object;
                    };
    
                    /**
                     * Converts this CreateExclusionRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.CreateExclusionRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    CreateExclusionRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return CreateExclusionRequest;
                })();
    
                v2.UpdateExclusionRequest = (function() {
    
                    /**
                     * Properties of an UpdateExclusionRequest.
                     * @memberof google.logging.v2
                     * @interface IUpdateExclusionRequest
                     * @property {string|null} [name] UpdateExclusionRequest name
                     * @property {google.logging.v2.ILogExclusion|null} [exclusion] UpdateExclusionRequest exclusion
                     * @property {google.protobuf.IFieldMask|null} [updateMask] UpdateExclusionRequest updateMask
                     */
    
                    /**
                     * Constructs a new UpdateExclusionRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents an UpdateExclusionRequest.
                     * @implements IUpdateExclusionRequest
                     * @constructor
                     * @param {google.logging.v2.IUpdateExclusionRequest=} [properties] Properties to set
                     */
                    function UpdateExclusionRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * UpdateExclusionRequest name.
                     * @member {string} name
                     * @memberof google.logging.v2.UpdateExclusionRequest
                     * @instance
                     */
                    UpdateExclusionRequest.prototype.name = "";
    
                    /**
                     * UpdateExclusionRequest exclusion.
                     * @member {google.logging.v2.ILogExclusion|null|undefined} exclusion
                     * @memberof google.logging.v2.UpdateExclusionRequest
                     * @instance
                     */
                    UpdateExclusionRequest.prototype.exclusion = null;
    
                    /**
                     * UpdateExclusionRequest updateMask.
                     * @member {google.protobuf.IFieldMask|null|undefined} updateMask
                     * @memberof google.logging.v2.UpdateExclusionRequest
                     * @instance
                     */
                    UpdateExclusionRequest.prototype.updateMask = null;
    
                    /**
                     * Creates a new UpdateExclusionRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.UpdateExclusionRequest
                     * @static
                     * @param {google.logging.v2.IUpdateExclusionRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.UpdateExclusionRequest} UpdateExclusionRequest instance
                     */
                    UpdateExclusionRequest.create = function create(properties) {
                        return new UpdateExclusionRequest(properties);
                    };
    
                    /**
                     * Encodes the specified UpdateExclusionRequest message. Does not implicitly {@link google.logging.v2.UpdateExclusionRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.UpdateExclusionRequest
                     * @static
                     * @param {google.logging.v2.IUpdateExclusionRequest} message UpdateExclusionRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    UpdateExclusionRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        if (message.exclusion != null && Object.hasOwnProperty.call(message, "exclusion"))
                            $root.google.logging.v2.LogExclusion.encode(message.exclusion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.updateMask != null && Object.hasOwnProperty.call(message, "updateMask"))
                            $root.google.protobuf.FieldMask.encode(message.updateMask, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified UpdateExclusionRequest message, length delimited. Does not implicitly {@link google.logging.v2.UpdateExclusionRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.UpdateExclusionRequest
                     * @static
                     * @param {google.logging.v2.IUpdateExclusionRequest} message UpdateExclusionRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    UpdateExclusionRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes an UpdateExclusionRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.UpdateExclusionRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.UpdateExclusionRequest} UpdateExclusionRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    UpdateExclusionRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.UpdateExclusionRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.name = reader.string();
                                break;
                            case 2:
                                message.exclusion = $root.google.logging.v2.LogExclusion.decode(reader, reader.uint32());
                                break;
                            case 3:
                                message.updateMask = $root.google.protobuf.FieldMask.decode(reader, reader.uint32());
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes an UpdateExclusionRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.UpdateExclusionRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.UpdateExclusionRequest} UpdateExclusionRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    UpdateExclusionRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies an UpdateExclusionRequest message.
                     * @function verify
                     * @memberof google.logging.v2.UpdateExclusionRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    UpdateExclusionRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        if (message.exclusion != null && message.hasOwnProperty("exclusion")) {
                            var error = $root.google.logging.v2.LogExclusion.verify(message.exclusion);
                            if (error)
                                return "exclusion." + error;
                        }
                        if (message.updateMask != null && message.hasOwnProperty("updateMask")) {
                            var error = $root.google.protobuf.FieldMask.verify(message.updateMask);
                            if (error)
                                return "updateMask." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates an UpdateExclusionRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.UpdateExclusionRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.UpdateExclusionRequest} UpdateExclusionRequest
                     */
                    UpdateExclusionRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.UpdateExclusionRequest)
                            return object;
                        var message = new $root.google.logging.v2.UpdateExclusionRequest();
                        if (object.name != null)
                            message.name = String(object.name);
                        if (object.exclusion != null) {
                            if (typeof object.exclusion !== "object")
                                throw TypeError(".google.logging.v2.UpdateExclusionRequest.exclusion: object expected");
                            message.exclusion = $root.google.logging.v2.LogExclusion.fromObject(object.exclusion);
                        }
                        if (object.updateMask != null) {
                            if (typeof object.updateMask !== "object")
                                throw TypeError(".google.logging.v2.UpdateExclusionRequest.updateMask: object expected");
                            message.updateMask = $root.google.protobuf.FieldMask.fromObject(object.updateMask);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from an UpdateExclusionRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.UpdateExclusionRequest
                     * @static
                     * @param {google.logging.v2.UpdateExclusionRequest} message UpdateExclusionRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    UpdateExclusionRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.name = "";
                            object.exclusion = null;
                            object.updateMask = null;
                        }
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        if (message.exclusion != null && message.hasOwnProperty("exclusion"))
                            object.exclusion = $root.google.logging.v2.LogExclusion.toObject(message.exclusion, options);
                        if (message.updateMask != null && message.hasOwnProperty("updateMask"))
                            object.updateMask = $root.google.protobuf.FieldMask.toObject(message.updateMask, options);
                        return object;
                    };
    
                    /**
                     * Converts this UpdateExclusionRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.UpdateExclusionRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    UpdateExclusionRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return UpdateExclusionRequest;
                })();
    
                v2.DeleteExclusionRequest = (function() {
    
                    /**
                     * Properties of a DeleteExclusionRequest.
                     * @memberof google.logging.v2
                     * @interface IDeleteExclusionRequest
                     * @property {string|null} [name] DeleteExclusionRequest name
                     */
    
                    /**
                     * Constructs a new DeleteExclusionRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a DeleteExclusionRequest.
                     * @implements IDeleteExclusionRequest
                     * @constructor
                     * @param {google.logging.v2.IDeleteExclusionRequest=} [properties] Properties to set
                     */
                    function DeleteExclusionRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * DeleteExclusionRequest name.
                     * @member {string} name
                     * @memberof google.logging.v2.DeleteExclusionRequest
                     * @instance
                     */
                    DeleteExclusionRequest.prototype.name = "";
    
                    /**
                     * Creates a new DeleteExclusionRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.DeleteExclusionRequest
                     * @static
                     * @param {google.logging.v2.IDeleteExclusionRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.DeleteExclusionRequest} DeleteExclusionRequest instance
                     */
                    DeleteExclusionRequest.create = function create(properties) {
                        return new DeleteExclusionRequest(properties);
                    };
    
                    /**
                     * Encodes the specified DeleteExclusionRequest message. Does not implicitly {@link google.logging.v2.DeleteExclusionRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.DeleteExclusionRequest
                     * @static
                     * @param {google.logging.v2.IDeleteExclusionRequest} message DeleteExclusionRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    DeleteExclusionRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified DeleteExclusionRequest message, length delimited. Does not implicitly {@link google.logging.v2.DeleteExclusionRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.DeleteExclusionRequest
                     * @static
                     * @param {google.logging.v2.IDeleteExclusionRequest} message DeleteExclusionRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    DeleteExclusionRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a DeleteExclusionRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.DeleteExclusionRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.DeleteExclusionRequest} DeleteExclusionRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    DeleteExclusionRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.DeleteExclusionRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.name = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a DeleteExclusionRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.DeleteExclusionRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.DeleteExclusionRequest} DeleteExclusionRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    DeleteExclusionRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a DeleteExclusionRequest message.
                     * @function verify
                     * @memberof google.logging.v2.DeleteExclusionRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    DeleteExclusionRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a DeleteExclusionRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.DeleteExclusionRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.DeleteExclusionRequest} DeleteExclusionRequest
                     */
                    DeleteExclusionRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.DeleteExclusionRequest)
                            return object;
                        var message = new $root.google.logging.v2.DeleteExclusionRequest();
                        if (object.name != null)
                            message.name = String(object.name);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a DeleteExclusionRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.DeleteExclusionRequest
                     * @static
                     * @param {google.logging.v2.DeleteExclusionRequest} message DeleteExclusionRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    DeleteExclusionRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults)
                            object.name = "";
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        return object;
                    };
    
                    /**
                     * Converts this DeleteExclusionRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.DeleteExclusionRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    DeleteExclusionRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return DeleteExclusionRequest;
                })();
    
                v2.GetCmekSettingsRequest = (function() {
    
                    /**
                     * Properties of a GetCmekSettingsRequest.
                     * @memberof google.logging.v2
                     * @interface IGetCmekSettingsRequest
                     * @property {string|null} [name] GetCmekSettingsRequest name
                     */
    
                    /**
                     * Constructs a new GetCmekSettingsRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a GetCmekSettingsRequest.
                     * @implements IGetCmekSettingsRequest
                     * @constructor
                     * @param {google.logging.v2.IGetCmekSettingsRequest=} [properties] Properties to set
                     */
                    function GetCmekSettingsRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * GetCmekSettingsRequest name.
                     * @member {string} name
                     * @memberof google.logging.v2.GetCmekSettingsRequest
                     * @instance
                     */
                    GetCmekSettingsRequest.prototype.name = "";
    
                    /**
                     * Creates a new GetCmekSettingsRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.GetCmekSettingsRequest
                     * @static
                     * @param {google.logging.v2.IGetCmekSettingsRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.GetCmekSettingsRequest} GetCmekSettingsRequest instance
                     */
                    GetCmekSettingsRequest.create = function create(properties) {
                        return new GetCmekSettingsRequest(properties);
                    };
    
                    /**
                     * Encodes the specified GetCmekSettingsRequest message. Does not implicitly {@link google.logging.v2.GetCmekSettingsRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.GetCmekSettingsRequest
                     * @static
                     * @param {google.logging.v2.IGetCmekSettingsRequest} message GetCmekSettingsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    GetCmekSettingsRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified GetCmekSettingsRequest message, length delimited. Does not implicitly {@link google.logging.v2.GetCmekSettingsRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.GetCmekSettingsRequest
                     * @static
                     * @param {google.logging.v2.IGetCmekSettingsRequest} message GetCmekSettingsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    GetCmekSettingsRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a GetCmekSettingsRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.GetCmekSettingsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.GetCmekSettingsRequest} GetCmekSettingsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    GetCmekSettingsRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.GetCmekSettingsRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.name = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a GetCmekSettingsRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.GetCmekSettingsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.GetCmekSettingsRequest} GetCmekSettingsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    GetCmekSettingsRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a GetCmekSettingsRequest message.
                     * @function verify
                     * @memberof google.logging.v2.GetCmekSettingsRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    GetCmekSettingsRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a GetCmekSettingsRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.GetCmekSettingsRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.GetCmekSettingsRequest} GetCmekSettingsRequest
                     */
                    GetCmekSettingsRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.GetCmekSettingsRequest)
                            return object;
                        var message = new $root.google.logging.v2.GetCmekSettingsRequest();
                        if (object.name != null)
                            message.name = String(object.name);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a GetCmekSettingsRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.GetCmekSettingsRequest
                     * @static
                     * @param {google.logging.v2.GetCmekSettingsRequest} message GetCmekSettingsRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    GetCmekSettingsRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults)
                            object.name = "";
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        return object;
                    };
    
                    /**
                     * Converts this GetCmekSettingsRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.GetCmekSettingsRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    GetCmekSettingsRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return GetCmekSettingsRequest;
                })();
    
                v2.UpdateCmekSettingsRequest = (function() {
    
                    /**
                     * Properties of an UpdateCmekSettingsRequest.
                     * @memberof google.logging.v2
                     * @interface IUpdateCmekSettingsRequest
                     * @property {string|null} [name] UpdateCmekSettingsRequest name
                     * @property {google.logging.v2.ICmekSettings|null} [cmekSettings] UpdateCmekSettingsRequest cmekSettings
                     * @property {google.protobuf.IFieldMask|null} [updateMask] UpdateCmekSettingsRequest updateMask
                     */
    
                    /**
                     * Constructs a new UpdateCmekSettingsRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents an UpdateCmekSettingsRequest.
                     * @implements IUpdateCmekSettingsRequest
                     * @constructor
                     * @param {google.logging.v2.IUpdateCmekSettingsRequest=} [properties] Properties to set
                     */
                    function UpdateCmekSettingsRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * UpdateCmekSettingsRequest name.
                     * @member {string} name
                     * @memberof google.logging.v2.UpdateCmekSettingsRequest
                     * @instance
                     */
                    UpdateCmekSettingsRequest.prototype.name = "";
    
                    /**
                     * UpdateCmekSettingsRequest cmekSettings.
                     * @member {google.logging.v2.ICmekSettings|null|undefined} cmekSettings
                     * @memberof google.logging.v2.UpdateCmekSettingsRequest
                     * @instance
                     */
                    UpdateCmekSettingsRequest.prototype.cmekSettings = null;
    
                    /**
                     * UpdateCmekSettingsRequest updateMask.
                     * @member {google.protobuf.IFieldMask|null|undefined} updateMask
                     * @memberof google.logging.v2.UpdateCmekSettingsRequest
                     * @instance
                     */
                    UpdateCmekSettingsRequest.prototype.updateMask = null;
    
                    /**
                     * Creates a new UpdateCmekSettingsRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.UpdateCmekSettingsRequest
                     * @static
                     * @param {google.logging.v2.IUpdateCmekSettingsRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.UpdateCmekSettingsRequest} UpdateCmekSettingsRequest instance
                     */
                    UpdateCmekSettingsRequest.create = function create(properties) {
                        return new UpdateCmekSettingsRequest(properties);
                    };
    
                    /**
                     * Encodes the specified UpdateCmekSettingsRequest message. Does not implicitly {@link google.logging.v2.UpdateCmekSettingsRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.UpdateCmekSettingsRequest
                     * @static
                     * @param {google.logging.v2.IUpdateCmekSettingsRequest} message UpdateCmekSettingsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    UpdateCmekSettingsRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        if (message.cmekSettings != null && Object.hasOwnProperty.call(message, "cmekSettings"))
                            $root.google.logging.v2.CmekSettings.encode(message.cmekSettings, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.updateMask != null && Object.hasOwnProperty.call(message, "updateMask"))
                            $root.google.protobuf.FieldMask.encode(message.updateMask, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified UpdateCmekSettingsRequest message, length delimited. Does not implicitly {@link google.logging.v2.UpdateCmekSettingsRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.UpdateCmekSettingsRequest
                     * @static
                     * @param {google.logging.v2.IUpdateCmekSettingsRequest} message UpdateCmekSettingsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    UpdateCmekSettingsRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes an UpdateCmekSettingsRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.UpdateCmekSettingsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.UpdateCmekSettingsRequest} UpdateCmekSettingsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    UpdateCmekSettingsRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.UpdateCmekSettingsRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.name = reader.string();
                                break;
                            case 2:
                                message.cmekSettings = $root.google.logging.v2.CmekSettings.decode(reader, reader.uint32());
                                break;
                            case 3:
                                message.updateMask = $root.google.protobuf.FieldMask.decode(reader, reader.uint32());
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes an UpdateCmekSettingsRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.UpdateCmekSettingsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.UpdateCmekSettingsRequest} UpdateCmekSettingsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    UpdateCmekSettingsRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies an UpdateCmekSettingsRequest message.
                     * @function verify
                     * @memberof google.logging.v2.UpdateCmekSettingsRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    UpdateCmekSettingsRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        if (message.cmekSettings != null && message.hasOwnProperty("cmekSettings")) {
                            var error = $root.google.logging.v2.CmekSettings.verify(message.cmekSettings);
                            if (error)
                                return "cmekSettings." + error;
                        }
                        if (message.updateMask != null && message.hasOwnProperty("updateMask")) {
                            var error = $root.google.protobuf.FieldMask.verify(message.updateMask);
                            if (error)
                                return "updateMask." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates an UpdateCmekSettingsRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.UpdateCmekSettingsRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.UpdateCmekSettingsRequest} UpdateCmekSettingsRequest
                     */
                    UpdateCmekSettingsRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.UpdateCmekSettingsRequest)
                            return object;
                        var message = new $root.google.logging.v2.UpdateCmekSettingsRequest();
                        if (object.name != null)
                            message.name = String(object.name);
                        if (object.cmekSettings != null) {
                            if (typeof object.cmekSettings !== "object")
                                throw TypeError(".google.logging.v2.UpdateCmekSettingsRequest.cmekSettings: object expected");
                            message.cmekSettings = $root.google.logging.v2.CmekSettings.fromObject(object.cmekSettings);
                        }
                        if (object.updateMask != null) {
                            if (typeof object.updateMask !== "object")
                                throw TypeError(".google.logging.v2.UpdateCmekSettingsRequest.updateMask: object expected");
                            message.updateMask = $root.google.protobuf.FieldMask.fromObject(object.updateMask);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from an UpdateCmekSettingsRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.UpdateCmekSettingsRequest
                     * @static
                     * @param {google.logging.v2.UpdateCmekSettingsRequest} message UpdateCmekSettingsRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    UpdateCmekSettingsRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.name = "";
                            object.cmekSettings = null;
                            object.updateMask = null;
                        }
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        if (message.cmekSettings != null && message.hasOwnProperty("cmekSettings"))
                            object.cmekSettings = $root.google.logging.v2.CmekSettings.toObject(message.cmekSettings, options);
                        if (message.updateMask != null && message.hasOwnProperty("updateMask"))
                            object.updateMask = $root.google.protobuf.FieldMask.toObject(message.updateMask, options);
                        return object;
                    };
    
                    /**
                     * Converts this UpdateCmekSettingsRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.UpdateCmekSettingsRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    UpdateCmekSettingsRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return UpdateCmekSettingsRequest;
                })();
    
                v2.CmekSettings = (function() {
    
                    /**
                     * Properties of a CmekSettings.
                     * @memberof google.logging.v2
                     * @interface ICmekSettings
                     * @property {string|null} [name] CmekSettings name
                     * @property {string|null} [kmsKeyName] CmekSettings kmsKeyName
                     * @property {string|null} [serviceAccountId] CmekSettings serviceAccountId
                     */
    
                    /**
                     * Constructs a new CmekSettings.
                     * @memberof google.logging.v2
                     * @classdesc Represents a CmekSettings.
                     * @implements ICmekSettings
                     * @constructor
                     * @param {google.logging.v2.ICmekSettings=} [properties] Properties to set
                     */
                    function CmekSettings(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * CmekSettings name.
                     * @member {string} name
                     * @memberof google.logging.v2.CmekSettings
                     * @instance
                     */
                    CmekSettings.prototype.name = "";
    
                    /**
                     * CmekSettings kmsKeyName.
                     * @member {string} kmsKeyName
                     * @memberof google.logging.v2.CmekSettings
                     * @instance
                     */
                    CmekSettings.prototype.kmsKeyName = "";
    
                    /**
                     * CmekSettings serviceAccountId.
                     * @member {string} serviceAccountId
                     * @memberof google.logging.v2.CmekSettings
                     * @instance
                     */
                    CmekSettings.prototype.serviceAccountId = "";
    
                    /**
                     * Creates a new CmekSettings instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.CmekSettings
                     * @static
                     * @param {google.logging.v2.ICmekSettings=} [properties] Properties to set
                     * @returns {google.logging.v2.CmekSettings} CmekSettings instance
                     */
                    CmekSettings.create = function create(properties) {
                        return new CmekSettings(properties);
                    };
    
                    /**
                     * Encodes the specified CmekSettings message. Does not implicitly {@link google.logging.v2.CmekSettings.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.CmekSettings
                     * @static
                     * @param {google.logging.v2.ICmekSettings} message CmekSettings message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    CmekSettings.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        if (message.kmsKeyName != null && Object.hasOwnProperty.call(message, "kmsKeyName"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.kmsKeyName);
                        if (message.serviceAccountId != null && Object.hasOwnProperty.call(message, "serviceAccountId"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.serviceAccountId);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified CmekSettings message, length delimited. Does not implicitly {@link google.logging.v2.CmekSettings.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.CmekSettings
                     * @static
                     * @param {google.logging.v2.ICmekSettings} message CmekSettings message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    CmekSettings.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a CmekSettings message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.CmekSettings
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.CmekSettings} CmekSettings
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    CmekSettings.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.CmekSettings();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.name = reader.string();
                                break;
                            case 2:
                                message.kmsKeyName = reader.string();
                                break;
                            case 3:
                                message.serviceAccountId = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a CmekSettings message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.CmekSettings
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.CmekSettings} CmekSettings
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    CmekSettings.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a CmekSettings message.
                     * @function verify
                     * @memberof google.logging.v2.CmekSettings
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    CmekSettings.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        if (message.kmsKeyName != null && message.hasOwnProperty("kmsKeyName"))
                            if (!$util.isString(message.kmsKeyName))
                                return "kmsKeyName: string expected";
                        if (message.serviceAccountId != null && message.hasOwnProperty("serviceAccountId"))
                            if (!$util.isString(message.serviceAccountId))
                                return "serviceAccountId: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a CmekSettings message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.CmekSettings
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.CmekSettings} CmekSettings
                     */
                    CmekSettings.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.CmekSettings)
                            return object;
                        var message = new $root.google.logging.v2.CmekSettings();
                        if (object.name != null)
                            message.name = String(object.name);
                        if (object.kmsKeyName != null)
                            message.kmsKeyName = String(object.kmsKeyName);
                        if (object.serviceAccountId != null)
                            message.serviceAccountId = String(object.serviceAccountId);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a CmekSettings message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.CmekSettings
                     * @static
                     * @param {google.logging.v2.CmekSettings} message CmekSettings
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    CmekSettings.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.name = "";
                            object.kmsKeyName = "";
                            object.serviceAccountId = "";
                        }
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        if (message.kmsKeyName != null && message.hasOwnProperty("kmsKeyName"))
                            object.kmsKeyName = message.kmsKeyName;
                        if (message.serviceAccountId != null && message.hasOwnProperty("serviceAccountId"))
                            object.serviceAccountId = message.serviceAccountId;
                        return object;
                    };
    
                    /**
                     * Converts this CmekSettings to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.CmekSettings
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    CmekSettings.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return CmekSettings;
                })();
    
                v2.GetSettingsRequest = (function() {
    
                    /**
                     * Properties of a GetSettingsRequest.
                     * @memberof google.logging.v2
                     * @interface IGetSettingsRequest
                     * @property {string|null} [name] GetSettingsRequest name
                     */
    
                    /**
                     * Constructs a new GetSettingsRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a GetSettingsRequest.
                     * @implements IGetSettingsRequest
                     * @constructor
                     * @param {google.logging.v2.IGetSettingsRequest=} [properties] Properties to set
                     */
                    function GetSettingsRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * GetSettingsRequest name.
                     * @member {string} name
                     * @memberof google.logging.v2.GetSettingsRequest
                     * @instance
                     */
                    GetSettingsRequest.prototype.name = "";
    
                    /**
                     * Creates a new GetSettingsRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.GetSettingsRequest
                     * @static
                     * @param {google.logging.v2.IGetSettingsRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.GetSettingsRequest} GetSettingsRequest instance
                     */
                    GetSettingsRequest.create = function create(properties) {
                        return new GetSettingsRequest(properties);
                    };
    
                    /**
                     * Encodes the specified GetSettingsRequest message. Does not implicitly {@link google.logging.v2.GetSettingsRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.GetSettingsRequest
                     * @static
                     * @param {google.logging.v2.IGetSettingsRequest} message GetSettingsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    GetSettingsRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified GetSettingsRequest message, length delimited. Does not implicitly {@link google.logging.v2.GetSettingsRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.GetSettingsRequest
                     * @static
                     * @param {google.logging.v2.IGetSettingsRequest} message GetSettingsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    GetSettingsRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a GetSettingsRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.GetSettingsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.GetSettingsRequest} GetSettingsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    GetSettingsRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.GetSettingsRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.name = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a GetSettingsRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.GetSettingsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.GetSettingsRequest} GetSettingsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    GetSettingsRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a GetSettingsRequest message.
                     * @function verify
                     * @memberof google.logging.v2.GetSettingsRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    GetSettingsRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a GetSettingsRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.GetSettingsRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.GetSettingsRequest} GetSettingsRequest
                     */
                    GetSettingsRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.GetSettingsRequest)
                            return object;
                        var message = new $root.google.logging.v2.GetSettingsRequest();
                        if (object.name != null)
                            message.name = String(object.name);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a GetSettingsRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.GetSettingsRequest
                     * @static
                     * @param {google.logging.v2.GetSettingsRequest} message GetSettingsRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    GetSettingsRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults)
                            object.name = "";
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        return object;
                    };
    
                    /**
                     * Converts this GetSettingsRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.GetSettingsRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    GetSettingsRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return GetSettingsRequest;
                })();
    
                v2.UpdateSettingsRequest = (function() {
    
                    /**
                     * Properties of an UpdateSettingsRequest.
                     * @memberof google.logging.v2
                     * @interface IUpdateSettingsRequest
                     * @property {string|null} [name] UpdateSettingsRequest name
                     * @property {google.logging.v2.ISettings|null} [settings] UpdateSettingsRequest settings
                     * @property {google.protobuf.IFieldMask|null} [updateMask] UpdateSettingsRequest updateMask
                     */
    
                    /**
                     * Constructs a new UpdateSettingsRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents an UpdateSettingsRequest.
                     * @implements IUpdateSettingsRequest
                     * @constructor
                     * @param {google.logging.v2.IUpdateSettingsRequest=} [properties] Properties to set
                     */
                    function UpdateSettingsRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * UpdateSettingsRequest name.
                     * @member {string} name
                     * @memberof google.logging.v2.UpdateSettingsRequest
                     * @instance
                     */
                    UpdateSettingsRequest.prototype.name = "";
    
                    /**
                     * UpdateSettingsRequest settings.
                     * @member {google.logging.v2.ISettings|null|undefined} settings
                     * @memberof google.logging.v2.UpdateSettingsRequest
                     * @instance
                     */
                    UpdateSettingsRequest.prototype.settings = null;
    
                    /**
                     * UpdateSettingsRequest updateMask.
                     * @member {google.protobuf.IFieldMask|null|undefined} updateMask
                     * @memberof google.logging.v2.UpdateSettingsRequest
                     * @instance
                     */
                    UpdateSettingsRequest.prototype.updateMask = null;
    
                    /**
                     * Creates a new UpdateSettingsRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.UpdateSettingsRequest
                     * @static
                     * @param {google.logging.v2.IUpdateSettingsRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.UpdateSettingsRequest} UpdateSettingsRequest instance
                     */
                    UpdateSettingsRequest.create = function create(properties) {
                        return new UpdateSettingsRequest(properties);
                    };
    
                    /**
                     * Encodes the specified UpdateSettingsRequest message. Does not implicitly {@link google.logging.v2.UpdateSettingsRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.UpdateSettingsRequest
                     * @static
                     * @param {google.logging.v2.IUpdateSettingsRequest} message UpdateSettingsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    UpdateSettingsRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        if (message.settings != null && Object.hasOwnProperty.call(message, "settings"))
                            $root.google.logging.v2.Settings.encode(message.settings, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.updateMask != null && Object.hasOwnProperty.call(message, "updateMask"))
                            $root.google.protobuf.FieldMask.encode(message.updateMask, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified UpdateSettingsRequest message, length delimited. Does not implicitly {@link google.logging.v2.UpdateSettingsRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.UpdateSettingsRequest
                     * @static
                     * @param {google.logging.v2.IUpdateSettingsRequest} message UpdateSettingsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    UpdateSettingsRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes an UpdateSettingsRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.UpdateSettingsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.UpdateSettingsRequest} UpdateSettingsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    UpdateSettingsRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.UpdateSettingsRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.name = reader.string();
                                break;
                            case 2:
                                message.settings = $root.google.logging.v2.Settings.decode(reader, reader.uint32());
                                break;
                            case 3:
                                message.updateMask = $root.google.protobuf.FieldMask.decode(reader, reader.uint32());
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes an UpdateSettingsRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.UpdateSettingsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.UpdateSettingsRequest} UpdateSettingsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    UpdateSettingsRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies an UpdateSettingsRequest message.
                     * @function verify
                     * @memberof google.logging.v2.UpdateSettingsRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    UpdateSettingsRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        if (message.settings != null && message.hasOwnProperty("settings")) {
                            var error = $root.google.logging.v2.Settings.verify(message.settings);
                            if (error)
                                return "settings." + error;
                        }
                        if (message.updateMask != null && message.hasOwnProperty("updateMask")) {
                            var error = $root.google.protobuf.FieldMask.verify(message.updateMask);
                            if (error)
                                return "updateMask." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates an UpdateSettingsRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.UpdateSettingsRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.UpdateSettingsRequest} UpdateSettingsRequest
                     */
                    UpdateSettingsRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.UpdateSettingsRequest)
                            return object;
                        var message = new $root.google.logging.v2.UpdateSettingsRequest();
                        if (object.name != null)
                            message.name = String(object.name);
                        if (object.settings != null) {
                            if (typeof object.settings !== "object")
                                throw TypeError(".google.logging.v2.UpdateSettingsRequest.settings: object expected");
                            message.settings = $root.google.logging.v2.Settings.fromObject(object.settings);
                        }
                        if (object.updateMask != null) {
                            if (typeof object.updateMask !== "object")
                                throw TypeError(".google.logging.v2.UpdateSettingsRequest.updateMask: object expected");
                            message.updateMask = $root.google.protobuf.FieldMask.fromObject(object.updateMask);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from an UpdateSettingsRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.UpdateSettingsRequest
                     * @static
                     * @param {google.logging.v2.UpdateSettingsRequest} message UpdateSettingsRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    UpdateSettingsRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.name = "";
                            object.settings = null;
                            object.updateMask = null;
                        }
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        if (message.settings != null && message.hasOwnProperty("settings"))
                            object.settings = $root.google.logging.v2.Settings.toObject(message.settings, options);
                        if (message.updateMask != null && message.hasOwnProperty("updateMask"))
                            object.updateMask = $root.google.protobuf.FieldMask.toObject(message.updateMask, options);
                        return object;
                    };
    
                    /**
                     * Converts this UpdateSettingsRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.UpdateSettingsRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    UpdateSettingsRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return UpdateSettingsRequest;
                })();
    
                v2.Settings = (function() {
    
                    /**
                     * Properties of a Settings.
                     * @memberof google.logging.v2
                     * @interface ISettings
                     * @property {string|null} [name] Settings name
                     * @property {string|null} [kmsKeyName] Settings kmsKeyName
                     * @property {string|null} [kmsServiceAccountId] Settings kmsServiceAccountId
                     * @property {string|null} [storageLocation] Settings storageLocation
                     * @property {boolean|null} [disableDefaultSink] Settings disableDefaultSink
                     */
    
                    /**
                     * Constructs a new Settings.
                     * @memberof google.logging.v2
                     * @classdesc Represents a Settings.
                     * @implements ISettings
                     * @constructor
                     * @param {google.logging.v2.ISettings=} [properties] Properties to set
                     */
                    function Settings(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * Settings name.
                     * @member {string} name
                     * @memberof google.logging.v2.Settings
                     * @instance
                     */
                    Settings.prototype.name = "";
    
                    /**
                     * Settings kmsKeyName.
                     * @member {string} kmsKeyName
                     * @memberof google.logging.v2.Settings
                     * @instance
                     */
                    Settings.prototype.kmsKeyName = "";
    
                    /**
                     * Settings kmsServiceAccountId.
                     * @member {string} kmsServiceAccountId
                     * @memberof google.logging.v2.Settings
                     * @instance
                     */
                    Settings.prototype.kmsServiceAccountId = "";
    
                    /**
                     * Settings storageLocation.
                     * @member {string} storageLocation
                     * @memberof google.logging.v2.Settings
                     * @instance
                     */
                    Settings.prototype.storageLocation = "";
    
                    /**
                     * Settings disableDefaultSink.
                     * @member {boolean} disableDefaultSink
                     * @memberof google.logging.v2.Settings
                     * @instance
                     */
                    Settings.prototype.disableDefaultSink = false;
    
                    /**
                     * Creates a new Settings instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.Settings
                     * @static
                     * @param {google.logging.v2.ISettings=} [properties] Properties to set
                     * @returns {google.logging.v2.Settings} Settings instance
                     */
                    Settings.create = function create(properties) {
                        return new Settings(properties);
                    };
    
                    /**
                     * Encodes the specified Settings message. Does not implicitly {@link google.logging.v2.Settings.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.Settings
                     * @static
                     * @param {google.logging.v2.ISettings} message Settings message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Settings.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        if (message.kmsKeyName != null && Object.hasOwnProperty.call(message, "kmsKeyName"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.kmsKeyName);
                        if (message.kmsServiceAccountId != null && Object.hasOwnProperty.call(message, "kmsServiceAccountId"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.kmsServiceAccountId);
                        if (message.storageLocation != null && Object.hasOwnProperty.call(message, "storageLocation"))
                            writer.uint32(/* id 4, wireType 2 =*/34).string(message.storageLocation);
                        if (message.disableDefaultSink != null && Object.hasOwnProperty.call(message, "disableDefaultSink"))
                            writer.uint32(/* id 5, wireType 0 =*/40).bool(message.disableDefaultSink);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified Settings message, length delimited. Does not implicitly {@link google.logging.v2.Settings.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.Settings
                     * @static
                     * @param {google.logging.v2.ISettings} message Settings message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Settings.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a Settings message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.Settings
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.Settings} Settings
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Settings.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.Settings();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.name = reader.string();
                                break;
                            case 2:
                                message.kmsKeyName = reader.string();
                                break;
                            case 3:
                                message.kmsServiceAccountId = reader.string();
                                break;
                            case 4:
                                message.storageLocation = reader.string();
                                break;
                            case 5:
                                message.disableDefaultSink = reader.bool();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a Settings message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.Settings
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.Settings} Settings
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Settings.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a Settings message.
                     * @function verify
                     * @memberof google.logging.v2.Settings
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    Settings.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        if (message.kmsKeyName != null && message.hasOwnProperty("kmsKeyName"))
                            if (!$util.isString(message.kmsKeyName))
                                return "kmsKeyName: string expected";
                        if (message.kmsServiceAccountId != null && message.hasOwnProperty("kmsServiceAccountId"))
                            if (!$util.isString(message.kmsServiceAccountId))
                                return "kmsServiceAccountId: string expected";
                        if (message.storageLocation != null && message.hasOwnProperty("storageLocation"))
                            if (!$util.isString(message.storageLocation))
                                return "storageLocation: string expected";
                        if (message.disableDefaultSink != null && message.hasOwnProperty("disableDefaultSink"))
                            if (typeof message.disableDefaultSink !== "boolean")
                                return "disableDefaultSink: boolean expected";
                        return null;
                    };
    
                    /**
                     * Creates a Settings message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.Settings
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.Settings} Settings
                     */
                    Settings.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.Settings)
                            return object;
                        var message = new $root.google.logging.v2.Settings();
                        if (object.name != null)
                            message.name = String(object.name);
                        if (object.kmsKeyName != null)
                            message.kmsKeyName = String(object.kmsKeyName);
                        if (object.kmsServiceAccountId != null)
                            message.kmsServiceAccountId = String(object.kmsServiceAccountId);
                        if (object.storageLocation != null)
                            message.storageLocation = String(object.storageLocation);
                        if (object.disableDefaultSink != null)
                            message.disableDefaultSink = Boolean(object.disableDefaultSink);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a Settings message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.Settings
                     * @static
                     * @param {google.logging.v2.Settings} message Settings
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    Settings.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.name = "";
                            object.kmsKeyName = "";
                            object.kmsServiceAccountId = "";
                            object.storageLocation = "";
                            object.disableDefaultSink = false;
                        }
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        if (message.kmsKeyName != null && message.hasOwnProperty("kmsKeyName"))
                            object.kmsKeyName = message.kmsKeyName;
                        if (message.kmsServiceAccountId != null && message.hasOwnProperty("kmsServiceAccountId"))
                            object.kmsServiceAccountId = message.kmsServiceAccountId;
                        if (message.storageLocation != null && message.hasOwnProperty("storageLocation"))
                            object.storageLocation = message.storageLocation;
                        if (message.disableDefaultSink != null && message.hasOwnProperty("disableDefaultSink"))
                            object.disableDefaultSink = message.disableDefaultSink;
                        return object;
                    };
    
                    /**
                     * Converts this Settings to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.Settings
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    Settings.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return Settings;
                })();
    
                v2.CopyLogEntriesRequest = (function() {
    
                    /**
                     * Properties of a CopyLogEntriesRequest.
                     * @memberof google.logging.v2
                     * @interface ICopyLogEntriesRequest
                     * @property {string|null} [name] CopyLogEntriesRequest name
                     * @property {string|null} [filter] CopyLogEntriesRequest filter
                     * @property {string|null} [destination] CopyLogEntriesRequest destination
                     */
    
                    /**
                     * Constructs a new CopyLogEntriesRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a CopyLogEntriesRequest.
                     * @implements ICopyLogEntriesRequest
                     * @constructor
                     * @param {google.logging.v2.ICopyLogEntriesRequest=} [properties] Properties to set
                     */
                    function CopyLogEntriesRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * CopyLogEntriesRequest name.
                     * @member {string} name
                     * @memberof google.logging.v2.CopyLogEntriesRequest
                     * @instance
                     */
                    CopyLogEntriesRequest.prototype.name = "";
    
                    /**
                     * CopyLogEntriesRequest filter.
                     * @member {string} filter
                     * @memberof google.logging.v2.CopyLogEntriesRequest
                     * @instance
                     */
                    CopyLogEntriesRequest.prototype.filter = "";
    
                    /**
                     * CopyLogEntriesRequest destination.
                     * @member {string} destination
                     * @memberof google.logging.v2.CopyLogEntriesRequest
                     * @instance
                     */
                    CopyLogEntriesRequest.prototype.destination = "";
    
                    /**
                     * Creates a new CopyLogEntriesRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.CopyLogEntriesRequest
                     * @static
                     * @param {google.logging.v2.ICopyLogEntriesRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.CopyLogEntriesRequest} CopyLogEntriesRequest instance
                     */
                    CopyLogEntriesRequest.create = function create(properties) {
                        return new CopyLogEntriesRequest(properties);
                    };
    
                    /**
                     * Encodes the specified CopyLogEntriesRequest message. Does not implicitly {@link google.logging.v2.CopyLogEntriesRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.CopyLogEntriesRequest
                     * @static
                     * @param {google.logging.v2.ICopyLogEntriesRequest} message CopyLogEntriesRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    CopyLogEntriesRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        if (message.filter != null && Object.hasOwnProperty.call(message, "filter"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.filter);
                        if (message.destination != null && Object.hasOwnProperty.call(message, "destination"))
                            writer.uint32(/* id 4, wireType 2 =*/34).string(message.destination);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified CopyLogEntriesRequest message, length delimited. Does not implicitly {@link google.logging.v2.CopyLogEntriesRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.CopyLogEntriesRequest
                     * @static
                     * @param {google.logging.v2.ICopyLogEntriesRequest} message CopyLogEntriesRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    CopyLogEntriesRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a CopyLogEntriesRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.CopyLogEntriesRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.CopyLogEntriesRequest} CopyLogEntriesRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    CopyLogEntriesRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.CopyLogEntriesRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.name = reader.string();
                                break;
                            case 3:
                                message.filter = reader.string();
                                break;
                            case 4:
                                message.destination = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a CopyLogEntriesRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.CopyLogEntriesRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.CopyLogEntriesRequest} CopyLogEntriesRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    CopyLogEntriesRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a CopyLogEntriesRequest message.
                     * @function verify
                     * @memberof google.logging.v2.CopyLogEntriesRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    CopyLogEntriesRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        if (message.filter != null && message.hasOwnProperty("filter"))
                            if (!$util.isString(message.filter))
                                return "filter: string expected";
                        if (message.destination != null && message.hasOwnProperty("destination"))
                            if (!$util.isString(message.destination))
                                return "destination: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a CopyLogEntriesRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.CopyLogEntriesRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.CopyLogEntriesRequest} CopyLogEntriesRequest
                     */
                    CopyLogEntriesRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.CopyLogEntriesRequest)
                            return object;
                        var message = new $root.google.logging.v2.CopyLogEntriesRequest();
                        if (object.name != null)
                            message.name = String(object.name);
                        if (object.filter != null)
                            message.filter = String(object.filter);
                        if (object.destination != null)
                            message.destination = String(object.destination);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a CopyLogEntriesRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.CopyLogEntriesRequest
                     * @static
                     * @param {google.logging.v2.CopyLogEntriesRequest} message CopyLogEntriesRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    CopyLogEntriesRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.name = "";
                            object.filter = "";
                            object.destination = "";
                        }
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        if (message.filter != null && message.hasOwnProperty("filter"))
                            object.filter = message.filter;
                        if (message.destination != null && message.hasOwnProperty("destination"))
                            object.destination = message.destination;
                        return object;
                    };
    
                    /**
                     * Converts this CopyLogEntriesRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.CopyLogEntriesRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    CopyLogEntriesRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return CopyLogEntriesRequest;
                })();
    
                v2.CopyLogEntriesMetadata = (function() {
    
                    /**
                     * Properties of a CopyLogEntriesMetadata.
                     * @memberof google.logging.v2
                     * @interface ICopyLogEntriesMetadata
                     * @property {google.protobuf.ITimestamp|null} [startTime] CopyLogEntriesMetadata startTime
                     * @property {google.protobuf.ITimestamp|null} [endTime] CopyLogEntriesMetadata endTime
                     * @property {google.logging.v2.OperationState|null} [state] CopyLogEntriesMetadata state
                     * @property {boolean|null} [cancellationRequested] CopyLogEntriesMetadata cancellationRequested
                     * @property {google.logging.v2.ICopyLogEntriesRequest|null} [request] CopyLogEntriesMetadata request
                     * @property {number|null} [progress] CopyLogEntriesMetadata progress
                     * @property {string|null} [writerIdentity] CopyLogEntriesMetadata writerIdentity
                     */
    
                    /**
                     * Constructs a new CopyLogEntriesMetadata.
                     * @memberof google.logging.v2
                     * @classdesc Represents a CopyLogEntriesMetadata.
                     * @implements ICopyLogEntriesMetadata
                     * @constructor
                     * @param {google.logging.v2.ICopyLogEntriesMetadata=} [properties] Properties to set
                     */
                    function CopyLogEntriesMetadata(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * CopyLogEntriesMetadata startTime.
                     * @member {google.protobuf.ITimestamp|null|undefined} startTime
                     * @memberof google.logging.v2.CopyLogEntriesMetadata
                     * @instance
                     */
                    CopyLogEntriesMetadata.prototype.startTime = null;
    
                    /**
                     * CopyLogEntriesMetadata endTime.
                     * @member {google.protobuf.ITimestamp|null|undefined} endTime
                     * @memberof google.logging.v2.CopyLogEntriesMetadata
                     * @instance
                     */
                    CopyLogEntriesMetadata.prototype.endTime = null;
    
                    /**
                     * CopyLogEntriesMetadata state.
                     * @member {google.logging.v2.OperationState} state
                     * @memberof google.logging.v2.CopyLogEntriesMetadata
                     * @instance
                     */
                    CopyLogEntriesMetadata.prototype.state = 0;
    
                    /**
                     * CopyLogEntriesMetadata cancellationRequested.
                     * @member {boolean} cancellationRequested
                     * @memberof google.logging.v2.CopyLogEntriesMetadata
                     * @instance
                     */
                    CopyLogEntriesMetadata.prototype.cancellationRequested = false;
    
                    /**
                     * CopyLogEntriesMetadata request.
                     * @member {google.logging.v2.ICopyLogEntriesRequest|null|undefined} request
                     * @memberof google.logging.v2.CopyLogEntriesMetadata
                     * @instance
                     */
                    CopyLogEntriesMetadata.prototype.request = null;
    
                    /**
                     * CopyLogEntriesMetadata progress.
                     * @member {number} progress
                     * @memberof google.logging.v2.CopyLogEntriesMetadata
                     * @instance
                     */
                    CopyLogEntriesMetadata.prototype.progress = 0;
    
                    /**
                     * CopyLogEntriesMetadata writerIdentity.
                     * @member {string} writerIdentity
                     * @memberof google.logging.v2.CopyLogEntriesMetadata
                     * @instance
                     */
                    CopyLogEntriesMetadata.prototype.writerIdentity = "";
    
                    /**
                     * Creates a new CopyLogEntriesMetadata instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.CopyLogEntriesMetadata
                     * @static
                     * @param {google.logging.v2.ICopyLogEntriesMetadata=} [properties] Properties to set
                     * @returns {google.logging.v2.CopyLogEntriesMetadata} CopyLogEntriesMetadata instance
                     */
                    CopyLogEntriesMetadata.create = function create(properties) {
                        return new CopyLogEntriesMetadata(properties);
                    };
    
                    /**
                     * Encodes the specified CopyLogEntriesMetadata message. Does not implicitly {@link google.logging.v2.CopyLogEntriesMetadata.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.CopyLogEntriesMetadata
                     * @static
                     * @param {google.logging.v2.ICopyLogEntriesMetadata} message CopyLogEntriesMetadata message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    CopyLogEntriesMetadata.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.startTime != null && Object.hasOwnProperty.call(message, "startTime"))
                            $root.google.protobuf.Timestamp.encode(message.startTime, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.endTime != null && Object.hasOwnProperty.call(message, "endTime"))
                            $root.google.protobuf.Timestamp.encode(message.endTime, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.state != null && Object.hasOwnProperty.call(message, "state"))
                            writer.uint32(/* id 3, wireType 0 =*/24).int32(message.state);
                        if (message.cancellationRequested != null && Object.hasOwnProperty.call(message, "cancellationRequested"))
                            writer.uint32(/* id 4, wireType 0 =*/32).bool(message.cancellationRequested);
                        if (message.request != null && Object.hasOwnProperty.call(message, "request"))
                            $root.google.logging.v2.CopyLogEntriesRequest.encode(message.request, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                        if (message.progress != null && Object.hasOwnProperty.call(message, "progress"))
                            writer.uint32(/* id 6, wireType 0 =*/48).int32(message.progress);
                        if (message.writerIdentity != null && Object.hasOwnProperty.call(message, "writerIdentity"))
                            writer.uint32(/* id 7, wireType 2 =*/58).string(message.writerIdentity);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified CopyLogEntriesMetadata message, length delimited. Does not implicitly {@link google.logging.v2.CopyLogEntriesMetadata.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.CopyLogEntriesMetadata
                     * @static
                     * @param {google.logging.v2.ICopyLogEntriesMetadata} message CopyLogEntriesMetadata message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    CopyLogEntriesMetadata.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a CopyLogEntriesMetadata message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.CopyLogEntriesMetadata
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.CopyLogEntriesMetadata} CopyLogEntriesMetadata
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    CopyLogEntriesMetadata.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.CopyLogEntriesMetadata();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.startTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                break;
                            case 2:
                                message.endTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                break;
                            case 3:
                                message.state = reader.int32();
                                break;
                            case 4:
                                message.cancellationRequested = reader.bool();
                                break;
                            case 5:
                                message.request = $root.google.logging.v2.CopyLogEntriesRequest.decode(reader, reader.uint32());
                                break;
                            case 6:
                                message.progress = reader.int32();
                                break;
                            case 7:
                                message.writerIdentity = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a CopyLogEntriesMetadata message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.CopyLogEntriesMetadata
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.CopyLogEntriesMetadata} CopyLogEntriesMetadata
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    CopyLogEntriesMetadata.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a CopyLogEntriesMetadata message.
                     * @function verify
                     * @memberof google.logging.v2.CopyLogEntriesMetadata
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    CopyLogEntriesMetadata.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.startTime != null && message.hasOwnProperty("startTime")) {
                            var error = $root.google.protobuf.Timestamp.verify(message.startTime);
                            if (error)
                                return "startTime." + error;
                        }
                        if (message.endTime != null && message.hasOwnProperty("endTime")) {
                            var error = $root.google.protobuf.Timestamp.verify(message.endTime);
                            if (error)
                                return "endTime." + error;
                        }
                        if (message.state != null && message.hasOwnProperty("state"))
                            switch (message.state) {
                            default:
                                return "state: enum value expected";
                            case 0:
                            case 1:
                            case 2:
                            case 3:
                            case 4:
                            case 5:
                            case 6:
                                break;
                            }
                        if (message.cancellationRequested != null && message.hasOwnProperty("cancellationRequested"))
                            if (typeof message.cancellationRequested !== "boolean")
                                return "cancellationRequested: boolean expected";
                        if (message.request != null && message.hasOwnProperty("request")) {
                            var error = $root.google.logging.v2.CopyLogEntriesRequest.verify(message.request);
                            if (error)
                                return "request." + error;
                        }
                        if (message.progress != null && message.hasOwnProperty("progress"))
                            if (!$util.isInteger(message.progress))
                                return "progress: integer expected";
                        if (message.writerIdentity != null && message.hasOwnProperty("writerIdentity"))
                            if (!$util.isString(message.writerIdentity))
                                return "writerIdentity: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a CopyLogEntriesMetadata message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.CopyLogEntriesMetadata
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.CopyLogEntriesMetadata} CopyLogEntriesMetadata
                     */
                    CopyLogEntriesMetadata.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.CopyLogEntriesMetadata)
                            return object;
                        var message = new $root.google.logging.v2.CopyLogEntriesMetadata();
                        if (object.startTime != null) {
                            if (typeof object.startTime !== "object")
                                throw TypeError(".google.logging.v2.CopyLogEntriesMetadata.startTime: object expected");
                            message.startTime = $root.google.protobuf.Timestamp.fromObject(object.startTime);
                        }
                        if (object.endTime != null) {
                            if (typeof object.endTime !== "object")
                                throw TypeError(".google.logging.v2.CopyLogEntriesMetadata.endTime: object expected");
                            message.endTime = $root.google.protobuf.Timestamp.fromObject(object.endTime);
                        }
                        switch (object.state) {
                        case "OPERATION_STATE_UNSPECIFIED":
                        case 0:
                            message.state = 0;
                            break;
                        case "OPERATION_STATE_SCHEDULED":
                        case 1:
                            message.state = 1;
                            break;
                        case "OPERATION_STATE_WAITING_FOR_PERMISSIONS":
                        case 2:
                            message.state = 2;
                            break;
                        case "OPERATION_STATE_RUNNING":
                        case 3:
                            message.state = 3;
                            break;
                        case "OPERATION_STATE_SUCCEEDED":
                        case 4:
                            message.state = 4;
                            break;
                        case "OPERATION_STATE_FAILED":
                        case 5:
                            message.state = 5;
                            break;
                        case "OPERATION_STATE_CANCELLED":
                        case 6:
                            message.state = 6;
                            break;
                        }
                        if (object.cancellationRequested != null)
                            message.cancellationRequested = Boolean(object.cancellationRequested);
                        if (object.request != null) {
                            if (typeof object.request !== "object")
                                throw TypeError(".google.logging.v2.CopyLogEntriesMetadata.request: object expected");
                            message.request = $root.google.logging.v2.CopyLogEntriesRequest.fromObject(object.request);
                        }
                        if (object.progress != null)
                            message.progress = object.progress | 0;
                        if (object.writerIdentity != null)
                            message.writerIdentity = String(object.writerIdentity);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a CopyLogEntriesMetadata message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.CopyLogEntriesMetadata
                     * @static
                     * @param {google.logging.v2.CopyLogEntriesMetadata} message CopyLogEntriesMetadata
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    CopyLogEntriesMetadata.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.startTime = null;
                            object.endTime = null;
                            object.state = options.enums === String ? "OPERATION_STATE_UNSPECIFIED" : 0;
                            object.cancellationRequested = false;
                            object.request = null;
                            object.progress = 0;
                            object.writerIdentity = "";
                        }
                        if (message.startTime != null && message.hasOwnProperty("startTime"))
                            object.startTime = $root.google.protobuf.Timestamp.toObject(message.startTime, options);
                        if (message.endTime != null && message.hasOwnProperty("endTime"))
                            object.endTime = $root.google.protobuf.Timestamp.toObject(message.endTime, options);
                        if (message.state != null && message.hasOwnProperty("state"))
                            object.state = options.enums === String ? $root.google.logging.v2.OperationState[message.state] : message.state;
                        if (message.cancellationRequested != null && message.hasOwnProperty("cancellationRequested"))
                            object.cancellationRequested = message.cancellationRequested;
                        if (message.request != null && message.hasOwnProperty("request"))
                            object.request = $root.google.logging.v2.CopyLogEntriesRequest.toObject(message.request, options);
                        if (message.progress != null && message.hasOwnProperty("progress"))
                            object.progress = message.progress;
                        if (message.writerIdentity != null && message.hasOwnProperty("writerIdentity"))
                            object.writerIdentity = message.writerIdentity;
                        return object;
                    };
    
                    /**
                     * Converts this CopyLogEntriesMetadata to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.CopyLogEntriesMetadata
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    CopyLogEntriesMetadata.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return CopyLogEntriesMetadata;
                })();
    
                v2.CopyLogEntriesResponse = (function() {
    
                    /**
                     * Properties of a CopyLogEntriesResponse.
                     * @memberof google.logging.v2
                     * @interface ICopyLogEntriesResponse
                     * @property {number|Long|null} [logEntriesCopiedCount] CopyLogEntriesResponse logEntriesCopiedCount
                     */
    
                    /**
                     * Constructs a new CopyLogEntriesResponse.
                     * @memberof google.logging.v2
                     * @classdesc Represents a CopyLogEntriesResponse.
                     * @implements ICopyLogEntriesResponse
                     * @constructor
                     * @param {google.logging.v2.ICopyLogEntriesResponse=} [properties] Properties to set
                     */
                    function CopyLogEntriesResponse(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * CopyLogEntriesResponse logEntriesCopiedCount.
                     * @member {number|Long} logEntriesCopiedCount
                     * @memberof google.logging.v2.CopyLogEntriesResponse
                     * @instance
                     */
                    CopyLogEntriesResponse.prototype.logEntriesCopiedCount = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                    /**
                     * Creates a new CopyLogEntriesResponse instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.CopyLogEntriesResponse
                     * @static
                     * @param {google.logging.v2.ICopyLogEntriesResponse=} [properties] Properties to set
                     * @returns {google.logging.v2.CopyLogEntriesResponse} CopyLogEntriesResponse instance
                     */
                    CopyLogEntriesResponse.create = function create(properties) {
                        return new CopyLogEntriesResponse(properties);
                    };
    
                    /**
                     * Encodes the specified CopyLogEntriesResponse message. Does not implicitly {@link google.logging.v2.CopyLogEntriesResponse.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.CopyLogEntriesResponse
                     * @static
                     * @param {google.logging.v2.ICopyLogEntriesResponse} message CopyLogEntriesResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    CopyLogEntriesResponse.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.logEntriesCopiedCount != null && Object.hasOwnProperty.call(message, "logEntriesCopiedCount"))
                            writer.uint32(/* id 1, wireType 0 =*/8).int64(message.logEntriesCopiedCount);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified CopyLogEntriesResponse message, length delimited. Does not implicitly {@link google.logging.v2.CopyLogEntriesResponse.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.CopyLogEntriesResponse
                     * @static
                     * @param {google.logging.v2.ICopyLogEntriesResponse} message CopyLogEntriesResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    CopyLogEntriesResponse.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a CopyLogEntriesResponse message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.CopyLogEntriesResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.CopyLogEntriesResponse} CopyLogEntriesResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    CopyLogEntriesResponse.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.CopyLogEntriesResponse();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.logEntriesCopiedCount = reader.int64();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a CopyLogEntriesResponse message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.CopyLogEntriesResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.CopyLogEntriesResponse} CopyLogEntriesResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    CopyLogEntriesResponse.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a CopyLogEntriesResponse message.
                     * @function verify
                     * @memberof google.logging.v2.CopyLogEntriesResponse
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    CopyLogEntriesResponse.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.logEntriesCopiedCount != null && message.hasOwnProperty("logEntriesCopiedCount"))
                            if (!$util.isInteger(message.logEntriesCopiedCount) && !(message.logEntriesCopiedCount && $util.isInteger(message.logEntriesCopiedCount.low) && $util.isInteger(message.logEntriesCopiedCount.high)))
                                return "logEntriesCopiedCount: integer|Long expected";
                        return null;
                    };
    
                    /**
                     * Creates a CopyLogEntriesResponse message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.CopyLogEntriesResponse
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.CopyLogEntriesResponse} CopyLogEntriesResponse
                     */
                    CopyLogEntriesResponse.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.CopyLogEntriesResponse)
                            return object;
                        var message = new $root.google.logging.v2.CopyLogEntriesResponse();
                        if (object.logEntriesCopiedCount != null)
                            if ($util.Long)
                                (message.logEntriesCopiedCount = $util.Long.fromValue(object.logEntriesCopiedCount)).unsigned = false;
                            else if (typeof object.logEntriesCopiedCount === "string")
                                message.logEntriesCopiedCount = parseInt(object.logEntriesCopiedCount, 10);
                            else if (typeof object.logEntriesCopiedCount === "number")
                                message.logEntriesCopiedCount = object.logEntriesCopiedCount;
                            else if (typeof object.logEntriesCopiedCount === "object")
                                message.logEntriesCopiedCount = new $util.LongBits(object.logEntriesCopiedCount.low >>> 0, object.logEntriesCopiedCount.high >>> 0).toNumber();
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a CopyLogEntriesResponse message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.CopyLogEntriesResponse
                     * @static
                     * @param {google.logging.v2.CopyLogEntriesResponse} message CopyLogEntriesResponse
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    CopyLogEntriesResponse.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults)
                            if ($util.Long) {
                                var long = new $util.Long(0, 0, false);
                                object.logEntriesCopiedCount = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                            } else
                                object.logEntriesCopiedCount = options.longs === String ? "0" : 0;
                        if (message.logEntriesCopiedCount != null && message.hasOwnProperty("logEntriesCopiedCount"))
                            if (typeof message.logEntriesCopiedCount === "number")
                                object.logEntriesCopiedCount = options.longs === String ? String(message.logEntriesCopiedCount) : message.logEntriesCopiedCount;
                            else
                                object.logEntriesCopiedCount = options.longs === String ? $util.Long.prototype.toString.call(message.logEntriesCopiedCount) : options.longs === Number ? new $util.LongBits(message.logEntriesCopiedCount.low >>> 0, message.logEntriesCopiedCount.high >>> 0).toNumber() : message.logEntriesCopiedCount;
                        return object;
                    };
    
                    /**
                     * Converts this CopyLogEntriesResponse to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.CopyLogEntriesResponse
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    CopyLogEntriesResponse.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return CopyLogEntriesResponse;
                })();
    
                /**
                 * LifecycleState enum.
                 * @name google.logging.v2.LifecycleState
                 * @enum {number}
                 * @property {number} LIFECYCLE_STATE_UNSPECIFIED=0 LIFECYCLE_STATE_UNSPECIFIED value
                 * @property {number} ACTIVE=1 ACTIVE value
                 * @property {number} DELETE_REQUESTED=2 DELETE_REQUESTED value
                 */
                v2.LifecycleState = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "LIFECYCLE_STATE_UNSPECIFIED"] = 0;
                    values[valuesById[1] = "ACTIVE"] = 1;
                    values[valuesById[2] = "DELETE_REQUESTED"] = 2;
                    return values;
                })();
    
                /**
                 * OperationState enum.
                 * @name google.logging.v2.OperationState
                 * @enum {number}
                 * @property {number} OPERATION_STATE_UNSPECIFIED=0 OPERATION_STATE_UNSPECIFIED value
                 * @property {number} OPERATION_STATE_SCHEDULED=1 OPERATION_STATE_SCHEDULED value
                 * @property {number} OPERATION_STATE_WAITING_FOR_PERMISSIONS=2 OPERATION_STATE_WAITING_FOR_PERMISSIONS value
                 * @property {number} OPERATION_STATE_RUNNING=3 OPERATION_STATE_RUNNING value
                 * @property {number} OPERATION_STATE_SUCCEEDED=4 OPERATION_STATE_SUCCEEDED value
                 * @property {number} OPERATION_STATE_FAILED=5 OPERATION_STATE_FAILED value
                 * @property {number} OPERATION_STATE_CANCELLED=6 OPERATION_STATE_CANCELLED value
                 */
                v2.OperationState = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "OPERATION_STATE_UNSPECIFIED"] = 0;
                    values[valuesById[1] = "OPERATION_STATE_SCHEDULED"] = 1;
                    values[valuesById[2] = "OPERATION_STATE_WAITING_FOR_PERMISSIONS"] = 2;
                    values[valuesById[3] = "OPERATION_STATE_RUNNING"] = 3;
                    values[valuesById[4] = "OPERATION_STATE_SUCCEEDED"] = 4;
                    values[valuesById[5] = "OPERATION_STATE_FAILED"] = 5;
                    values[valuesById[6] = "OPERATION_STATE_CANCELLED"] = 6;
                    return values;
                })();
    
                v2.MetricsServiceV2 = (function() {
    
                    /**
                     * Constructs a new MetricsServiceV2 service.
                     * @memberof google.logging.v2
                     * @classdesc Represents a MetricsServiceV2
                     * @extends $protobuf.rpc.Service
                     * @constructor
                     * @param {$protobuf.RPCImpl} rpcImpl RPC implementation
                     * @param {boolean} [requestDelimited=false] Whether requests are length-delimited
                     * @param {boolean} [responseDelimited=false] Whether responses are length-delimited
                     */
                    function MetricsServiceV2(rpcImpl, requestDelimited, responseDelimited) {
                        $protobuf.rpc.Service.call(this, rpcImpl, requestDelimited, responseDelimited);
                    }
    
                    (MetricsServiceV2.prototype = Object.create($protobuf.rpc.Service.prototype)).constructor = MetricsServiceV2;
    
                    /**
                     * Creates new MetricsServiceV2 service using the specified rpc implementation.
                     * @function create
                     * @memberof google.logging.v2.MetricsServiceV2
                     * @static
                     * @param {$protobuf.RPCImpl} rpcImpl RPC implementation
                     * @param {boolean} [requestDelimited=false] Whether requests are length-delimited
                     * @param {boolean} [responseDelimited=false] Whether responses are length-delimited
                     * @returns {MetricsServiceV2} RPC service. Useful where requests and/or responses are streamed.
                     */
                    MetricsServiceV2.create = function create(rpcImpl, requestDelimited, responseDelimited) {
                        return new this(rpcImpl, requestDelimited, responseDelimited);
                    };
    
                    /**
                     * Callback as used by {@link google.logging.v2.MetricsServiceV2|listLogMetrics}.
                     * @memberof google.logging.v2.MetricsServiceV2
                     * @typedef ListLogMetricsCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.ListLogMetricsResponse} [response] ListLogMetricsResponse
                     */
    
                    /**
                     * Calls ListLogMetrics.
                     * @function listLogMetrics
                     * @memberof google.logging.v2.MetricsServiceV2
                     * @instance
                     * @param {google.logging.v2.IListLogMetricsRequest} request ListLogMetricsRequest message or plain object
                     * @param {google.logging.v2.MetricsServiceV2.ListLogMetricsCallback} callback Node-style callback called with the error, if any, and ListLogMetricsResponse
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(MetricsServiceV2.prototype.listLogMetrics = function listLogMetrics(request, callback) {
                        return this.rpcCall(listLogMetrics, $root.google.logging.v2.ListLogMetricsRequest, $root.google.logging.v2.ListLogMetricsResponse, request, callback);
                    }, "name", { value: "ListLogMetrics" });
    
                    /**
                     * Calls ListLogMetrics.
                     * @function listLogMetrics
                     * @memberof google.logging.v2.MetricsServiceV2
                     * @instance
                     * @param {google.logging.v2.IListLogMetricsRequest} request ListLogMetricsRequest message or plain object
                     * @returns {Promise<google.logging.v2.ListLogMetricsResponse>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.MetricsServiceV2|getLogMetric}.
                     * @memberof google.logging.v2.MetricsServiceV2
                     * @typedef GetLogMetricCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.LogMetric} [response] LogMetric
                     */
    
                    /**
                     * Calls GetLogMetric.
                     * @function getLogMetric
                     * @memberof google.logging.v2.MetricsServiceV2
                     * @instance
                     * @param {google.logging.v2.IGetLogMetricRequest} request GetLogMetricRequest message or plain object
                     * @param {google.logging.v2.MetricsServiceV2.GetLogMetricCallback} callback Node-style callback called with the error, if any, and LogMetric
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(MetricsServiceV2.prototype.getLogMetric = function getLogMetric(request, callback) {
                        return this.rpcCall(getLogMetric, $root.google.logging.v2.GetLogMetricRequest, $root.google.logging.v2.LogMetric, request, callback);
                    }, "name", { value: "GetLogMetric" });
    
                    /**
                     * Calls GetLogMetric.
                     * @function getLogMetric
                     * @memberof google.logging.v2.MetricsServiceV2
                     * @instance
                     * @param {google.logging.v2.IGetLogMetricRequest} request GetLogMetricRequest message or plain object
                     * @returns {Promise<google.logging.v2.LogMetric>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.MetricsServiceV2|createLogMetric}.
                     * @memberof google.logging.v2.MetricsServiceV2
                     * @typedef CreateLogMetricCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.LogMetric} [response] LogMetric
                     */
    
                    /**
                     * Calls CreateLogMetric.
                     * @function createLogMetric
                     * @memberof google.logging.v2.MetricsServiceV2
                     * @instance
                     * @param {google.logging.v2.ICreateLogMetricRequest} request CreateLogMetricRequest message or plain object
                     * @param {google.logging.v2.MetricsServiceV2.CreateLogMetricCallback} callback Node-style callback called with the error, if any, and LogMetric
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(MetricsServiceV2.prototype.createLogMetric = function createLogMetric(request, callback) {
                        return this.rpcCall(createLogMetric, $root.google.logging.v2.CreateLogMetricRequest, $root.google.logging.v2.LogMetric, request, callback);
                    }, "name", { value: "CreateLogMetric" });
    
                    /**
                     * Calls CreateLogMetric.
                     * @function createLogMetric
                     * @memberof google.logging.v2.MetricsServiceV2
                     * @instance
                     * @param {google.logging.v2.ICreateLogMetricRequest} request CreateLogMetricRequest message or plain object
                     * @returns {Promise<google.logging.v2.LogMetric>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.MetricsServiceV2|updateLogMetric}.
                     * @memberof google.logging.v2.MetricsServiceV2
                     * @typedef UpdateLogMetricCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.logging.v2.LogMetric} [response] LogMetric
                     */
    
                    /**
                     * Calls UpdateLogMetric.
                     * @function updateLogMetric
                     * @memberof google.logging.v2.MetricsServiceV2
                     * @instance
                     * @param {google.logging.v2.IUpdateLogMetricRequest} request UpdateLogMetricRequest message or plain object
                     * @param {google.logging.v2.MetricsServiceV2.UpdateLogMetricCallback} callback Node-style callback called with the error, if any, and LogMetric
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(MetricsServiceV2.prototype.updateLogMetric = function updateLogMetric(request, callback) {
                        return this.rpcCall(updateLogMetric, $root.google.logging.v2.UpdateLogMetricRequest, $root.google.logging.v2.LogMetric, request, callback);
                    }, "name", { value: "UpdateLogMetric" });
    
                    /**
                     * Calls UpdateLogMetric.
                     * @function updateLogMetric
                     * @memberof google.logging.v2.MetricsServiceV2
                     * @instance
                     * @param {google.logging.v2.IUpdateLogMetricRequest} request UpdateLogMetricRequest message or plain object
                     * @returns {Promise<google.logging.v2.LogMetric>} Promise
                     * @variation 2
                     */
    
                    /**
                     * Callback as used by {@link google.logging.v2.MetricsServiceV2|deleteLogMetric}.
                     * @memberof google.logging.v2.MetricsServiceV2
                     * @typedef DeleteLogMetricCallback
                     * @type {function}
                     * @param {Error|null} error Error, if any
                     * @param {google.protobuf.Empty} [response] Empty
                     */
    
                    /**
                     * Calls DeleteLogMetric.
                     * @function deleteLogMetric
                     * @memberof google.logging.v2.MetricsServiceV2
                     * @instance
                     * @param {google.logging.v2.IDeleteLogMetricRequest} request DeleteLogMetricRequest message or plain object
                     * @param {google.logging.v2.MetricsServiceV2.DeleteLogMetricCallback} callback Node-style callback called with the error, if any, and Empty
                     * @returns {undefined}
                     * @variation 1
                     */
                    Object.defineProperty(MetricsServiceV2.prototype.deleteLogMetric = function deleteLogMetric(request, callback) {
                        return this.rpcCall(deleteLogMetric, $root.google.logging.v2.DeleteLogMetricRequest, $root.google.protobuf.Empty, request, callback);
                    }, "name", { value: "DeleteLogMetric" });
    
                    /**
                     * Calls DeleteLogMetric.
                     * @function deleteLogMetric
                     * @memberof google.logging.v2.MetricsServiceV2
                     * @instance
                     * @param {google.logging.v2.IDeleteLogMetricRequest} request DeleteLogMetricRequest message or plain object
                     * @returns {Promise<google.protobuf.Empty>} Promise
                     * @variation 2
                     */
    
                    return MetricsServiceV2;
                })();
    
                v2.LogMetric = (function() {
    
                    /**
                     * Properties of a LogMetric.
                     * @memberof google.logging.v2
                     * @interface ILogMetric
                     * @property {string|null} [name] LogMetric name
                     * @property {string|null} [description] LogMetric description
                     * @property {string|null} [filter] LogMetric filter
                     * @property {boolean|null} [disabled] LogMetric disabled
                     * @property {google.api.IMetricDescriptor|null} [metricDescriptor] LogMetric metricDescriptor
                     * @property {string|null} [valueExtractor] LogMetric valueExtractor
                     * @property {Object.<string,string>|null} [labelExtractors] LogMetric labelExtractors
                     * @property {google.api.Distribution.IBucketOptions|null} [bucketOptions] LogMetric bucketOptions
                     * @property {google.protobuf.ITimestamp|null} [createTime] LogMetric createTime
                     * @property {google.protobuf.ITimestamp|null} [updateTime] LogMetric updateTime
                     * @property {google.logging.v2.LogMetric.ApiVersion|null} [version] LogMetric version
                     */
    
                    /**
                     * Constructs a new LogMetric.
                     * @memberof google.logging.v2
                     * @classdesc Represents a LogMetric.
                     * @implements ILogMetric
                     * @constructor
                     * @param {google.logging.v2.ILogMetric=} [properties] Properties to set
                     */
                    function LogMetric(properties) {
                        this.labelExtractors = {};
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * LogMetric name.
                     * @member {string} name
                     * @memberof google.logging.v2.LogMetric
                     * @instance
                     */
                    LogMetric.prototype.name = "";
    
                    /**
                     * LogMetric description.
                     * @member {string} description
                     * @memberof google.logging.v2.LogMetric
                     * @instance
                     */
                    LogMetric.prototype.description = "";
    
                    /**
                     * LogMetric filter.
                     * @member {string} filter
                     * @memberof google.logging.v2.LogMetric
                     * @instance
                     */
                    LogMetric.prototype.filter = "";
    
                    /**
                     * LogMetric disabled.
                     * @member {boolean} disabled
                     * @memberof google.logging.v2.LogMetric
                     * @instance
                     */
                    LogMetric.prototype.disabled = false;
    
                    /**
                     * LogMetric metricDescriptor.
                     * @member {google.api.IMetricDescriptor|null|undefined} metricDescriptor
                     * @memberof google.logging.v2.LogMetric
                     * @instance
                     */
                    LogMetric.prototype.metricDescriptor = null;
    
                    /**
                     * LogMetric valueExtractor.
                     * @member {string} valueExtractor
                     * @memberof google.logging.v2.LogMetric
                     * @instance
                     */
                    LogMetric.prototype.valueExtractor = "";
    
                    /**
                     * LogMetric labelExtractors.
                     * @member {Object.<string,string>} labelExtractors
                     * @memberof google.logging.v2.LogMetric
                     * @instance
                     */
                    LogMetric.prototype.labelExtractors = $util.emptyObject;
    
                    /**
                     * LogMetric bucketOptions.
                     * @member {google.api.Distribution.IBucketOptions|null|undefined} bucketOptions
                     * @memberof google.logging.v2.LogMetric
                     * @instance
                     */
                    LogMetric.prototype.bucketOptions = null;
    
                    /**
                     * LogMetric createTime.
                     * @member {google.protobuf.ITimestamp|null|undefined} createTime
                     * @memberof google.logging.v2.LogMetric
                     * @instance
                     */
                    LogMetric.prototype.createTime = null;
    
                    /**
                     * LogMetric updateTime.
                     * @member {google.protobuf.ITimestamp|null|undefined} updateTime
                     * @memberof google.logging.v2.LogMetric
                     * @instance
                     */
                    LogMetric.prototype.updateTime = null;
    
                    /**
                     * LogMetric version.
                     * @member {google.logging.v2.LogMetric.ApiVersion} version
                     * @memberof google.logging.v2.LogMetric
                     * @instance
                     */
                    LogMetric.prototype.version = 0;
    
                    /**
                     * Creates a new LogMetric instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.LogMetric
                     * @static
                     * @param {google.logging.v2.ILogMetric=} [properties] Properties to set
                     * @returns {google.logging.v2.LogMetric} LogMetric instance
                     */
                    LogMetric.create = function create(properties) {
                        return new LogMetric(properties);
                    };
    
                    /**
                     * Encodes the specified LogMetric message. Does not implicitly {@link google.logging.v2.LogMetric.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.LogMetric
                     * @static
                     * @param {google.logging.v2.ILogMetric} message LogMetric message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    LogMetric.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                        if (message.description != null && Object.hasOwnProperty.call(message, "description"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.description);
                        if (message.filter != null && Object.hasOwnProperty.call(message, "filter"))
                            writer.uint32(/* id 3, wireType 2 =*/26).string(message.filter);
                        if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                            writer.uint32(/* id 4, wireType 0 =*/32).int32(message.version);
                        if (message.metricDescriptor != null && Object.hasOwnProperty.call(message, "metricDescriptor"))
                            $root.google.api.MetricDescriptor.encode(message.metricDescriptor, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                        if (message.valueExtractor != null && Object.hasOwnProperty.call(message, "valueExtractor"))
                            writer.uint32(/* id 6, wireType 2 =*/50).string(message.valueExtractor);
                        if (message.labelExtractors != null && Object.hasOwnProperty.call(message, "labelExtractors"))
                            for (var keys = Object.keys(message.labelExtractors), i = 0; i < keys.length; ++i)
                                writer.uint32(/* id 7, wireType 2 =*/58).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.labelExtractors[keys[i]]).ldelim();
                        if (message.bucketOptions != null && Object.hasOwnProperty.call(message, "bucketOptions"))
                            $root.google.api.Distribution.BucketOptions.encode(message.bucketOptions, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
                        if (message.createTime != null && Object.hasOwnProperty.call(message, "createTime"))
                            $root.google.protobuf.Timestamp.encode(message.createTime, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();
                        if (message.updateTime != null && Object.hasOwnProperty.call(message, "updateTime"))
                            $root.google.protobuf.Timestamp.encode(message.updateTime, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim();
                        if (message.disabled != null && Object.hasOwnProperty.call(message, "disabled"))
                            writer.uint32(/* id 12, wireType 0 =*/96).bool(message.disabled);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified LogMetric message, length delimited. Does not implicitly {@link google.logging.v2.LogMetric.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.LogMetric
                     * @static
                     * @param {google.logging.v2.ILogMetric} message LogMetric message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    LogMetric.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a LogMetric message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.LogMetric
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.LogMetric} LogMetric
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    LogMetric.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.LogMetric(), key, value;
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.name = reader.string();
                                break;
                            case 2:
                                message.description = reader.string();
                                break;
                            case 3:
                                message.filter = reader.string();
                                break;
                            case 12:
                                message.disabled = reader.bool();
                                break;
                            case 5:
                                message.metricDescriptor = $root.google.api.MetricDescriptor.decode(reader, reader.uint32());
                                break;
                            case 6:
                                message.valueExtractor = reader.string();
                                break;
                            case 7:
                                if (message.labelExtractors === $util.emptyObject)
                                    message.labelExtractors = {};
                                var end2 = reader.uint32() + reader.pos;
                                key = "";
                                value = "";
                                while (reader.pos < end2) {
                                    var tag2 = reader.uint32();
                                    switch (tag2 >>> 3) {
                                    case 1:
                                        key = reader.string();
                                        break;
                                    case 2:
                                        value = reader.string();
                                        break;
                                    default:
                                        reader.skipType(tag2 & 7);
                                        break;
                                    }
                                }
                                message.labelExtractors[key] = value;
                                break;
                            case 8:
                                message.bucketOptions = $root.google.api.Distribution.BucketOptions.decode(reader, reader.uint32());
                                break;
                            case 9:
                                message.createTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                break;
                            case 10:
                                message.updateTime = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                break;
                            case 4:
                                message.version = reader.int32();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a LogMetric message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.LogMetric
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.LogMetric} LogMetric
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    LogMetric.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a LogMetric message.
                     * @function verify
                     * @memberof google.logging.v2.LogMetric
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    LogMetric.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.name != null && message.hasOwnProperty("name"))
                            if (!$util.isString(message.name))
                                return "name: string expected";
                        if (message.description != null && message.hasOwnProperty("description"))
                            if (!$util.isString(message.description))
                                return "description: string expected";
                        if (message.filter != null && message.hasOwnProperty("filter"))
                            if (!$util.isString(message.filter))
                                return "filter: string expected";
                        if (message.disabled != null && message.hasOwnProperty("disabled"))
                            if (typeof message.disabled !== "boolean")
                                return "disabled: boolean expected";
                        if (message.metricDescriptor != null && message.hasOwnProperty("metricDescriptor")) {
                            var error = $root.google.api.MetricDescriptor.verify(message.metricDescriptor);
                            if (error)
                                return "metricDescriptor." + error;
                        }
                        if (message.valueExtractor != null && message.hasOwnProperty("valueExtractor"))
                            if (!$util.isString(message.valueExtractor))
                                return "valueExtractor: string expected";
                        if (message.labelExtractors != null && message.hasOwnProperty("labelExtractors")) {
                            if (!$util.isObject(message.labelExtractors))
                                return "labelExtractors: object expected";
                            var key = Object.keys(message.labelExtractors);
                            for (var i = 0; i < key.length; ++i)
                                if (!$util.isString(message.labelExtractors[key[i]]))
                                    return "labelExtractors: string{k:string} expected";
                        }
                        if (message.bucketOptions != null && message.hasOwnProperty("bucketOptions")) {
                            var error = $root.google.api.Distribution.BucketOptions.verify(message.bucketOptions);
                            if (error)
                                return "bucketOptions." + error;
                        }
                        if (message.createTime != null && message.hasOwnProperty("createTime")) {
                            var error = $root.google.protobuf.Timestamp.verify(message.createTime);
                            if (error)
                                return "createTime." + error;
                        }
                        if (message.updateTime != null && message.hasOwnProperty("updateTime")) {
                            var error = $root.google.protobuf.Timestamp.verify(message.updateTime);
                            if (error)
                                return "updateTime." + error;
                        }
                        if (message.version != null && message.hasOwnProperty("version"))
                            switch (message.version) {
                            default:
                                return "version: enum value expected";
                            case 0:
                            case 1:
                                break;
                            }
                        return null;
                    };
    
                    /**
                     * Creates a LogMetric message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.LogMetric
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.LogMetric} LogMetric
                     */
                    LogMetric.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.LogMetric)
                            return object;
                        var message = new $root.google.logging.v2.LogMetric();
                        if (object.name != null)
                            message.name = String(object.name);
                        if (object.description != null)
                            message.description = String(object.description);
                        if (object.filter != null)
                            message.filter = String(object.filter);
                        if (object.disabled != null)
                            message.disabled = Boolean(object.disabled);
                        if (object.metricDescriptor != null) {
                            if (typeof object.metricDescriptor !== "object")
                                throw TypeError(".google.logging.v2.LogMetric.metricDescriptor: object expected");
                            message.metricDescriptor = $root.google.api.MetricDescriptor.fromObject(object.metricDescriptor);
                        }
                        if (object.valueExtractor != null)
                            message.valueExtractor = String(object.valueExtractor);
                        if (object.labelExtractors) {
                            if (typeof object.labelExtractors !== "object")
                                throw TypeError(".google.logging.v2.LogMetric.labelExtractors: object expected");
                            message.labelExtractors = {};
                            for (var keys = Object.keys(object.labelExtractors), i = 0; i < keys.length; ++i)
                                message.labelExtractors[keys[i]] = String(object.labelExtractors[keys[i]]);
                        }
                        if (object.bucketOptions != null) {
                            if (typeof object.bucketOptions !== "object")
                                throw TypeError(".google.logging.v2.LogMetric.bucketOptions: object expected");
                            message.bucketOptions = $root.google.api.Distribution.BucketOptions.fromObject(object.bucketOptions);
                        }
                        if (object.createTime != null) {
                            if (typeof object.createTime !== "object")
                                throw TypeError(".google.logging.v2.LogMetric.createTime: object expected");
                            message.createTime = $root.google.protobuf.Timestamp.fromObject(object.createTime);
                        }
                        if (object.updateTime != null) {
                            if (typeof object.updateTime !== "object")
                                throw TypeError(".google.logging.v2.LogMetric.updateTime: object expected");
                            message.updateTime = $root.google.protobuf.Timestamp.fromObject(object.updateTime);
                        }
                        switch (object.version) {
                        case "V2":
                        case 0:
                            message.version = 0;
                            break;
                        case "V1":
                        case 1:
                            message.version = 1;
                            break;
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a LogMetric message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.LogMetric
                     * @static
                     * @param {google.logging.v2.LogMetric} message LogMetric
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    LogMetric.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.objects || options.defaults)
                            object.labelExtractors = {};
                        if (options.defaults) {
                            object.name = "";
                            object.description = "";
                            object.filter = "";
                            object.version = options.enums === String ? "V2" : 0;
                            object.metricDescriptor = null;
                            object.valueExtractor = "";
                            object.bucketOptions = null;
                            object.createTime = null;
                            object.updateTime = null;
                            object.disabled = false;
                        }
                        if (message.name != null && message.hasOwnProperty("name"))
                            object.name = message.name;
                        if (message.description != null && message.hasOwnProperty("description"))
                            object.description = message.description;
                        if (message.filter != null && message.hasOwnProperty("filter"))
                            object.filter = message.filter;
                        if (message.version != null && message.hasOwnProperty("version"))
                            object.version = options.enums === String ? $root.google.logging.v2.LogMetric.ApiVersion[message.version] : message.version;
                        if (message.metricDescriptor != null && message.hasOwnProperty("metricDescriptor"))
                            object.metricDescriptor = $root.google.api.MetricDescriptor.toObject(message.metricDescriptor, options);
                        if (message.valueExtractor != null && message.hasOwnProperty("valueExtractor"))
                            object.valueExtractor = message.valueExtractor;
                        var keys2;
                        if (message.labelExtractors && (keys2 = Object.keys(message.labelExtractors)).length) {
                            object.labelExtractors = {};
                            for (var j = 0; j < keys2.length; ++j)
                                object.labelExtractors[keys2[j]] = message.labelExtractors[keys2[j]];
                        }
                        if (message.bucketOptions != null && message.hasOwnProperty("bucketOptions"))
                            object.bucketOptions = $root.google.api.Distribution.BucketOptions.toObject(message.bucketOptions, options);
                        if (message.createTime != null && message.hasOwnProperty("createTime"))
                            object.createTime = $root.google.protobuf.Timestamp.toObject(message.createTime, options);
                        if (message.updateTime != null && message.hasOwnProperty("updateTime"))
                            object.updateTime = $root.google.protobuf.Timestamp.toObject(message.updateTime, options);
                        if (message.disabled != null && message.hasOwnProperty("disabled"))
                            object.disabled = message.disabled;
                        return object;
                    };
    
                    /**
                     * Converts this LogMetric to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.LogMetric
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    LogMetric.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    /**
                     * ApiVersion enum.
                     * @name google.logging.v2.LogMetric.ApiVersion
                     * @enum {number}
                     * @property {number} V2=0 V2 value
                     * @property {number} V1=1 V1 value
                     */
                    LogMetric.ApiVersion = (function() {
                        var valuesById = {}, values = Object.create(valuesById);
                        values[valuesById[0] = "V2"] = 0;
                        values[valuesById[1] = "V1"] = 1;
                        return values;
                    })();
    
                    return LogMetric;
                })();
    
                v2.ListLogMetricsRequest = (function() {
    
                    /**
                     * Properties of a ListLogMetricsRequest.
                     * @memberof google.logging.v2
                     * @interface IListLogMetricsRequest
                     * @property {string|null} [parent] ListLogMetricsRequest parent
                     * @property {string|null} [pageToken] ListLogMetricsRequest pageToken
                     * @property {number|null} [pageSize] ListLogMetricsRequest pageSize
                     */
    
                    /**
                     * Constructs a new ListLogMetricsRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a ListLogMetricsRequest.
                     * @implements IListLogMetricsRequest
                     * @constructor
                     * @param {google.logging.v2.IListLogMetricsRequest=} [properties] Properties to set
                     */
                    function ListLogMetricsRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ListLogMetricsRequest parent.
                     * @member {string} parent
                     * @memberof google.logging.v2.ListLogMetricsRequest
                     * @instance
                     */
                    ListLogMetricsRequest.prototype.parent = "";
    
                    /**
                     * ListLogMetricsRequest pageToken.
                     * @member {string} pageToken
                     * @memberof google.logging.v2.ListLogMetricsRequest
                     * @instance
                     */
                    ListLogMetricsRequest.prototype.pageToken = "";
    
                    /**
                     * ListLogMetricsRequest pageSize.
                     * @member {number} pageSize
                     * @memberof google.logging.v2.ListLogMetricsRequest
                     * @instance
                     */
                    ListLogMetricsRequest.prototype.pageSize = 0;
    
                    /**
                     * Creates a new ListLogMetricsRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.ListLogMetricsRequest
                     * @static
                     * @param {google.logging.v2.IListLogMetricsRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.ListLogMetricsRequest} ListLogMetricsRequest instance
                     */
                    ListLogMetricsRequest.create = function create(properties) {
                        return new ListLogMetricsRequest(properties);
                    };
    
                    /**
                     * Encodes the specified ListLogMetricsRequest message. Does not implicitly {@link google.logging.v2.ListLogMetricsRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.ListLogMetricsRequest
                     * @static
                     * @param {google.logging.v2.IListLogMetricsRequest} message ListLogMetricsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListLogMetricsRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                        if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.pageToken);
                        if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                            writer.uint32(/* id 3, wireType 0 =*/24).int32(message.pageSize);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ListLogMetricsRequest message, length delimited. Does not implicitly {@link google.logging.v2.ListLogMetricsRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.ListLogMetricsRequest
                     * @static
                     * @param {google.logging.v2.IListLogMetricsRequest} message ListLogMetricsRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListLogMetricsRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ListLogMetricsRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.ListLogMetricsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.ListLogMetricsRequest} ListLogMetricsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListLogMetricsRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.ListLogMetricsRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.parent = reader.string();
                                break;
                            case 2:
                                message.pageToken = reader.string();
                                break;
                            case 3:
                                message.pageSize = reader.int32();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ListLogMetricsRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.ListLogMetricsRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.ListLogMetricsRequest} ListLogMetricsRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListLogMetricsRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ListLogMetricsRequest message.
                     * @function verify
                     * @memberof google.logging.v2.ListLogMetricsRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ListLogMetricsRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.parent != null && message.hasOwnProperty("parent"))
                            if (!$util.isString(message.parent))
                                return "parent: string expected";
                        if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                            if (!$util.isString(message.pageToken))
                                return "pageToken: string expected";
                        if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                            if (!$util.isInteger(message.pageSize))
                                return "pageSize: integer expected";
                        return null;
                    };
    
                    /**
                     * Creates a ListLogMetricsRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.ListLogMetricsRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.ListLogMetricsRequest} ListLogMetricsRequest
                     */
                    ListLogMetricsRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.ListLogMetricsRequest)
                            return object;
                        var message = new $root.google.logging.v2.ListLogMetricsRequest();
                        if (object.parent != null)
                            message.parent = String(object.parent);
                        if (object.pageToken != null)
                            message.pageToken = String(object.pageToken);
                        if (object.pageSize != null)
                            message.pageSize = object.pageSize | 0;
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ListLogMetricsRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.ListLogMetricsRequest
                     * @static
                     * @param {google.logging.v2.ListLogMetricsRequest} message ListLogMetricsRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ListLogMetricsRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.parent = "";
                            object.pageToken = "";
                            object.pageSize = 0;
                        }
                        if (message.parent != null && message.hasOwnProperty("parent"))
                            object.parent = message.parent;
                        if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                            object.pageToken = message.pageToken;
                        if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                            object.pageSize = message.pageSize;
                        return object;
                    };
    
                    /**
                     * Converts this ListLogMetricsRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.ListLogMetricsRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ListLogMetricsRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return ListLogMetricsRequest;
                })();
    
                v2.ListLogMetricsResponse = (function() {
    
                    /**
                     * Properties of a ListLogMetricsResponse.
                     * @memberof google.logging.v2
                     * @interface IListLogMetricsResponse
                     * @property {Array.<google.logging.v2.ILogMetric>|null} [metrics] ListLogMetricsResponse metrics
                     * @property {string|null} [nextPageToken] ListLogMetricsResponse nextPageToken
                     */
    
                    /**
                     * Constructs a new ListLogMetricsResponse.
                     * @memberof google.logging.v2
                     * @classdesc Represents a ListLogMetricsResponse.
                     * @implements IListLogMetricsResponse
                     * @constructor
                     * @param {google.logging.v2.IListLogMetricsResponse=} [properties] Properties to set
                     */
                    function ListLogMetricsResponse(properties) {
                        this.metrics = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * ListLogMetricsResponse metrics.
                     * @member {Array.<google.logging.v2.ILogMetric>} metrics
                     * @memberof google.logging.v2.ListLogMetricsResponse
                     * @instance
                     */
                    ListLogMetricsResponse.prototype.metrics = $util.emptyArray;
    
                    /**
                     * ListLogMetricsResponse nextPageToken.
                     * @member {string} nextPageToken
                     * @memberof google.logging.v2.ListLogMetricsResponse
                     * @instance
                     */
                    ListLogMetricsResponse.prototype.nextPageToken = "";
    
                    /**
                     * Creates a new ListLogMetricsResponse instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.ListLogMetricsResponse
                     * @static
                     * @param {google.logging.v2.IListLogMetricsResponse=} [properties] Properties to set
                     * @returns {google.logging.v2.ListLogMetricsResponse} ListLogMetricsResponse instance
                     */
                    ListLogMetricsResponse.create = function create(properties) {
                        return new ListLogMetricsResponse(properties);
                    };
    
                    /**
                     * Encodes the specified ListLogMetricsResponse message. Does not implicitly {@link google.logging.v2.ListLogMetricsResponse.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.ListLogMetricsResponse
                     * @static
                     * @param {google.logging.v2.IListLogMetricsResponse} message ListLogMetricsResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListLogMetricsResponse.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.metrics != null && message.metrics.length)
                            for (var i = 0; i < message.metrics.length; ++i)
                                $root.google.logging.v2.LogMetric.encode(message.metrics[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified ListLogMetricsResponse message, length delimited. Does not implicitly {@link google.logging.v2.ListLogMetricsResponse.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.ListLogMetricsResponse
                     * @static
                     * @param {google.logging.v2.IListLogMetricsResponse} message ListLogMetricsResponse message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    ListLogMetricsResponse.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a ListLogMetricsResponse message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.ListLogMetricsResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.ListLogMetricsResponse} ListLogMetricsResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListLogMetricsResponse.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.ListLogMetricsResponse();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                if (!(message.metrics && message.metrics.length))
                                    message.metrics = [];
                                message.metrics.push($root.google.logging.v2.LogMetric.decode(reader, reader.uint32()));
                                break;
                            case 2:
                                message.nextPageToken = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a ListLogMetricsResponse message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.ListLogMetricsResponse
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.ListLogMetricsResponse} ListLogMetricsResponse
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    ListLogMetricsResponse.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a ListLogMetricsResponse message.
                     * @function verify
                     * @memberof google.logging.v2.ListLogMetricsResponse
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    ListLogMetricsResponse.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.metrics != null && message.hasOwnProperty("metrics")) {
                            if (!Array.isArray(message.metrics))
                                return "metrics: array expected";
                            for (var i = 0; i < message.metrics.length; ++i) {
                                var error = $root.google.logging.v2.LogMetric.verify(message.metrics[i]);
                                if (error)
                                    return "metrics." + error;
                            }
                        }
                        if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                            if (!$util.isString(message.nextPageToken))
                                return "nextPageToken: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a ListLogMetricsResponse message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.ListLogMetricsResponse
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.ListLogMetricsResponse} ListLogMetricsResponse
                     */
                    ListLogMetricsResponse.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.ListLogMetricsResponse)
                            return object;
                        var message = new $root.google.logging.v2.ListLogMetricsResponse();
                        if (object.metrics) {
                            if (!Array.isArray(object.metrics))
                                throw TypeError(".google.logging.v2.ListLogMetricsResponse.metrics: array expected");
                            message.metrics = [];
                            for (var i = 0; i < object.metrics.length; ++i) {
                                if (typeof object.metrics[i] !== "object")
                                    throw TypeError(".google.logging.v2.ListLogMetricsResponse.metrics: object expected");
                                message.metrics[i] = $root.google.logging.v2.LogMetric.fromObject(object.metrics[i]);
                            }
                        }
                        if (object.nextPageToken != null)
                            message.nextPageToken = String(object.nextPageToken);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a ListLogMetricsResponse message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.ListLogMetricsResponse
                     * @static
                     * @param {google.logging.v2.ListLogMetricsResponse} message ListLogMetricsResponse
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    ListLogMetricsResponse.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.metrics = [];
                        if (options.defaults)
                            object.nextPageToken = "";
                        if (message.metrics && message.metrics.length) {
                            object.metrics = [];
                            for (var j = 0; j < message.metrics.length; ++j)
                                object.metrics[j] = $root.google.logging.v2.LogMetric.toObject(message.metrics[j], options);
                        }
                        if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                            object.nextPageToken = message.nextPageToken;
                        return object;
                    };
    
                    /**
                     * Converts this ListLogMetricsResponse to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.ListLogMetricsResponse
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    ListLogMetricsResponse.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return ListLogMetricsResponse;
                })();
    
                v2.GetLogMetricRequest = (function() {
    
                    /**
                     * Properties of a GetLogMetricRequest.
                     * @memberof google.logging.v2
                     * @interface IGetLogMetricRequest
                     * @property {string|null} [metricName] GetLogMetricRequest metricName
                     */
    
                    /**
                     * Constructs a new GetLogMetricRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a GetLogMetricRequest.
                     * @implements IGetLogMetricRequest
                     * @constructor
                     * @param {google.logging.v2.IGetLogMetricRequest=} [properties] Properties to set
                     */
                    function GetLogMetricRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * GetLogMetricRequest metricName.
                     * @member {string} metricName
                     * @memberof google.logging.v2.GetLogMetricRequest
                     * @instance
                     */
                    GetLogMetricRequest.prototype.metricName = "";
    
                    /**
                     * Creates a new GetLogMetricRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.GetLogMetricRequest
                     * @static
                     * @param {google.logging.v2.IGetLogMetricRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.GetLogMetricRequest} GetLogMetricRequest instance
                     */
                    GetLogMetricRequest.create = function create(properties) {
                        return new GetLogMetricRequest(properties);
                    };
    
                    /**
                     * Encodes the specified GetLogMetricRequest message. Does not implicitly {@link google.logging.v2.GetLogMetricRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.GetLogMetricRequest
                     * @static
                     * @param {google.logging.v2.IGetLogMetricRequest} message GetLogMetricRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    GetLogMetricRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.metricName != null && Object.hasOwnProperty.call(message, "metricName"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.metricName);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified GetLogMetricRequest message, length delimited. Does not implicitly {@link google.logging.v2.GetLogMetricRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.GetLogMetricRequest
                     * @static
                     * @param {google.logging.v2.IGetLogMetricRequest} message GetLogMetricRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    GetLogMetricRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a GetLogMetricRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.GetLogMetricRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.GetLogMetricRequest} GetLogMetricRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    GetLogMetricRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.GetLogMetricRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.metricName = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a GetLogMetricRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.GetLogMetricRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.GetLogMetricRequest} GetLogMetricRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    GetLogMetricRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a GetLogMetricRequest message.
                     * @function verify
                     * @memberof google.logging.v2.GetLogMetricRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    GetLogMetricRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.metricName != null && message.hasOwnProperty("metricName"))
                            if (!$util.isString(message.metricName))
                                return "metricName: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a GetLogMetricRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.GetLogMetricRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.GetLogMetricRequest} GetLogMetricRequest
                     */
                    GetLogMetricRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.GetLogMetricRequest)
                            return object;
                        var message = new $root.google.logging.v2.GetLogMetricRequest();
                        if (object.metricName != null)
                            message.metricName = String(object.metricName);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a GetLogMetricRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.GetLogMetricRequest
                     * @static
                     * @param {google.logging.v2.GetLogMetricRequest} message GetLogMetricRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    GetLogMetricRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults)
                            object.metricName = "";
                        if (message.metricName != null && message.hasOwnProperty("metricName"))
                            object.metricName = message.metricName;
                        return object;
                    };
    
                    /**
                     * Converts this GetLogMetricRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.GetLogMetricRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    GetLogMetricRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return GetLogMetricRequest;
                })();
    
                v2.CreateLogMetricRequest = (function() {
    
                    /**
                     * Properties of a CreateLogMetricRequest.
                     * @memberof google.logging.v2
                     * @interface ICreateLogMetricRequest
                     * @property {string|null} [parent] CreateLogMetricRequest parent
                     * @property {google.logging.v2.ILogMetric|null} [metric] CreateLogMetricRequest metric
                     */
    
                    /**
                     * Constructs a new CreateLogMetricRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a CreateLogMetricRequest.
                     * @implements ICreateLogMetricRequest
                     * @constructor
                     * @param {google.logging.v2.ICreateLogMetricRequest=} [properties] Properties to set
                     */
                    function CreateLogMetricRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * CreateLogMetricRequest parent.
                     * @member {string} parent
                     * @memberof google.logging.v2.CreateLogMetricRequest
                     * @instance
                     */
                    CreateLogMetricRequest.prototype.parent = "";
    
                    /**
                     * CreateLogMetricRequest metric.
                     * @member {google.logging.v2.ILogMetric|null|undefined} metric
                     * @memberof google.logging.v2.CreateLogMetricRequest
                     * @instance
                     */
                    CreateLogMetricRequest.prototype.metric = null;
    
                    /**
                     * Creates a new CreateLogMetricRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.CreateLogMetricRequest
                     * @static
                     * @param {google.logging.v2.ICreateLogMetricRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.CreateLogMetricRequest} CreateLogMetricRequest instance
                     */
                    CreateLogMetricRequest.create = function create(properties) {
                        return new CreateLogMetricRequest(properties);
                    };
    
                    /**
                     * Encodes the specified CreateLogMetricRequest message. Does not implicitly {@link google.logging.v2.CreateLogMetricRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.CreateLogMetricRequest
                     * @static
                     * @param {google.logging.v2.ICreateLogMetricRequest} message CreateLogMetricRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    CreateLogMetricRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
                        if (message.metric != null && Object.hasOwnProperty.call(message, "metric"))
                            $root.google.logging.v2.LogMetric.encode(message.metric, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified CreateLogMetricRequest message, length delimited. Does not implicitly {@link google.logging.v2.CreateLogMetricRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.CreateLogMetricRequest
                     * @static
                     * @param {google.logging.v2.ICreateLogMetricRequest} message CreateLogMetricRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    CreateLogMetricRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a CreateLogMetricRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.CreateLogMetricRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.CreateLogMetricRequest} CreateLogMetricRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    CreateLogMetricRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.CreateLogMetricRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.parent = reader.string();
                                break;
                            case 2:
                                message.metric = $root.google.logging.v2.LogMetric.decode(reader, reader.uint32());
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a CreateLogMetricRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.CreateLogMetricRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.CreateLogMetricRequest} CreateLogMetricRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    CreateLogMetricRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a CreateLogMetricRequest message.
                     * @function verify
                     * @memberof google.logging.v2.CreateLogMetricRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    CreateLogMetricRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.parent != null && message.hasOwnProperty("parent"))
                            if (!$util.isString(message.parent))
                                return "parent: string expected";
                        if (message.metric != null && message.hasOwnProperty("metric")) {
                            var error = $root.google.logging.v2.LogMetric.verify(message.metric);
                            if (error)
                                return "metric." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a CreateLogMetricRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.CreateLogMetricRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.CreateLogMetricRequest} CreateLogMetricRequest
                     */
                    CreateLogMetricRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.CreateLogMetricRequest)
                            return object;
                        var message = new $root.google.logging.v2.CreateLogMetricRequest();
                        if (object.parent != null)
                            message.parent = String(object.parent);
                        if (object.metric != null) {
                            if (typeof object.metric !== "object")
                                throw TypeError(".google.logging.v2.CreateLogMetricRequest.metric: object expected");
                            message.metric = $root.google.logging.v2.LogMetric.fromObject(object.metric);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a CreateLogMetricRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.CreateLogMetricRequest
                     * @static
                     * @param {google.logging.v2.CreateLogMetricRequest} message CreateLogMetricRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    CreateLogMetricRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.parent = "";
                            object.metric = null;
                        }
                        if (message.parent != null && message.hasOwnProperty("parent"))
                            object.parent = message.parent;
                        if (message.metric != null && message.hasOwnProperty("metric"))
                            object.metric = $root.google.logging.v2.LogMetric.toObject(message.metric, options);
                        return object;
                    };
    
                    /**
                     * Converts this CreateLogMetricRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.CreateLogMetricRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    CreateLogMetricRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return CreateLogMetricRequest;
                })();
    
                v2.UpdateLogMetricRequest = (function() {
    
                    /**
                     * Properties of an UpdateLogMetricRequest.
                     * @memberof google.logging.v2
                     * @interface IUpdateLogMetricRequest
                     * @property {string|null} [metricName] UpdateLogMetricRequest metricName
                     * @property {google.logging.v2.ILogMetric|null} [metric] UpdateLogMetricRequest metric
                     */
    
                    /**
                     * Constructs a new UpdateLogMetricRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents an UpdateLogMetricRequest.
                     * @implements IUpdateLogMetricRequest
                     * @constructor
                     * @param {google.logging.v2.IUpdateLogMetricRequest=} [properties] Properties to set
                     */
                    function UpdateLogMetricRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * UpdateLogMetricRequest metricName.
                     * @member {string} metricName
                     * @memberof google.logging.v2.UpdateLogMetricRequest
                     * @instance
                     */
                    UpdateLogMetricRequest.prototype.metricName = "";
    
                    /**
                     * UpdateLogMetricRequest metric.
                     * @member {google.logging.v2.ILogMetric|null|undefined} metric
                     * @memberof google.logging.v2.UpdateLogMetricRequest
                     * @instance
                     */
                    UpdateLogMetricRequest.prototype.metric = null;
    
                    /**
                     * Creates a new UpdateLogMetricRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.UpdateLogMetricRequest
                     * @static
                     * @param {google.logging.v2.IUpdateLogMetricRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.UpdateLogMetricRequest} UpdateLogMetricRequest instance
                     */
                    UpdateLogMetricRequest.create = function create(properties) {
                        return new UpdateLogMetricRequest(properties);
                    };
    
                    /**
                     * Encodes the specified UpdateLogMetricRequest message. Does not implicitly {@link google.logging.v2.UpdateLogMetricRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.UpdateLogMetricRequest
                     * @static
                     * @param {google.logging.v2.IUpdateLogMetricRequest} message UpdateLogMetricRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    UpdateLogMetricRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.metricName != null && Object.hasOwnProperty.call(message, "metricName"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.metricName);
                        if (message.metric != null && Object.hasOwnProperty.call(message, "metric"))
                            $root.google.logging.v2.LogMetric.encode(message.metric, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified UpdateLogMetricRequest message, length delimited. Does not implicitly {@link google.logging.v2.UpdateLogMetricRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.UpdateLogMetricRequest
                     * @static
                     * @param {google.logging.v2.IUpdateLogMetricRequest} message UpdateLogMetricRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    UpdateLogMetricRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes an UpdateLogMetricRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.UpdateLogMetricRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.UpdateLogMetricRequest} UpdateLogMetricRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    UpdateLogMetricRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.UpdateLogMetricRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.metricName = reader.string();
                                break;
                            case 2:
                                message.metric = $root.google.logging.v2.LogMetric.decode(reader, reader.uint32());
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes an UpdateLogMetricRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.UpdateLogMetricRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.UpdateLogMetricRequest} UpdateLogMetricRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    UpdateLogMetricRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies an UpdateLogMetricRequest message.
                     * @function verify
                     * @memberof google.logging.v2.UpdateLogMetricRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    UpdateLogMetricRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.metricName != null && message.hasOwnProperty("metricName"))
                            if (!$util.isString(message.metricName))
                                return "metricName: string expected";
                        if (message.metric != null && message.hasOwnProperty("metric")) {
                            var error = $root.google.logging.v2.LogMetric.verify(message.metric);
                            if (error)
                                return "metric." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates an UpdateLogMetricRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.UpdateLogMetricRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.UpdateLogMetricRequest} UpdateLogMetricRequest
                     */
                    UpdateLogMetricRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.UpdateLogMetricRequest)
                            return object;
                        var message = new $root.google.logging.v2.UpdateLogMetricRequest();
                        if (object.metricName != null)
                            message.metricName = String(object.metricName);
                        if (object.metric != null) {
                            if (typeof object.metric !== "object")
                                throw TypeError(".google.logging.v2.UpdateLogMetricRequest.metric: object expected");
                            message.metric = $root.google.logging.v2.LogMetric.fromObject(object.metric);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from an UpdateLogMetricRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.UpdateLogMetricRequest
                     * @static
                     * @param {google.logging.v2.UpdateLogMetricRequest} message UpdateLogMetricRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    UpdateLogMetricRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.metricName = "";
                            object.metric = null;
                        }
                        if (message.metricName != null && message.hasOwnProperty("metricName"))
                            object.metricName = message.metricName;
                        if (message.metric != null && message.hasOwnProperty("metric"))
                            object.metric = $root.google.logging.v2.LogMetric.toObject(message.metric, options);
                        return object;
                    };
    
                    /**
                     * Converts this UpdateLogMetricRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.UpdateLogMetricRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    UpdateLogMetricRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return UpdateLogMetricRequest;
                })();
    
                v2.DeleteLogMetricRequest = (function() {
    
                    /**
                     * Properties of a DeleteLogMetricRequest.
                     * @memberof google.logging.v2
                     * @interface IDeleteLogMetricRequest
                     * @property {string|null} [metricName] DeleteLogMetricRequest metricName
                     */
    
                    /**
                     * Constructs a new DeleteLogMetricRequest.
                     * @memberof google.logging.v2
                     * @classdesc Represents a DeleteLogMetricRequest.
                     * @implements IDeleteLogMetricRequest
                     * @constructor
                     * @param {google.logging.v2.IDeleteLogMetricRequest=} [properties] Properties to set
                     */
                    function DeleteLogMetricRequest(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * DeleteLogMetricRequest metricName.
                     * @member {string} metricName
                     * @memberof google.logging.v2.DeleteLogMetricRequest
                     * @instance
                     */
                    DeleteLogMetricRequest.prototype.metricName = "";
    
                    /**
                     * Creates a new DeleteLogMetricRequest instance using the specified properties.
                     * @function create
                     * @memberof google.logging.v2.DeleteLogMetricRequest
                     * @static
                     * @param {google.logging.v2.IDeleteLogMetricRequest=} [properties] Properties to set
                     * @returns {google.logging.v2.DeleteLogMetricRequest} DeleteLogMetricRequest instance
                     */
                    DeleteLogMetricRequest.create = function create(properties) {
                        return new DeleteLogMetricRequest(properties);
                    };
    
                    /**
                     * Encodes the specified DeleteLogMetricRequest message. Does not implicitly {@link google.logging.v2.DeleteLogMetricRequest.verify|verify} messages.
                     * @function encode
                     * @memberof google.logging.v2.DeleteLogMetricRequest
                     * @static
                     * @param {google.logging.v2.IDeleteLogMetricRequest} message DeleteLogMetricRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    DeleteLogMetricRequest.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.metricName != null && Object.hasOwnProperty.call(message, "metricName"))
                            writer.uint32(/* id 1, wireType 2 =*/10).string(message.metricName);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified DeleteLogMetricRequest message, length delimited. Does not implicitly {@link google.logging.v2.DeleteLogMetricRequest.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.logging.v2.DeleteLogMetricRequest
                     * @static
                     * @param {google.logging.v2.IDeleteLogMetricRequest} message DeleteLogMetricRequest message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    DeleteLogMetricRequest.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a DeleteLogMetricRequest message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.logging.v2.DeleteLogMetricRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.logging.v2.DeleteLogMetricRequest} DeleteLogMetricRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    DeleteLogMetricRequest.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.logging.v2.DeleteLogMetricRequest();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.metricName = reader.string();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a DeleteLogMetricRequest message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.logging.v2.DeleteLogMetricRequest
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.logging.v2.DeleteLogMetricRequest} DeleteLogMetricRequest
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    DeleteLogMetricRequest.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a DeleteLogMetricRequest message.
                     * @function verify
                     * @memberof google.logging.v2.DeleteLogMetricRequest
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    DeleteLogMetricRequest.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.metricName != null && message.hasOwnProperty("metricName"))
                            if (!$util.isString(message.metricName))
                                return "metricName: string expected";
                        return null;
                    };
    
                    /**
                     * Creates a DeleteLogMetricRequest message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.logging.v2.DeleteLogMetricRequest
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.logging.v2.DeleteLogMetricRequest} DeleteLogMetricRequest
                     */
                    DeleteLogMetricRequest.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.logging.v2.DeleteLogMetricRequest)
                            return object;
                        var message = new $root.google.logging.v2.DeleteLogMetricRequest();
                        if (object.metricName != null)
                            message.metricName = String(object.metricName);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a DeleteLogMetricRequest message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.logging.v2.DeleteLogMetricRequest
                     * @static
                     * @param {google.logging.v2.DeleteLogMetricRequest} message DeleteLogMetricRequest
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    DeleteLogMetricRequest.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults)
                            object.metricName = "";
                        if (message.metricName != null && message.hasOwnProperty("metricName"))
                            object.metricName = message.metricName;
                        return object;
                    };
    
                    /**
                     * Converts this DeleteLogMetricRequest to JSON.
                     * @function toJSON
                     * @memberof google.logging.v2.DeleteLogMetricRequest
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    DeleteLogMetricRequest.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return DeleteLogMetricRequest;
                })();
    
                return v2;
            })();
    
            return logging;
        })();
    
        google.api = (function() {
    
            /**
             * Namespace api.
             * @memberof google
             * @namespace
             */
            var api = {};
    
            api.Http = (function() {
    
                /**
                 * Properties of a Http.
                 * @memberof google.api
                 * @interface IHttp
                 * @property {Array.<google.api.IHttpRule>|null} [rules] Http rules
                 * @property {boolean|null} [fullyDecodeReservedExpansion] Http fullyDecodeReservedExpansion
                 */
    
                /**
                 * Constructs a new Http.
                 * @memberof google.api
                 * @classdesc Represents a Http.
                 * @implements IHttp
                 * @constructor
                 * @param {google.api.IHttp=} [properties] Properties to set
                 */
                function Http(properties) {
                    this.rules = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * Http rules.
                 * @member {Array.<google.api.IHttpRule>} rules
                 * @memberof google.api.Http
                 * @instance
                 */
                Http.prototype.rules = $util.emptyArray;
    
                /**
                 * Http fullyDecodeReservedExpansion.
                 * @member {boolean} fullyDecodeReservedExpansion
                 * @memberof google.api.Http
                 * @instance
                 */
                Http.prototype.fullyDecodeReservedExpansion = false;
    
                /**
                 * Creates a new Http instance using the specified properties.
                 * @function create
                 * @memberof google.api.Http
                 * @static
                 * @param {google.api.IHttp=} [properties] Properties to set
                 * @returns {google.api.Http} Http instance
                 */
                Http.create = function create(properties) {
                    return new Http(properties);
                };
    
                /**
                 * Encodes the specified Http message. Does not implicitly {@link google.api.Http.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.Http
                 * @static
                 * @param {google.api.IHttp} message Http message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Http.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.rules != null && message.rules.length)
                        for (var i = 0; i < message.rules.length; ++i)
                            $root.google.api.HttpRule.encode(message.rules[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    if (message.fullyDecodeReservedExpansion != null && Object.hasOwnProperty.call(message, "fullyDecodeReservedExpansion"))
                        writer.uint32(/* id 2, wireType 0 =*/16).bool(message.fullyDecodeReservedExpansion);
                    return writer;
                };
    
                /**
                 * Encodes the specified Http message, length delimited. Does not implicitly {@link google.api.Http.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.Http
                 * @static
                 * @param {google.api.IHttp} message Http message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Http.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a Http message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.Http
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.Http} Http
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Http.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.Http();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            if (!(message.rules && message.rules.length))
                                message.rules = [];
                            message.rules.push($root.google.api.HttpRule.decode(reader, reader.uint32()));
                            break;
                        case 2:
                            message.fullyDecodeReservedExpansion = reader.bool();
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a Http message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.Http
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.Http} Http
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Http.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a Http message.
                 * @function verify
                 * @memberof google.api.Http
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                Http.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.rules != null && message.hasOwnProperty("rules")) {
                        if (!Array.isArray(message.rules))
                            return "rules: array expected";
                        for (var i = 0; i < message.rules.length; ++i) {
                            var error = $root.google.api.HttpRule.verify(message.rules[i]);
                            if (error)
                                return "rules." + error;
                        }
                    }
                    if (message.fullyDecodeReservedExpansion != null && message.hasOwnProperty("fullyDecodeReservedExpansion"))
                        if (typeof message.fullyDecodeReservedExpansion !== "boolean")
                            return "fullyDecodeReservedExpansion: boolean expected";
                    return null;
                };
    
                /**
                 * Creates a Http message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.Http
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.Http} Http
                 */
                Http.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.Http)
                        return object;
                    var message = new $root.google.api.Http();
                    if (object.rules) {
                        if (!Array.isArray(object.rules))
                            throw TypeError(".google.api.Http.rules: array expected");
                        message.rules = [];
                        for (var i = 0; i < object.rules.length; ++i) {
                            if (typeof object.rules[i] !== "object")
                                throw TypeError(".google.api.Http.rules: object expected");
                            message.rules[i] = $root.google.api.HttpRule.fromObject(object.rules[i]);
                        }
                    }
                    if (object.fullyDecodeReservedExpansion != null)
                        message.fullyDecodeReservedExpansion = Boolean(object.fullyDecodeReservedExpansion);
                    return message;
                };
    
                /**
                 * Creates a plain object from a Http message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.Http
                 * @static
                 * @param {google.api.Http} message Http
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                Http.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.rules = [];
                    if (options.defaults)
                        object.fullyDecodeReservedExpansion = false;
                    if (message.rules && message.rules.length) {
                        object.rules = [];
                        for (var j = 0; j < message.rules.length; ++j)
                            object.rules[j] = $root.google.api.HttpRule.toObject(message.rules[j], options);
                    }
                    if (message.fullyDecodeReservedExpansion != null && message.hasOwnProperty("fullyDecodeReservedExpansion"))
                        object.fullyDecodeReservedExpansion = message.fullyDecodeReservedExpansion;
                    return object;
                };
    
                /**
                 * Converts this Http to JSON.
                 * @function toJSON
                 * @memberof google.api.Http
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                Http.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return Http;
            })();
    
            api.HttpRule = (function() {
    
                /**
                 * Properties of a HttpRule.
                 * @memberof google.api
                 * @interface IHttpRule
                 * @property {string|null} [selector] HttpRule selector
                 * @property {string|null} [get] HttpRule get
                 * @property {string|null} [put] HttpRule put
                 * @property {string|null} [post] HttpRule post
                 * @property {string|null} ["delete"] HttpRule delete
                 * @property {string|null} [patch] HttpRule patch
                 * @property {google.api.ICustomHttpPattern|null} [custom] HttpRule custom
                 * @property {string|null} [body] HttpRule body
                 * @property {string|null} [responseBody] HttpRule responseBody
                 * @property {Array.<google.api.IHttpRule>|null} [additionalBindings] HttpRule additionalBindings
                 */
    
                /**
                 * Constructs a new HttpRule.
                 * @memberof google.api
                 * @classdesc Represents a HttpRule.
                 * @implements IHttpRule
                 * @constructor
                 * @param {google.api.IHttpRule=} [properties] Properties to set
                 */
                function HttpRule(properties) {
                    this.additionalBindings = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * HttpRule selector.
                 * @member {string} selector
                 * @memberof google.api.HttpRule
                 * @instance
                 */
                HttpRule.prototype.selector = "";
    
                /**
                 * HttpRule get.
                 * @member {string|null|undefined} get
                 * @memberof google.api.HttpRule
                 * @instance
                 */
                HttpRule.prototype.get = null;
    
                /**
                 * HttpRule put.
                 * @member {string|null|undefined} put
                 * @memberof google.api.HttpRule
                 * @instance
                 */
                HttpRule.prototype.put = null;
    
                /**
                 * HttpRule post.
                 * @member {string|null|undefined} post
                 * @memberof google.api.HttpRule
                 * @instance
                 */
                HttpRule.prototype.post = null;
    
                /**
                 * HttpRule delete.
                 * @member {string|null|undefined} delete
                 * @memberof google.api.HttpRule
                 * @instance
                 */
                HttpRule.prototype["delete"] = null;
    
                /**
                 * HttpRule patch.
                 * @member {string|null|undefined} patch
                 * @memberof google.api.HttpRule
                 * @instance
                 */
                HttpRule.prototype.patch = null;
    
                /**
                 * HttpRule custom.
                 * @member {google.api.ICustomHttpPattern|null|undefined} custom
                 * @memberof google.api.HttpRule
                 * @instance
                 */
                HttpRule.prototype.custom = null;
    
                /**
                 * HttpRule body.
                 * @member {string} body
                 * @memberof google.api.HttpRule
                 * @instance
                 */
                HttpRule.prototype.body = "";
    
                /**
                 * HttpRule responseBody.
                 * @member {string} responseBody
                 * @memberof google.api.HttpRule
                 * @instance
                 */
                HttpRule.prototype.responseBody = "";
    
                /**
                 * HttpRule additionalBindings.
                 * @member {Array.<google.api.IHttpRule>} additionalBindings
                 * @memberof google.api.HttpRule
                 * @instance
                 */
                HttpRule.prototype.additionalBindings = $util.emptyArray;
    
                // OneOf field names bound to virtual getters and setters
                var $oneOfFields;
    
                /**
                 * HttpRule pattern.
                 * @member {"get"|"put"|"post"|"delete"|"patch"|"custom"|undefined} pattern
                 * @memberof google.api.HttpRule
                 * @instance
                 */
                Object.defineProperty(HttpRule.prototype, "pattern", {
                    get: $util.oneOfGetter($oneOfFields = ["get", "put", "post", "delete", "patch", "custom"]),
                    set: $util.oneOfSetter($oneOfFields)
                });
    
                /**
                 * Creates a new HttpRule instance using the specified properties.
                 * @function create
                 * @memberof google.api.HttpRule
                 * @static
                 * @param {google.api.IHttpRule=} [properties] Properties to set
                 * @returns {google.api.HttpRule} HttpRule instance
                 */
                HttpRule.create = function create(properties) {
                    return new HttpRule(properties);
                };
    
                /**
                 * Encodes the specified HttpRule message. Does not implicitly {@link google.api.HttpRule.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.HttpRule
                 * @static
                 * @param {google.api.IHttpRule} message HttpRule message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                HttpRule.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.selector != null && Object.hasOwnProperty.call(message, "selector"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.selector);
                    if (message.get != null && Object.hasOwnProperty.call(message, "get"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.get);
                    if (message.put != null && Object.hasOwnProperty.call(message, "put"))
                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.put);
                    if (message.post != null && Object.hasOwnProperty.call(message, "post"))
                        writer.uint32(/* id 4, wireType 2 =*/34).string(message.post);
                    if (message["delete"] != null && Object.hasOwnProperty.call(message, "delete"))
                        writer.uint32(/* id 5, wireType 2 =*/42).string(message["delete"]);
                    if (message.patch != null && Object.hasOwnProperty.call(message, "patch"))
                        writer.uint32(/* id 6, wireType 2 =*/50).string(message.patch);
                    if (message.body != null && Object.hasOwnProperty.call(message, "body"))
                        writer.uint32(/* id 7, wireType 2 =*/58).string(message.body);
                    if (message.custom != null && Object.hasOwnProperty.call(message, "custom"))
                        $root.google.api.CustomHttpPattern.encode(message.custom, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();
                    if (message.additionalBindings != null && message.additionalBindings.length)
                        for (var i = 0; i < message.additionalBindings.length; ++i)
                            $root.google.api.HttpRule.encode(message.additionalBindings[i], writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim();
                    if (message.responseBody != null && Object.hasOwnProperty.call(message, "responseBody"))
                        writer.uint32(/* id 12, wireType 2 =*/98).string(message.responseBody);
                    return writer;
                };
    
                /**
                 * Encodes the specified HttpRule message, length delimited. Does not implicitly {@link google.api.HttpRule.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.HttpRule
                 * @static
                 * @param {google.api.IHttpRule} message HttpRule message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                HttpRule.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a HttpRule message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.HttpRule
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.HttpRule} HttpRule
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                HttpRule.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.HttpRule();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.selector = reader.string();
                            break;
                        case 2:
                            message.get = reader.string();
                            break;
                        case 3:
                            message.put = reader.string();
                            break;
                        case 4:
                            message.post = reader.string();
                            break;
                        case 5:
                            message["delete"] = reader.string();
                            break;
                        case 6:
                            message.patch = reader.string();
                            break;
                        case 8:
                            message.custom = $root.google.api.CustomHttpPattern.decode(reader, reader.uint32());
                            break;
                        case 7:
                            message.body = reader.string();
                            break;
                        case 12:
                            message.responseBody = reader.string();
                            break;
                        case 11:
                            if (!(message.additionalBindings && message.additionalBindings.length))
                                message.additionalBindings = [];
                            message.additionalBindings.push($root.google.api.HttpRule.decode(reader, reader.uint32()));
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a HttpRule message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.HttpRule
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.HttpRule} HttpRule
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                HttpRule.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a HttpRule message.
                 * @function verify
                 * @memberof google.api.HttpRule
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                HttpRule.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    var properties = {};
                    if (message.selector != null && message.hasOwnProperty("selector"))
                        if (!$util.isString(message.selector))
                            return "selector: string expected";
                    if (message.get != null && message.hasOwnProperty("get")) {
                        properties.pattern = 1;
                        if (!$util.isString(message.get))
                            return "get: string expected";
                    }
                    if (message.put != null && message.hasOwnProperty("put")) {
                        if (properties.pattern === 1)
                            return "pattern: multiple values";
                        properties.pattern = 1;
                        if (!$util.isString(message.put))
                            return "put: string expected";
                    }
                    if (message.post != null && message.hasOwnProperty("post")) {
                        if (properties.pattern === 1)
                            return "pattern: multiple values";
                        properties.pattern = 1;
                        if (!$util.isString(message.post))
                            return "post: string expected";
                    }
                    if (message["delete"] != null && message.hasOwnProperty("delete")) {
                        if (properties.pattern === 1)
                            return "pattern: multiple values";
                        properties.pattern = 1;
                        if (!$util.isString(message["delete"]))
                            return "delete: string expected";
                    }
                    if (message.patch != null && message.hasOwnProperty("patch")) {
                        if (properties.pattern === 1)
                            return "pattern: multiple values";
                        properties.pattern = 1;
                        if (!$util.isString(message.patch))
                            return "patch: string expected";
                    }
                    if (message.custom != null && message.hasOwnProperty("custom")) {
                        if (properties.pattern === 1)
                            return "pattern: multiple values";
                        properties.pattern = 1;
                        {
                            var error = $root.google.api.CustomHttpPattern.verify(message.custom);
                            if (error)
                                return "custom." + error;
                        }
                    }
                    if (message.body != null && message.hasOwnProperty("body"))
                        if (!$util.isString(message.body))
                            return "body: string expected";
                    if (message.responseBody != null && message.hasOwnProperty("responseBody"))
                        if (!$util.isString(message.responseBody))
                            return "responseBody: string expected";
                    if (message.additionalBindings != null && message.hasOwnProperty("additionalBindings")) {
                        if (!Array.isArray(message.additionalBindings))
                            return "additionalBindings: array expected";
                        for (var i = 0; i < message.additionalBindings.length; ++i) {
                            var error = $root.google.api.HttpRule.verify(message.additionalBindings[i]);
                            if (error)
                                return "additionalBindings." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates a HttpRule message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.HttpRule
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.HttpRule} HttpRule
                 */
                HttpRule.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.HttpRule)
                        return object;
                    var message = new $root.google.api.HttpRule();
                    if (object.selector != null)
                        message.selector = String(object.selector);
                    if (object.get != null)
                        message.get = String(object.get);
                    if (object.put != null)
                        message.put = String(object.put);
                    if (object.post != null)
                        message.post = String(object.post);
                    if (object["delete"] != null)
                        message["delete"] = String(object["delete"]);
                    if (object.patch != null)
                        message.patch = String(object.patch);
                    if (object.custom != null) {
                        if (typeof object.custom !== "object")
                            throw TypeError(".google.api.HttpRule.custom: object expected");
                        message.custom = $root.google.api.CustomHttpPattern.fromObject(object.custom);
                    }
                    if (object.body != null)
                        message.body = String(object.body);
                    if (object.responseBody != null)
                        message.responseBody = String(object.responseBody);
                    if (object.additionalBindings) {
                        if (!Array.isArray(object.additionalBindings))
                            throw TypeError(".google.api.HttpRule.additionalBindings: array expected");
                        message.additionalBindings = [];
                        for (var i = 0; i < object.additionalBindings.length; ++i) {
                            if (typeof object.additionalBindings[i] !== "object")
                                throw TypeError(".google.api.HttpRule.additionalBindings: object expected");
                            message.additionalBindings[i] = $root.google.api.HttpRule.fromObject(object.additionalBindings[i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a HttpRule message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.HttpRule
                 * @static
                 * @param {google.api.HttpRule} message HttpRule
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                HttpRule.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.additionalBindings = [];
                    if (options.defaults) {
                        object.selector = "";
                        object.body = "";
                        object.responseBody = "";
                    }
                    if (message.selector != null && message.hasOwnProperty("selector"))
                        object.selector = message.selector;
                    if (message.get != null && message.hasOwnProperty("get")) {
                        object.get = message.get;
                        if (options.oneofs)
                            object.pattern = "get";
                    }
                    if (message.put != null && message.hasOwnProperty("put")) {
                        object.put = message.put;
                        if (options.oneofs)
                            object.pattern = "put";
                    }
                    if (message.post != null && message.hasOwnProperty("post")) {
                        object.post = message.post;
                        if (options.oneofs)
                            object.pattern = "post";
                    }
                    if (message["delete"] != null && message.hasOwnProperty("delete")) {
                        object["delete"] = message["delete"];
                        if (options.oneofs)
                            object.pattern = "delete";
                    }
                    if (message.patch != null && message.hasOwnProperty("patch")) {
                        object.patch = message.patch;
                        if (options.oneofs)
                            object.pattern = "patch";
                    }
                    if (message.body != null && message.hasOwnProperty("body"))
                        object.body = message.body;
                    if (message.custom != null && message.hasOwnProperty("custom")) {
                        object.custom = $root.google.api.CustomHttpPattern.toObject(message.custom, options);
                        if (options.oneofs)
                            object.pattern = "custom";
                    }
                    if (message.additionalBindings && message.additionalBindings.length) {
                        object.additionalBindings = [];
                        for (var j = 0; j < message.additionalBindings.length; ++j)
                            object.additionalBindings[j] = $root.google.api.HttpRule.toObject(message.additionalBindings[j], options);
                    }
                    if (message.responseBody != null && message.hasOwnProperty("responseBody"))
                        object.responseBody = message.responseBody;
                    return object;
                };
    
                /**
                 * Converts this HttpRule to JSON.
                 * @function toJSON
                 * @memberof google.api.HttpRule
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                HttpRule.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return HttpRule;
            })();
    
            api.CustomHttpPattern = (function() {
    
                /**
                 * Properties of a CustomHttpPattern.
                 * @memberof google.api
                 * @interface ICustomHttpPattern
                 * @property {string|null} [kind] CustomHttpPattern kind
                 * @property {string|null} [path] CustomHttpPattern path
                 */
    
                /**
                 * Constructs a new CustomHttpPattern.
                 * @memberof google.api
                 * @classdesc Represents a CustomHttpPattern.
                 * @implements ICustomHttpPattern
                 * @constructor
                 * @param {google.api.ICustomHttpPattern=} [properties] Properties to set
                 */
                function CustomHttpPattern(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * CustomHttpPattern kind.
                 * @member {string} kind
                 * @memberof google.api.CustomHttpPattern
                 * @instance
                 */
                CustomHttpPattern.prototype.kind = "";
    
                /**
                 * CustomHttpPattern path.
                 * @member {string} path
                 * @memberof google.api.CustomHttpPattern
                 * @instance
                 */
                CustomHttpPattern.prototype.path = "";
    
                /**
                 * Creates a new CustomHttpPattern instance using the specified properties.
                 * @function create
                 * @memberof google.api.CustomHttpPattern
                 * @static
                 * @param {google.api.ICustomHttpPattern=} [properties] Properties to set
                 * @returns {google.api.CustomHttpPattern} CustomHttpPattern instance
                 */
                CustomHttpPattern.create = function create(properties) {
                    return new CustomHttpPattern(properties);
                };
    
                /**
                 * Encodes the specified CustomHttpPattern message. Does not implicitly {@link google.api.CustomHttpPattern.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.CustomHttpPattern
                 * @static
                 * @param {google.api.ICustomHttpPattern} message CustomHttpPattern message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                CustomHttpPattern.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.kind != null && Object.hasOwnProperty.call(message, "kind"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.kind);
                    if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.path);
                    return writer;
                };
    
                /**
                 * Encodes the specified CustomHttpPattern message, length delimited. Does not implicitly {@link google.api.CustomHttpPattern.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.CustomHttpPattern
                 * @static
                 * @param {google.api.ICustomHttpPattern} message CustomHttpPattern message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                CustomHttpPattern.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a CustomHttpPattern message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.CustomHttpPattern
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.CustomHttpPattern} CustomHttpPattern
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                CustomHttpPattern.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.CustomHttpPattern();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.kind = reader.string();
                            break;
                        case 2:
                            message.path = reader.string();
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a CustomHttpPattern message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.CustomHttpPattern
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.CustomHttpPattern} CustomHttpPattern
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                CustomHttpPattern.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a CustomHttpPattern message.
                 * @function verify
                 * @memberof google.api.CustomHttpPattern
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                CustomHttpPattern.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.kind != null && message.hasOwnProperty("kind"))
                        if (!$util.isString(message.kind))
                            return "kind: string expected";
                    if (message.path != null && message.hasOwnProperty("path"))
                        if (!$util.isString(message.path))
                            return "path: string expected";
                    return null;
                };
    
                /**
                 * Creates a CustomHttpPattern message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.CustomHttpPattern
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.CustomHttpPattern} CustomHttpPattern
                 */
                CustomHttpPattern.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.CustomHttpPattern)
                        return object;
                    var message = new $root.google.api.CustomHttpPattern();
                    if (object.kind != null)
                        message.kind = String(object.kind);
                    if (object.path != null)
                        message.path = String(object.path);
                    return message;
                };
    
                /**
                 * Creates a plain object from a CustomHttpPattern message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.CustomHttpPattern
                 * @static
                 * @param {google.api.CustomHttpPattern} message CustomHttpPattern
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                CustomHttpPattern.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.kind = "";
                        object.path = "";
                    }
                    if (message.kind != null && message.hasOwnProperty("kind"))
                        object.kind = message.kind;
                    if (message.path != null && message.hasOwnProperty("path"))
                        object.path = message.path;
                    return object;
                };
    
                /**
                 * Converts this CustomHttpPattern to JSON.
                 * @function toJSON
                 * @memberof google.api.CustomHttpPattern
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                CustomHttpPattern.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return CustomHttpPattern;
            })();
    
            /**
             * FieldBehavior enum.
             * @name google.api.FieldBehavior
             * @enum {number}
             * @property {number} FIELD_BEHAVIOR_UNSPECIFIED=0 FIELD_BEHAVIOR_UNSPECIFIED value
             * @property {number} OPTIONAL=1 OPTIONAL value
             * @property {number} REQUIRED=2 REQUIRED value
             * @property {number} OUTPUT_ONLY=3 OUTPUT_ONLY value
             * @property {number} INPUT_ONLY=4 INPUT_ONLY value
             * @property {number} IMMUTABLE=5 IMMUTABLE value
             * @property {number} UNORDERED_LIST=6 UNORDERED_LIST value
             * @property {number} NON_EMPTY_DEFAULT=7 NON_EMPTY_DEFAULT value
             */
            api.FieldBehavior = (function() {
                var valuesById = {}, values = Object.create(valuesById);
                values[valuesById[0] = "FIELD_BEHAVIOR_UNSPECIFIED"] = 0;
                values[valuesById[1] = "OPTIONAL"] = 1;
                values[valuesById[2] = "REQUIRED"] = 2;
                values[valuesById[3] = "OUTPUT_ONLY"] = 3;
                values[valuesById[4] = "INPUT_ONLY"] = 4;
                values[valuesById[5] = "IMMUTABLE"] = 5;
                values[valuesById[6] = "UNORDERED_LIST"] = 6;
                values[valuesById[7] = "NON_EMPTY_DEFAULT"] = 7;
                return values;
            })();
    
            api.MonitoredResourceDescriptor = (function() {
    
                /**
                 * Properties of a MonitoredResourceDescriptor.
                 * @memberof google.api
                 * @interface IMonitoredResourceDescriptor
                 * @property {string|null} [name] MonitoredResourceDescriptor name
                 * @property {string|null} [type] MonitoredResourceDescriptor type
                 * @property {string|null} [displayName] MonitoredResourceDescriptor displayName
                 * @property {string|null} [description] MonitoredResourceDescriptor description
                 * @property {Array.<google.api.ILabelDescriptor>|null} [labels] MonitoredResourceDescriptor labels
                 * @property {google.api.LaunchStage|null} [launchStage] MonitoredResourceDescriptor launchStage
                 */
    
                /**
                 * Constructs a new MonitoredResourceDescriptor.
                 * @memberof google.api
                 * @classdesc Represents a MonitoredResourceDescriptor.
                 * @implements IMonitoredResourceDescriptor
                 * @constructor
                 * @param {google.api.IMonitoredResourceDescriptor=} [properties] Properties to set
                 */
                function MonitoredResourceDescriptor(properties) {
                    this.labels = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * MonitoredResourceDescriptor name.
                 * @member {string} name
                 * @memberof google.api.MonitoredResourceDescriptor
                 * @instance
                 */
                MonitoredResourceDescriptor.prototype.name = "";
    
                /**
                 * MonitoredResourceDescriptor type.
                 * @member {string} type
                 * @memberof google.api.MonitoredResourceDescriptor
                 * @instance
                 */
                MonitoredResourceDescriptor.prototype.type = "";
    
                /**
                 * MonitoredResourceDescriptor displayName.
                 * @member {string} displayName
                 * @memberof google.api.MonitoredResourceDescriptor
                 * @instance
                 */
                MonitoredResourceDescriptor.prototype.displayName = "";
    
                /**
                 * MonitoredResourceDescriptor description.
                 * @member {string} description
                 * @memberof google.api.MonitoredResourceDescriptor
                 * @instance
                 */
                MonitoredResourceDescriptor.prototype.description = "";
    
                /**
                 * MonitoredResourceDescriptor labels.
                 * @member {Array.<google.api.ILabelDescriptor>} labels
                 * @memberof google.api.MonitoredResourceDescriptor
                 * @instance
                 */
                MonitoredResourceDescriptor.prototype.labels = $util.emptyArray;
    
                /**
                 * MonitoredResourceDescriptor launchStage.
                 * @member {google.api.LaunchStage} launchStage
                 * @memberof google.api.MonitoredResourceDescriptor
                 * @instance
                 */
                MonitoredResourceDescriptor.prototype.launchStage = 0;
    
                /**
                 * Creates a new MonitoredResourceDescriptor instance using the specified properties.
                 * @function create
                 * @memberof google.api.MonitoredResourceDescriptor
                 * @static
                 * @param {google.api.IMonitoredResourceDescriptor=} [properties] Properties to set
                 * @returns {google.api.MonitoredResourceDescriptor} MonitoredResourceDescriptor instance
                 */
                MonitoredResourceDescriptor.create = function create(properties) {
                    return new MonitoredResourceDescriptor(properties);
                };
    
                /**
                 * Encodes the specified MonitoredResourceDescriptor message. Does not implicitly {@link google.api.MonitoredResourceDescriptor.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.MonitoredResourceDescriptor
                 * @static
                 * @param {google.api.IMonitoredResourceDescriptor} message MonitoredResourceDescriptor message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                MonitoredResourceDescriptor.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
                    if (message.displayName != null && Object.hasOwnProperty.call(message, "displayName"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.displayName);
                    if (message.description != null && Object.hasOwnProperty.call(message, "description"))
                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.description);
                    if (message.labels != null && message.labels.length)
                        for (var i = 0; i < message.labels.length; ++i)
                            $root.google.api.LabelDescriptor.encode(message.labels[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 5, wireType 2 =*/42).string(message.name);
                    if (message.launchStage != null && Object.hasOwnProperty.call(message, "launchStage"))
                        writer.uint32(/* id 7, wireType 0 =*/56).int32(message.launchStage);
                    return writer;
                };
    
                /**
                 * Encodes the specified MonitoredResourceDescriptor message, length delimited. Does not implicitly {@link google.api.MonitoredResourceDescriptor.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.MonitoredResourceDescriptor
                 * @static
                 * @param {google.api.IMonitoredResourceDescriptor} message MonitoredResourceDescriptor message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                MonitoredResourceDescriptor.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a MonitoredResourceDescriptor message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.MonitoredResourceDescriptor
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.MonitoredResourceDescriptor} MonitoredResourceDescriptor
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                MonitoredResourceDescriptor.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.MonitoredResourceDescriptor();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 5:
                            message.name = reader.string();
                            break;
                        case 1:
                            message.type = reader.string();
                            break;
                        case 2:
                            message.displayName = reader.string();
                            break;
                        case 3:
                            message.description = reader.string();
                            break;
                        case 4:
                            if (!(message.labels && message.labels.length))
                                message.labels = [];
                            message.labels.push($root.google.api.LabelDescriptor.decode(reader, reader.uint32()));
                            break;
                        case 7:
                            message.launchStage = reader.int32();
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a MonitoredResourceDescriptor message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.MonitoredResourceDescriptor
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.MonitoredResourceDescriptor} MonitoredResourceDescriptor
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                MonitoredResourceDescriptor.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a MonitoredResourceDescriptor message.
                 * @function verify
                 * @memberof google.api.MonitoredResourceDescriptor
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                MonitoredResourceDescriptor.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    if (message.type != null && message.hasOwnProperty("type"))
                        if (!$util.isString(message.type))
                            return "type: string expected";
                    if (message.displayName != null && message.hasOwnProperty("displayName"))
                        if (!$util.isString(message.displayName))
                            return "displayName: string expected";
                    if (message.description != null && message.hasOwnProperty("description"))
                        if (!$util.isString(message.description))
                            return "description: string expected";
                    if (message.labels != null && message.hasOwnProperty("labels")) {
                        if (!Array.isArray(message.labels))
                            return "labels: array expected";
                        for (var i = 0; i < message.labels.length; ++i) {
                            var error = $root.google.api.LabelDescriptor.verify(message.labels[i]);
                            if (error)
                                return "labels." + error;
                        }
                    }
                    if (message.launchStage != null && message.hasOwnProperty("launchStage"))
                        switch (message.launchStage) {
                        default:
                            return "launchStage: enum value expected";
                        case 0:
                        case 6:
                        case 7:
                        case 1:
                        case 2:
                        case 3:
                        case 4:
                        case 5:
                            break;
                        }
                    return null;
                };
    
                /**
                 * Creates a MonitoredResourceDescriptor message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.MonitoredResourceDescriptor
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.MonitoredResourceDescriptor} MonitoredResourceDescriptor
                 */
                MonitoredResourceDescriptor.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.MonitoredResourceDescriptor)
                        return object;
                    var message = new $root.google.api.MonitoredResourceDescriptor();
                    if (object.name != null)
                        message.name = String(object.name);
                    if (object.type != null)
                        message.type = String(object.type);
                    if (object.displayName != null)
                        message.displayName = String(object.displayName);
                    if (object.description != null)
                        message.description = String(object.description);
                    if (object.labels) {
                        if (!Array.isArray(object.labels))
                            throw TypeError(".google.api.MonitoredResourceDescriptor.labels: array expected");
                        message.labels = [];
                        for (var i = 0; i < object.labels.length; ++i) {
                            if (typeof object.labels[i] !== "object")
                                throw TypeError(".google.api.MonitoredResourceDescriptor.labels: object expected");
                            message.labels[i] = $root.google.api.LabelDescriptor.fromObject(object.labels[i]);
                        }
                    }
                    switch (object.launchStage) {
                    case "LAUNCH_STAGE_UNSPECIFIED":
                    case 0:
                        message.launchStage = 0;
                        break;
                    case "UNIMPLEMENTED":
                    case 6:
                        message.launchStage = 6;
                        break;
                    case "PRELAUNCH":
                    case 7:
                        message.launchStage = 7;
                        break;
                    case "EARLY_ACCESS":
                    case 1:
                        message.launchStage = 1;
                        break;
                    case "ALPHA":
                    case 2:
                        message.launchStage = 2;
                        break;
                    case "BETA":
                    case 3:
                        message.launchStage = 3;
                        break;
                    case "GA":
                    case 4:
                        message.launchStage = 4;
                        break;
                    case "DEPRECATED":
                    case 5:
                        message.launchStage = 5;
                        break;
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a MonitoredResourceDescriptor message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.MonitoredResourceDescriptor
                 * @static
                 * @param {google.api.MonitoredResourceDescriptor} message MonitoredResourceDescriptor
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                MonitoredResourceDescriptor.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.labels = [];
                    if (options.defaults) {
                        object.type = "";
                        object.displayName = "";
                        object.description = "";
                        object.name = "";
                        object.launchStage = options.enums === String ? "LAUNCH_STAGE_UNSPECIFIED" : 0;
                    }
                    if (message.type != null && message.hasOwnProperty("type"))
                        object.type = message.type;
                    if (message.displayName != null && message.hasOwnProperty("displayName"))
                        object.displayName = message.displayName;
                    if (message.description != null && message.hasOwnProperty("description"))
                        object.description = message.description;
                    if (message.labels && message.labels.length) {
                        object.labels = [];
                        for (var j = 0; j < message.labels.length; ++j)
                            object.labels[j] = $root.google.api.LabelDescriptor.toObject(message.labels[j], options);
                    }
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    if (message.launchStage != null && message.hasOwnProperty("launchStage"))
                        object.launchStage = options.enums === String ? $root.google.api.LaunchStage[message.launchStage] : message.launchStage;
                    return object;
                };
    
                /**
                 * Converts this MonitoredResourceDescriptor to JSON.
                 * @function toJSON
                 * @memberof google.api.MonitoredResourceDescriptor
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                MonitoredResourceDescriptor.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return MonitoredResourceDescriptor;
            })();
    
            api.MonitoredResource = (function() {
    
                /**
                 * Properties of a MonitoredResource.
                 * @memberof google.api
                 * @interface IMonitoredResource
                 * @property {string|null} [type] MonitoredResource type
                 * @property {Object.<string,string>|null} [labels] MonitoredResource labels
                 */
    
                /**
                 * Constructs a new MonitoredResource.
                 * @memberof google.api
                 * @classdesc Represents a MonitoredResource.
                 * @implements IMonitoredResource
                 * @constructor
                 * @param {google.api.IMonitoredResource=} [properties] Properties to set
                 */
                function MonitoredResource(properties) {
                    this.labels = {};
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * MonitoredResource type.
                 * @member {string} type
                 * @memberof google.api.MonitoredResource
                 * @instance
                 */
                MonitoredResource.prototype.type = "";
    
                /**
                 * MonitoredResource labels.
                 * @member {Object.<string,string>} labels
                 * @memberof google.api.MonitoredResource
                 * @instance
                 */
                MonitoredResource.prototype.labels = $util.emptyObject;
    
                /**
                 * Creates a new MonitoredResource instance using the specified properties.
                 * @function create
                 * @memberof google.api.MonitoredResource
                 * @static
                 * @param {google.api.IMonitoredResource=} [properties] Properties to set
                 * @returns {google.api.MonitoredResource} MonitoredResource instance
                 */
                MonitoredResource.create = function create(properties) {
                    return new MonitoredResource(properties);
                };
    
                /**
                 * Encodes the specified MonitoredResource message. Does not implicitly {@link google.api.MonitoredResource.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.MonitoredResource
                 * @static
                 * @param {google.api.IMonitoredResource} message MonitoredResource message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                MonitoredResource.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
                    if (message.labels != null && Object.hasOwnProperty.call(message, "labels"))
                        for (var keys = Object.keys(message.labels), i = 0; i < keys.length; ++i)
                            writer.uint32(/* id 2, wireType 2 =*/18).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.labels[keys[i]]).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified MonitoredResource message, length delimited. Does not implicitly {@link google.api.MonitoredResource.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.MonitoredResource
                 * @static
                 * @param {google.api.IMonitoredResource} message MonitoredResource message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                MonitoredResource.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a MonitoredResource message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.MonitoredResource
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.MonitoredResource} MonitoredResource
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                MonitoredResource.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.MonitoredResource(), key, value;
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.type = reader.string();
                            break;
                        case 2:
                            if (message.labels === $util.emptyObject)
                                message.labels = {};
                            var end2 = reader.uint32() + reader.pos;
                            key = "";
                            value = "";
                            while (reader.pos < end2) {
                                var tag2 = reader.uint32();
                                switch (tag2 >>> 3) {
                                case 1:
                                    key = reader.string();
                                    break;
                                case 2:
                                    value = reader.string();
                                    break;
                                default:
                                    reader.skipType(tag2 & 7);
                                    break;
                                }
                            }
                            message.labels[key] = value;
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a MonitoredResource message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.MonitoredResource
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.MonitoredResource} MonitoredResource
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                MonitoredResource.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a MonitoredResource message.
                 * @function verify
                 * @memberof google.api.MonitoredResource
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                MonitoredResource.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.type != null && message.hasOwnProperty("type"))
                        if (!$util.isString(message.type))
                            return "type: string expected";
                    if (message.labels != null && message.hasOwnProperty("labels")) {
                        if (!$util.isObject(message.labels))
                            return "labels: object expected";
                        var key = Object.keys(message.labels);
                        for (var i = 0; i < key.length; ++i)
                            if (!$util.isString(message.labels[key[i]]))
                                return "labels: string{k:string} expected";
                    }
                    return null;
                };
    
                /**
                 * Creates a MonitoredResource message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.MonitoredResource
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.MonitoredResource} MonitoredResource
                 */
                MonitoredResource.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.MonitoredResource)
                        return object;
                    var message = new $root.google.api.MonitoredResource();
                    if (object.type != null)
                        message.type = String(object.type);
                    if (object.labels) {
                        if (typeof object.labels !== "object")
                            throw TypeError(".google.api.MonitoredResource.labels: object expected");
                        message.labels = {};
                        for (var keys = Object.keys(object.labels), i = 0; i < keys.length; ++i)
                            message.labels[keys[i]] = String(object.labels[keys[i]]);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a MonitoredResource message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.MonitoredResource
                 * @static
                 * @param {google.api.MonitoredResource} message MonitoredResource
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                MonitoredResource.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.objects || options.defaults)
                        object.labels = {};
                    if (options.defaults)
                        object.type = "";
                    if (message.type != null && message.hasOwnProperty("type"))
                        object.type = message.type;
                    var keys2;
                    if (message.labels && (keys2 = Object.keys(message.labels)).length) {
                        object.labels = {};
                        for (var j = 0; j < keys2.length; ++j)
                            object.labels[keys2[j]] = message.labels[keys2[j]];
                    }
                    return object;
                };
    
                /**
                 * Converts this MonitoredResource to JSON.
                 * @function toJSON
                 * @memberof google.api.MonitoredResource
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                MonitoredResource.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return MonitoredResource;
            })();
    
            api.MonitoredResourceMetadata = (function() {
    
                /**
                 * Properties of a MonitoredResourceMetadata.
                 * @memberof google.api
                 * @interface IMonitoredResourceMetadata
                 * @property {google.protobuf.IStruct|null} [systemLabels] MonitoredResourceMetadata systemLabels
                 * @property {Object.<string,string>|null} [userLabels] MonitoredResourceMetadata userLabels
                 */
    
                /**
                 * Constructs a new MonitoredResourceMetadata.
                 * @memberof google.api
                 * @classdesc Represents a MonitoredResourceMetadata.
                 * @implements IMonitoredResourceMetadata
                 * @constructor
                 * @param {google.api.IMonitoredResourceMetadata=} [properties] Properties to set
                 */
                function MonitoredResourceMetadata(properties) {
                    this.userLabels = {};
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * MonitoredResourceMetadata systemLabels.
                 * @member {google.protobuf.IStruct|null|undefined} systemLabels
                 * @memberof google.api.MonitoredResourceMetadata
                 * @instance
                 */
                MonitoredResourceMetadata.prototype.systemLabels = null;
    
                /**
                 * MonitoredResourceMetadata userLabels.
                 * @member {Object.<string,string>} userLabels
                 * @memberof google.api.MonitoredResourceMetadata
                 * @instance
                 */
                MonitoredResourceMetadata.prototype.userLabels = $util.emptyObject;
    
                /**
                 * Creates a new MonitoredResourceMetadata instance using the specified properties.
                 * @function create
                 * @memberof google.api.MonitoredResourceMetadata
                 * @static
                 * @param {google.api.IMonitoredResourceMetadata=} [properties] Properties to set
                 * @returns {google.api.MonitoredResourceMetadata} MonitoredResourceMetadata instance
                 */
                MonitoredResourceMetadata.create = function create(properties) {
                    return new MonitoredResourceMetadata(properties);
                };
    
                /**
                 * Encodes the specified MonitoredResourceMetadata message. Does not implicitly {@link google.api.MonitoredResourceMetadata.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.MonitoredResourceMetadata
                 * @static
                 * @param {google.api.IMonitoredResourceMetadata} message MonitoredResourceMetadata message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                MonitoredResourceMetadata.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.systemLabels != null && Object.hasOwnProperty.call(message, "systemLabels"))
                        $root.google.protobuf.Struct.encode(message.systemLabels, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    if (message.userLabels != null && Object.hasOwnProperty.call(message, "userLabels"))
                        for (var keys = Object.keys(message.userLabels), i = 0; i < keys.length; ++i)
                            writer.uint32(/* id 2, wireType 2 =*/18).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.userLabels[keys[i]]).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified MonitoredResourceMetadata message, length delimited. Does not implicitly {@link google.api.MonitoredResourceMetadata.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.MonitoredResourceMetadata
                 * @static
                 * @param {google.api.IMonitoredResourceMetadata} message MonitoredResourceMetadata message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                MonitoredResourceMetadata.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a MonitoredResourceMetadata message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.MonitoredResourceMetadata
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.MonitoredResourceMetadata} MonitoredResourceMetadata
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                MonitoredResourceMetadata.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.MonitoredResourceMetadata(), key, value;
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.systemLabels = $root.google.protobuf.Struct.decode(reader, reader.uint32());
                            break;
                        case 2:
                            if (message.userLabels === $util.emptyObject)
                                message.userLabels = {};
                            var end2 = reader.uint32() + reader.pos;
                            key = "";
                            value = "";
                            while (reader.pos < end2) {
                                var tag2 = reader.uint32();
                                switch (tag2 >>> 3) {
                                case 1:
                                    key = reader.string();
                                    break;
                                case 2:
                                    value = reader.string();
                                    break;
                                default:
                                    reader.skipType(tag2 & 7);
                                    break;
                                }
                            }
                            message.userLabels[key] = value;
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a MonitoredResourceMetadata message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.MonitoredResourceMetadata
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.MonitoredResourceMetadata} MonitoredResourceMetadata
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                MonitoredResourceMetadata.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a MonitoredResourceMetadata message.
                 * @function verify
                 * @memberof google.api.MonitoredResourceMetadata
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                MonitoredResourceMetadata.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.systemLabels != null && message.hasOwnProperty("systemLabels")) {
                        var error = $root.google.protobuf.Struct.verify(message.systemLabels);
                        if (error)
                            return "systemLabels." + error;
                    }
                    if (message.userLabels != null && message.hasOwnProperty("userLabels")) {
                        if (!$util.isObject(message.userLabels))
                            return "userLabels: object expected";
                        var key = Object.keys(message.userLabels);
                        for (var i = 0; i < key.length; ++i)
                            if (!$util.isString(message.userLabels[key[i]]))
                                return "userLabels: string{k:string} expected";
                    }
                    return null;
                };
    
                /**
                 * Creates a MonitoredResourceMetadata message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.MonitoredResourceMetadata
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.MonitoredResourceMetadata} MonitoredResourceMetadata
                 */
                MonitoredResourceMetadata.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.MonitoredResourceMetadata)
                        return object;
                    var message = new $root.google.api.MonitoredResourceMetadata();
                    if (object.systemLabels != null) {
                        if (typeof object.systemLabels !== "object")
                            throw TypeError(".google.api.MonitoredResourceMetadata.systemLabels: object expected");
                        message.systemLabels = $root.google.protobuf.Struct.fromObject(object.systemLabels);
                    }
                    if (object.userLabels) {
                        if (typeof object.userLabels !== "object")
                            throw TypeError(".google.api.MonitoredResourceMetadata.userLabels: object expected");
                        message.userLabels = {};
                        for (var keys = Object.keys(object.userLabels), i = 0; i < keys.length; ++i)
                            message.userLabels[keys[i]] = String(object.userLabels[keys[i]]);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a MonitoredResourceMetadata message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.MonitoredResourceMetadata
                 * @static
                 * @param {google.api.MonitoredResourceMetadata} message MonitoredResourceMetadata
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                MonitoredResourceMetadata.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.objects || options.defaults)
                        object.userLabels = {};
                    if (options.defaults)
                        object.systemLabels = null;
                    if (message.systemLabels != null && message.hasOwnProperty("systemLabels"))
                        object.systemLabels = $root.google.protobuf.Struct.toObject(message.systemLabels, options);
                    var keys2;
                    if (message.userLabels && (keys2 = Object.keys(message.userLabels)).length) {
                        object.userLabels = {};
                        for (var j = 0; j < keys2.length; ++j)
                            object.userLabels[keys2[j]] = message.userLabels[keys2[j]];
                    }
                    return object;
                };
    
                /**
                 * Converts this MonitoredResourceMetadata to JSON.
                 * @function toJSON
                 * @memberof google.api.MonitoredResourceMetadata
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                MonitoredResourceMetadata.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return MonitoredResourceMetadata;
            })();
    
            api.LabelDescriptor = (function() {
    
                /**
                 * Properties of a LabelDescriptor.
                 * @memberof google.api
                 * @interface ILabelDescriptor
                 * @property {string|null} [key] LabelDescriptor key
                 * @property {google.api.LabelDescriptor.ValueType|null} [valueType] LabelDescriptor valueType
                 * @property {string|null} [description] LabelDescriptor description
                 */
    
                /**
                 * Constructs a new LabelDescriptor.
                 * @memberof google.api
                 * @classdesc Represents a LabelDescriptor.
                 * @implements ILabelDescriptor
                 * @constructor
                 * @param {google.api.ILabelDescriptor=} [properties] Properties to set
                 */
                function LabelDescriptor(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * LabelDescriptor key.
                 * @member {string} key
                 * @memberof google.api.LabelDescriptor
                 * @instance
                 */
                LabelDescriptor.prototype.key = "";
    
                /**
                 * LabelDescriptor valueType.
                 * @member {google.api.LabelDescriptor.ValueType} valueType
                 * @memberof google.api.LabelDescriptor
                 * @instance
                 */
                LabelDescriptor.prototype.valueType = 0;
    
                /**
                 * LabelDescriptor description.
                 * @member {string} description
                 * @memberof google.api.LabelDescriptor
                 * @instance
                 */
                LabelDescriptor.prototype.description = "";
    
                /**
                 * Creates a new LabelDescriptor instance using the specified properties.
                 * @function create
                 * @memberof google.api.LabelDescriptor
                 * @static
                 * @param {google.api.ILabelDescriptor=} [properties] Properties to set
                 * @returns {google.api.LabelDescriptor} LabelDescriptor instance
                 */
                LabelDescriptor.create = function create(properties) {
                    return new LabelDescriptor(properties);
                };
    
                /**
                 * Encodes the specified LabelDescriptor message. Does not implicitly {@link google.api.LabelDescriptor.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.LabelDescriptor
                 * @static
                 * @param {google.api.ILabelDescriptor} message LabelDescriptor message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                LabelDescriptor.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.key != null && Object.hasOwnProperty.call(message, "key"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.key);
                    if (message.valueType != null && Object.hasOwnProperty.call(message, "valueType"))
                        writer.uint32(/* id 2, wireType 0 =*/16).int32(message.valueType);
                    if (message.description != null && Object.hasOwnProperty.call(message, "description"))
                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.description);
                    return writer;
                };
    
                /**
                 * Encodes the specified LabelDescriptor message, length delimited. Does not implicitly {@link google.api.LabelDescriptor.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.LabelDescriptor
                 * @static
                 * @param {google.api.ILabelDescriptor} message LabelDescriptor message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                LabelDescriptor.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a LabelDescriptor message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.LabelDescriptor
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.LabelDescriptor} LabelDescriptor
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                LabelDescriptor.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.LabelDescriptor();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.key = reader.string();
                            break;
                        case 2:
                            message.valueType = reader.int32();
                            break;
                        case 3:
                            message.description = reader.string();
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a LabelDescriptor message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.LabelDescriptor
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.LabelDescriptor} LabelDescriptor
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                LabelDescriptor.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a LabelDescriptor message.
                 * @function verify
                 * @memberof google.api.LabelDescriptor
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                LabelDescriptor.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.key != null && message.hasOwnProperty("key"))
                        if (!$util.isString(message.key))
                            return "key: string expected";
                    if (message.valueType != null && message.hasOwnProperty("valueType"))
                        switch (message.valueType) {
                        default:
                            return "valueType: enum value expected";
                        case 0:
                        case 1:
                        case 2:
                            break;
                        }
                    if (message.description != null && message.hasOwnProperty("description"))
                        if (!$util.isString(message.description))
                            return "description: string expected";
                    return null;
                };
    
                /**
                 * Creates a LabelDescriptor message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.LabelDescriptor
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.LabelDescriptor} LabelDescriptor
                 */
                LabelDescriptor.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.LabelDescriptor)
                        return object;
                    var message = new $root.google.api.LabelDescriptor();
                    if (object.key != null)
                        message.key = String(object.key);
                    switch (object.valueType) {
                    case "STRING":
                    case 0:
                        message.valueType = 0;
                        break;
                    case "BOOL":
                    case 1:
                        message.valueType = 1;
                        break;
                    case "INT64":
                    case 2:
                        message.valueType = 2;
                        break;
                    }
                    if (object.description != null)
                        message.description = String(object.description);
                    return message;
                };
    
                /**
                 * Creates a plain object from a LabelDescriptor message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.LabelDescriptor
                 * @static
                 * @param {google.api.LabelDescriptor} message LabelDescriptor
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                LabelDescriptor.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.key = "";
                        object.valueType = options.enums === String ? "STRING" : 0;
                        object.description = "";
                    }
                    if (message.key != null && message.hasOwnProperty("key"))
                        object.key = message.key;
                    if (message.valueType != null && message.hasOwnProperty("valueType"))
                        object.valueType = options.enums === String ? $root.google.api.LabelDescriptor.ValueType[message.valueType] : message.valueType;
                    if (message.description != null && message.hasOwnProperty("description"))
                        object.description = message.description;
                    return object;
                };
    
                /**
                 * Converts this LabelDescriptor to JSON.
                 * @function toJSON
                 * @memberof google.api.LabelDescriptor
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                LabelDescriptor.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * ValueType enum.
                 * @name google.api.LabelDescriptor.ValueType
                 * @enum {number}
                 * @property {number} STRING=0 STRING value
                 * @property {number} BOOL=1 BOOL value
                 * @property {number} INT64=2 INT64 value
                 */
                LabelDescriptor.ValueType = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "STRING"] = 0;
                    values[valuesById[1] = "BOOL"] = 1;
                    values[valuesById[2] = "INT64"] = 2;
                    return values;
                })();
    
                return LabelDescriptor;
            })();
    
            /**
             * LaunchStage enum.
             * @name google.api.LaunchStage
             * @enum {number}
             * @property {number} LAUNCH_STAGE_UNSPECIFIED=0 LAUNCH_STAGE_UNSPECIFIED value
             * @property {number} UNIMPLEMENTED=6 UNIMPLEMENTED value
             * @property {number} PRELAUNCH=7 PRELAUNCH value
             * @property {number} EARLY_ACCESS=1 EARLY_ACCESS value
             * @property {number} ALPHA=2 ALPHA value
             * @property {number} BETA=3 BETA value
             * @property {number} GA=4 GA value
             * @property {number} DEPRECATED=5 DEPRECATED value
             */
            api.LaunchStage = (function() {
                var valuesById = {}, values = Object.create(valuesById);
                values[valuesById[0] = "LAUNCH_STAGE_UNSPECIFIED"] = 0;
                values[valuesById[6] = "UNIMPLEMENTED"] = 6;
                values[valuesById[7] = "PRELAUNCH"] = 7;
                values[valuesById[1] = "EARLY_ACCESS"] = 1;
                values[valuesById[2] = "ALPHA"] = 2;
                values[valuesById[3] = "BETA"] = 3;
                values[valuesById[4] = "GA"] = 4;
                values[valuesById[5] = "DEPRECATED"] = 5;
                return values;
            })();
    
            api.ResourceDescriptor = (function() {
    
                /**
                 * Properties of a ResourceDescriptor.
                 * @memberof google.api
                 * @interface IResourceDescriptor
                 * @property {string|null} [type] ResourceDescriptor type
                 * @property {Array.<string>|null} [pattern] ResourceDescriptor pattern
                 * @property {string|null} [nameField] ResourceDescriptor nameField
                 * @property {google.api.ResourceDescriptor.History|null} [history] ResourceDescriptor history
                 * @property {string|null} [plural] ResourceDescriptor plural
                 * @property {string|null} [singular] ResourceDescriptor singular
                 * @property {Array.<google.api.ResourceDescriptor.Style>|null} [style] ResourceDescriptor style
                 */
    
                /**
                 * Constructs a new ResourceDescriptor.
                 * @memberof google.api
                 * @classdesc Represents a ResourceDescriptor.
                 * @implements IResourceDescriptor
                 * @constructor
                 * @param {google.api.IResourceDescriptor=} [properties] Properties to set
                 */
                function ResourceDescriptor(properties) {
                    this.pattern = [];
                    this.style = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * ResourceDescriptor type.
                 * @member {string} type
                 * @memberof google.api.ResourceDescriptor
                 * @instance
                 */
                ResourceDescriptor.prototype.type = "";
    
                /**
                 * ResourceDescriptor pattern.
                 * @member {Array.<string>} pattern
                 * @memberof google.api.ResourceDescriptor
                 * @instance
                 */
                ResourceDescriptor.prototype.pattern = $util.emptyArray;
    
                /**
                 * ResourceDescriptor nameField.
                 * @member {string} nameField
                 * @memberof google.api.ResourceDescriptor
                 * @instance
                 */
                ResourceDescriptor.prototype.nameField = "";
    
                /**
                 * ResourceDescriptor history.
                 * @member {google.api.ResourceDescriptor.History} history
                 * @memberof google.api.ResourceDescriptor
                 * @instance
                 */
                ResourceDescriptor.prototype.history = 0;
    
                /**
                 * ResourceDescriptor plural.
                 * @member {string} plural
                 * @memberof google.api.ResourceDescriptor
                 * @instance
                 */
                ResourceDescriptor.prototype.plural = "";
    
                /**
                 * ResourceDescriptor singular.
                 * @member {string} singular
                 * @memberof google.api.ResourceDescriptor
                 * @instance
                 */
                ResourceDescriptor.prototype.singular = "";
    
                /**
                 * ResourceDescriptor style.
                 * @member {Array.<google.api.ResourceDescriptor.Style>} style
                 * @memberof google.api.ResourceDescriptor
                 * @instance
                 */
                ResourceDescriptor.prototype.style = $util.emptyArray;
    
                /**
                 * Creates a new ResourceDescriptor instance using the specified properties.
                 * @function create
                 * @memberof google.api.ResourceDescriptor
                 * @static
                 * @param {google.api.IResourceDescriptor=} [properties] Properties to set
                 * @returns {google.api.ResourceDescriptor} ResourceDescriptor instance
                 */
                ResourceDescriptor.create = function create(properties) {
                    return new ResourceDescriptor(properties);
                };
    
                /**
                 * Encodes the specified ResourceDescriptor message. Does not implicitly {@link google.api.ResourceDescriptor.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.ResourceDescriptor
                 * @static
                 * @param {google.api.IResourceDescriptor} message ResourceDescriptor message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ResourceDescriptor.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
                    if (message.pattern != null && message.pattern.length)
                        for (var i = 0; i < message.pattern.length; ++i)
                            writer.uint32(/* id 2, wireType 2 =*/18).string(message.pattern[i]);
                    if (message.nameField != null && Object.hasOwnProperty.call(message, "nameField"))
                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.nameField);
                    if (message.history != null && Object.hasOwnProperty.call(message, "history"))
                        writer.uint32(/* id 4, wireType 0 =*/32).int32(message.history);
                    if (message.plural != null && Object.hasOwnProperty.call(message, "plural"))
                        writer.uint32(/* id 5, wireType 2 =*/42).string(message.plural);
                    if (message.singular != null && Object.hasOwnProperty.call(message, "singular"))
                        writer.uint32(/* id 6, wireType 2 =*/50).string(message.singular);
                    if (message.style != null && message.style.length) {
                        writer.uint32(/* id 10, wireType 2 =*/82).fork();
                        for (var i = 0; i < message.style.length; ++i)
                            writer.int32(message.style[i]);
                        writer.ldelim();
                    }
                    return writer;
                };
    
                /**
                 * Encodes the specified ResourceDescriptor message, length delimited. Does not implicitly {@link google.api.ResourceDescriptor.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.ResourceDescriptor
                 * @static
                 * @param {google.api.IResourceDescriptor} message ResourceDescriptor message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ResourceDescriptor.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a ResourceDescriptor message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.ResourceDescriptor
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.ResourceDescriptor} ResourceDescriptor
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ResourceDescriptor.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.ResourceDescriptor();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.type = reader.string();
                            break;
                        case 2:
                            if (!(message.pattern && message.pattern.length))
                                message.pattern = [];
                            message.pattern.push(reader.string());
                            break;
                        case 3:
                            message.nameField = reader.string();
                            break;
                        case 4:
                            message.history = reader.int32();
                            break;
                        case 5:
                            message.plural = reader.string();
                            break;
                        case 6:
                            message.singular = reader.string();
                            break;
                        case 10:
                            if (!(message.style && message.style.length))
                                message.style = [];
                            if ((tag & 7) === 2) {
                                var end2 = reader.uint32() + reader.pos;
                                while (reader.pos < end2)
                                    message.style.push(reader.int32());
                            } else
                                message.style.push(reader.int32());
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a ResourceDescriptor message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.ResourceDescriptor
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.ResourceDescriptor} ResourceDescriptor
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ResourceDescriptor.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a ResourceDescriptor message.
                 * @function verify
                 * @memberof google.api.ResourceDescriptor
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                ResourceDescriptor.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.type != null && message.hasOwnProperty("type"))
                        if (!$util.isString(message.type))
                            return "type: string expected";
                    if (message.pattern != null && message.hasOwnProperty("pattern")) {
                        if (!Array.isArray(message.pattern))
                            return "pattern: array expected";
                        for (var i = 0; i < message.pattern.length; ++i)
                            if (!$util.isString(message.pattern[i]))
                                return "pattern: string[] expected";
                    }
                    if (message.nameField != null && message.hasOwnProperty("nameField"))
                        if (!$util.isString(message.nameField))
                            return "nameField: string expected";
                    if (message.history != null && message.hasOwnProperty("history"))
                        switch (message.history) {
                        default:
                            return "history: enum value expected";
                        case 0:
                        case 1:
                        case 2:
                            break;
                        }
                    if (message.plural != null && message.hasOwnProperty("plural"))
                        if (!$util.isString(message.plural))
                            return "plural: string expected";
                    if (message.singular != null && message.hasOwnProperty("singular"))
                        if (!$util.isString(message.singular))
                            return "singular: string expected";
                    if (message.style != null && message.hasOwnProperty("style")) {
                        if (!Array.isArray(message.style))
                            return "style: array expected";
                        for (var i = 0; i < message.style.length; ++i)
                            switch (message.style[i]) {
                            default:
                                return "style: enum value[] expected";
                            case 0:
                            case 1:
                                break;
                            }
                    }
                    return null;
                };
    
                /**
                 * Creates a ResourceDescriptor message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.ResourceDescriptor
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.ResourceDescriptor} ResourceDescriptor
                 */
                ResourceDescriptor.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.ResourceDescriptor)
                        return object;
                    var message = new $root.google.api.ResourceDescriptor();
                    if (object.type != null)
                        message.type = String(object.type);
                    if (object.pattern) {
                        if (!Array.isArray(object.pattern))
                            throw TypeError(".google.api.ResourceDescriptor.pattern: array expected");
                        message.pattern = [];
                        for (var i = 0; i < object.pattern.length; ++i)
                            message.pattern[i] = String(object.pattern[i]);
                    }
                    if (object.nameField != null)
                        message.nameField = String(object.nameField);
                    switch (object.history) {
                    case "HISTORY_UNSPECIFIED":
                    case 0:
                        message.history = 0;
                        break;
                    case "ORIGINALLY_SINGLE_PATTERN":
                    case 1:
                        message.history = 1;
                        break;
                    case "FUTURE_MULTI_PATTERN":
                    case 2:
                        message.history = 2;
                        break;
                    }
                    if (object.plural != null)
                        message.plural = String(object.plural);
                    if (object.singular != null)
                        message.singular = String(object.singular);
                    if (object.style) {
                        if (!Array.isArray(object.style))
                            throw TypeError(".google.api.ResourceDescriptor.style: array expected");
                        message.style = [];
                        for (var i = 0; i < object.style.length; ++i)
                            switch (object.style[i]) {
                            default:
                            case "STYLE_UNSPECIFIED":
                            case 0:
                                message.style[i] = 0;
                                break;
                            case "DECLARATIVE_FRIENDLY":
                            case 1:
                                message.style[i] = 1;
                                break;
                            }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a ResourceDescriptor message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.ResourceDescriptor
                 * @static
                 * @param {google.api.ResourceDescriptor} message ResourceDescriptor
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                ResourceDescriptor.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults) {
                        object.pattern = [];
                        object.style = [];
                    }
                    if (options.defaults) {
                        object.type = "";
                        object.nameField = "";
                        object.history = options.enums === String ? "HISTORY_UNSPECIFIED" : 0;
                        object.plural = "";
                        object.singular = "";
                    }
                    if (message.type != null && message.hasOwnProperty("type"))
                        object.type = message.type;
                    if (message.pattern && message.pattern.length) {
                        object.pattern = [];
                        for (var j = 0; j < message.pattern.length; ++j)
                            object.pattern[j] = message.pattern[j];
                    }
                    if (message.nameField != null && message.hasOwnProperty("nameField"))
                        object.nameField = message.nameField;
                    if (message.history != null && message.hasOwnProperty("history"))
                        object.history = options.enums === String ? $root.google.api.ResourceDescriptor.History[message.history] : message.history;
                    if (message.plural != null && message.hasOwnProperty("plural"))
                        object.plural = message.plural;
                    if (message.singular != null && message.hasOwnProperty("singular"))
                        object.singular = message.singular;
                    if (message.style && message.style.length) {
                        object.style = [];
                        for (var j = 0; j < message.style.length; ++j)
                            object.style[j] = options.enums === String ? $root.google.api.ResourceDescriptor.Style[message.style[j]] : message.style[j];
                    }
                    return object;
                };
    
                /**
                 * Converts this ResourceDescriptor to JSON.
                 * @function toJSON
                 * @memberof google.api.ResourceDescriptor
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                ResourceDescriptor.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                /**
                 * History enum.
                 * @name google.api.ResourceDescriptor.History
                 * @enum {number}
                 * @property {number} HISTORY_UNSPECIFIED=0 HISTORY_UNSPECIFIED value
                 * @property {number} ORIGINALLY_SINGLE_PATTERN=1 ORIGINALLY_SINGLE_PATTERN value
                 * @property {number} FUTURE_MULTI_PATTERN=2 FUTURE_MULTI_PATTERN value
                 */
                ResourceDescriptor.History = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "HISTORY_UNSPECIFIED"] = 0;
                    values[valuesById[1] = "ORIGINALLY_SINGLE_PATTERN"] = 1;
                    values[valuesById[2] = "FUTURE_MULTI_PATTERN"] = 2;
                    return values;
                })();
    
                /**
                 * Style enum.
                 * @name google.api.ResourceDescriptor.Style
                 * @enum {number}
                 * @property {number} STYLE_UNSPECIFIED=0 STYLE_UNSPECIFIED value
                 * @property {number} DECLARATIVE_FRIENDLY=1 DECLARATIVE_FRIENDLY value
                 */
                ResourceDescriptor.Style = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "STYLE_UNSPECIFIED"] = 0;
                    values[valuesById[1] = "DECLARATIVE_FRIENDLY"] = 1;
                    return values;
                })();
    
                return ResourceDescriptor;
            })();
    
            api.ResourceReference = (function() {
    
                /**
                 * Properties of a ResourceReference.
                 * @memberof google.api
                 * @interface IResourceReference
                 * @property {string|null} [type] ResourceReference type
                 * @property {string|null} [childType] ResourceReference childType
                 */
    
                /**
                 * Constructs a new ResourceReference.
                 * @memberof google.api
                 * @classdesc Represents a ResourceReference.
                 * @implements IResourceReference
                 * @constructor
                 * @param {google.api.IResourceReference=} [properties] Properties to set
                 */
                function ResourceReference(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * ResourceReference type.
                 * @member {string} type
                 * @memberof google.api.ResourceReference
                 * @instance
                 */
                ResourceReference.prototype.type = "";
    
                /**
                 * ResourceReference childType.
                 * @member {string} childType
                 * @memberof google.api.ResourceReference
                 * @instance
                 */
                ResourceReference.prototype.childType = "";
    
                /**
                 * Creates a new ResourceReference instance using the specified properties.
                 * @function create
                 * @memberof google.api.ResourceReference
                 * @static
                 * @param {google.api.IResourceReference=} [properties] Properties to set
                 * @returns {google.api.ResourceReference} ResourceReference instance
                 */
                ResourceReference.create = function create(properties) {
                    return new ResourceReference(properties);
                };
    
                /**
                 * Encodes the specified ResourceReference message. Does not implicitly {@link google.api.ResourceReference.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.ResourceReference
                 * @static
                 * @param {google.api.IResourceReference} message ResourceReference message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ResourceReference.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
                    if (message.childType != null && Object.hasOwnProperty.call(message, "childType"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.childType);
                    return writer;
                };
    
                /**
                 * Encodes the specified ResourceReference message, length delimited. Does not implicitly {@link google.api.ResourceReference.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.ResourceReference
                 * @static
                 * @param {google.api.IResourceReference} message ResourceReference message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ResourceReference.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a ResourceReference message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.ResourceReference
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.ResourceReference} ResourceReference
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ResourceReference.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.ResourceReference();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.type = reader.string();
                            break;
                        case 2:
                            message.childType = reader.string();
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a ResourceReference message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.ResourceReference
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.ResourceReference} ResourceReference
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ResourceReference.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a ResourceReference message.
                 * @function verify
                 * @memberof google.api.ResourceReference
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                ResourceReference.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.type != null && message.hasOwnProperty("type"))
                        if (!$util.isString(message.type))
                            return "type: string expected";
                    if (message.childType != null && message.hasOwnProperty("childType"))
                        if (!$util.isString(message.childType))
                            return "childType: string expected";
                    return null;
                };
    
                /**
                 * Creates a ResourceReference message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.ResourceReference
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.ResourceReference} ResourceReference
                 */
                ResourceReference.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.ResourceReference)
                        return object;
                    var message = new $root.google.api.ResourceReference();
                    if (object.type != null)
                        message.type = String(object.type);
                    if (object.childType != null)
                        message.childType = String(object.childType);
                    return message;
                };
    
                /**
                 * Creates a plain object from a ResourceReference message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.ResourceReference
                 * @static
                 * @param {google.api.ResourceReference} message ResourceReference
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                ResourceReference.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.type = "";
                        object.childType = "";
                    }
                    if (message.type != null && message.hasOwnProperty("type"))
                        object.type = message.type;
                    if (message.childType != null && message.hasOwnProperty("childType"))
                        object.childType = message.childType;
                    return object;
                };
    
                /**
                 * Converts this ResourceReference to JSON.
                 * @function toJSON
                 * @memberof google.api.ResourceReference
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                ResourceReference.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return ResourceReference;
            })();
    
            api.Distribution = (function() {
    
                /**
                 * Properties of a Distribution.
                 * @memberof google.api
                 * @interface IDistribution
                 * @property {number|Long|null} [count] Distribution count
                 * @property {number|null} [mean] Distribution mean
                 * @property {number|null} [sumOfSquaredDeviation] Distribution sumOfSquaredDeviation
                 * @property {google.api.Distribution.IRange|null} [range] Distribution range
                 * @property {google.api.Distribution.IBucketOptions|null} [bucketOptions] Distribution bucketOptions
                 * @property {Array.<number|Long>|null} [bucketCounts] Distribution bucketCounts
                 * @property {Array.<google.api.Distribution.IExemplar>|null} [exemplars] Distribution exemplars
                 */
    
                /**
                 * Constructs a new Distribution.
                 * @memberof google.api
                 * @classdesc Represents a Distribution.
                 * @implements IDistribution
                 * @constructor
                 * @param {google.api.IDistribution=} [properties] Properties to set
                 */
                function Distribution(properties) {
                    this.bucketCounts = [];
                    this.exemplars = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * Distribution count.
                 * @member {number|Long} count
                 * @memberof google.api.Distribution
                 * @instance
                 */
                Distribution.prototype.count = $util.Long ? $util.Long.fromBits(0,0,false) : 0;
    
                /**
                 * Distribution mean.
                 * @member {number} mean
                 * @memberof google.api.Distribution
                 * @instance
                 */
                Distribution.prototype.mean = 0;
    
                /**
                 * Distribution sumOfSquaredDeviation.
                 * @member {number} sumOfSquaredDeviation
                 * @memberof google.api.Distribution
                 * @instance
                 */
                Distribution.prototype.sumOfSquaredDeviation = 0;
    
                /**
                 * Distribution range.
                 * @member {google.api.Distribution.IRange|null|undefined} range
                 * @memberof google.api.Distribution
                 * @instance
                 */
                Distribution.prototype.range = null;
    
                /**
                 * Distribution bucketOptions.
                 * @member {google.api.Distribution.IBucketOptions|null|undefined} bucketOptions
                 * @memberof google.api.Distribution
                 * @instance
                 */
                Distribution.prototype.bucketOptions = null;
    
                /**
                 * Distribution bucketCounts.
                 * @member {Array.<number|Long>} bucketCounts
                 * @memberof google.api.Distribution
                 * @instance
                 */
                Distribution.prototype.bucketCounts = $util.emptyArray;
    
                /**
                 * Distribution exemplars.
                 * @member {Array.<google.api.Distribution.IExemplar>} exemplars
                 * @memberof google.api.Distribution
                 * @instance
                 */
                Distribution.prototype.exemplars = $util.emptyArray;
    
                /**
                 * Creates a new Distribution instance using the specified properties.
                 * @function create
                 * @memberof google.api.Distribution
                 * @static
                 * @param {google.api.IDistribution=} [properties] Properties to set
                 * @returns {google.api.Distribution} Distribution instance
                 */
                Distribution.create = function create(properties) {
                    return new Distribution(properties);
                };
    
                /**
                 * Encodes the specified Distribution message. Does not implicitly {@link google.api.Distribution.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.Distribution
                 * @static
                 * @param {google.api.IDistribution} message Distribution message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Distribution.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.count != null && Object.hasOwnProperty.call(message, "count"))
                        writer.uint32(/* id 1, wireType 0 =*/8).int64(message.count);
                    if (message.mean != null && Object.hasOwnProperty.call(message, "mean"))
                        writer.uint32(/* id 2, wireType 1 =*/17).double(message.mean);
                    if (message.sumOfSquaredDeviation != null && Object.hasOwnProperty.call(message, "sumOfSquaredDeviation"))
                        writer.uint32(/* id 3, wireType 1 =*/25).double(message.sumOfSquaredDeviation);
                    if (message.range != null && Object.hasOwnProperty.call(message, "range"))
                        $root.google.api.Distribution.Range.encode(message.range, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                    if (message.bucketOptions != null && Object.hasOwnProperty.call(message, "bucketOptions"))
                        $root.google.api.Distribution.BucketOptions.encode(message.bucketOptions, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                    if (message.bucketCounts != null && message.bucketCounts.length) {
                        writer.uint32(/* id 7, wireType 2 =*/58).fork();
                        for (var i = 0; i < message.bucketCounts.length; ++i)
                            writer.int64(message.bucketCounts[i]);
                        writer.ldelim();
                    }
                    if (message.exemplars != null && message.exemplars.length)
                        for (var i = 0; i < message.exemplars.length; ++i)
                            $root.google.api.Distribution.Exemplar.encode(message.exemplars[i], writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified Distribution message, length delimited. Does not implicitly {@link google.api.Distribution.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.Distribution
                 * @static
                 * @param {google.api.IDistribution} message Distribution message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Distribution.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a Distribution message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.Distribution
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.Distribution} Distribution
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Distribution.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.Distribution();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.count = reader.int64();
                            break;
                        case 2:
                            message.mean = reader.double();
                            break;
                        case 3:
                            message.sumOfSquaredDeviation = reader.double();
                            break;
                        case 4:
                            message.range = $root.google.api.Distribution.Range.decode(reader, reader.uint32());
                            break;
                        case 6:
                            message.bucketOptions = $root.google.api.Distribution.BucketOptions.decode(reader, reader.uint32());
                            break;
                        case 7:
                            if (!(message.bucketCounts && message.bucketCounts.length))
                                message.bucketCounts = [];
                            if ((tag & 7) === 2) {
                                var end2 = reader.uint32() + reader.pos;
                                while (reader.pos < end2)
                                    message.bucketCounts.push(reader.int64());
                            } else
                                message.bucketCounts.push(reader.int64());
                            break;
                        case 10:
                            if (!(message.exemplars && message.exemplars.length))
                                message.exemplars = [];
                            message.exemplars.push($root.google.api.Distribution.Exemplar.decode(reader, reader.uint32()));
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a Distribution message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.Distribution
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.Distribution} Distribution
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Distribution.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a Distribution message.
                 * @function verify
                 * @memberof google.api.Distribution
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                Distribution.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.count != null && message.hasOwnProperty("count"))
                        if (!$util.isInteger(message.count) && !(message.count && $util.isInteger(message.count.low) && $util.isInteger(message.count.high)))
                            return "count: integer|Long expected";
                    if (message.mean != null && message.hasOwnProperty("mean"))
                        if (typeof message.mean !== "number")
                            return "mean: number expected";
                    if (message.sumOfSquaredDeviation != null && message.hasOwnProperty("sumOfSquaredDeviation"))
                        if (typeof message.sumOfSquaredDeviation !== "number")
                            return "sumOfSquaredDeviation: number expected";
                    if (message.range != null && message.hasOwnProperty("range")) {
                        var error = $root.google.api.Distribution.Range.verify(message.range);
                        if (error)
                            return "range." + error;
                    }
                    if (message.bucketOptions != null && message.hasOwnProperty("bucketOptions")) {
                        var error = $root.google.api.Distribution.BucketOptions.verify(message.bucketOptions);
                        if (error)
                            return "bucketOptions." + error;
                    }
                    if (message.bucketCounts != null && message.hasOwnProperty("bucketCounts")) {
                        if (!Array.isArray(message.bucketCounts))
                            return "bucketCounts: array expected";
                        for (var i = 0; i < message.bucketCounts.length; ++i)
                            if (!$util.isInteger(message.bucketCounts[i]) && !(message.bucketCounts[i] && $util.isInteger(message.bucketCounts[i].low) && $util.isInteger(message.bucketCounts[i].high)))
                                return "bucketCounts: integer|Long[] expected";
                    }
                    if (message.exemplars != null && message.hasOwnProperty("exemplars")) {
                        if (!Array.isArray(message.exemplars))
                            return "exemplars: array expected";
                        for (var i = 0; i < message.exemplars.length; ++i) {
                            var error = $root.google.api.Distribution.Exemplar.verify(message.exemplars[i]);
                            if (error)
                                return "exemplars." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates a Distribution message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.Distribution
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.Distribution} Distribution
                 */
                Distribution.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.Distribution)
                        return object;
                    var message = new $root.google.api.Distribution();
                    if (object.count != null)
                        if ($util.Long)
                            (message.count = $util.Long.fromValue(object.count)).unsigned = false;
                        else if (typeof object.count === "string")
                            message.count = parseInt(object.count, 10);
                        else if (typeof object.count === "number")
                            message.count = object.count;
                        else if (typeof object.count === "object")
                            message.count = new $util.LongBits(object.count.low >>> 0, object.count.high >>> 0).toNumber();
                    if (object.mean != null)
                        message.mean = Number(object.mean);
                    if (object.sumOfSquaredDeviation != null)
                        message.sumOfSquaredDeviation = Number(object.sumOfSquaredDeviation);
                    if (object.range != null) {
                        if (typeof object.range !== "object")
                            throw TypeError(".google.api.Distribution.range: object expected");
                        message.range = $root.google.api.Distribution.Range.fromObject(object.range);
                    }
                    if (object.bucketOptions != null) {
                        if (typeof object.bucketOptions !== "object")
                            throw TypeError(".google.api.Distribution.bucketOptions: object expected");
                        message.bucketOptions = $root.google.api.Distribution.BucketOptions.fromObject(object.bucketOptions);
                    }
                    if (object.bucketCounts) {
                        if (!Array.isArray(object.bucketCounts))
                            throw TypeError(".google.api.Distribution.bucketCounts: array expected");
                        message.bucketCounts = [];
                        for (var i = 0; i < object.bucketCounts.length; ++i)
                            if ($util.Long)
                                (message.bucketCounts[i] = $util.Long.fromValue(object.bucketCounts[i])).unsigned = false;
                            else if (typeof object.bucketCounts[i] === "string")
                                message.bucketCounts[i] = parseInt(object.bucketCounts[i], 10);
                            else if (typeof object.bucketCounts[i] === "number")
                                message.bucketCounts[i] = object.bucketCounts[i];
                            else if (typeof object.bucketCounts[i] === "object")
                                message.bucketCounts[i] = new $util.LongBits(object.bucketCounts[i].low >>> 0, object.bucketCounts[i].high >>> 0).toNumber();
                    }
                    if (object.exemplars) {
                        if (!Array.isArray(object.exemplars))
                            throw TypeError(".google.api.Distribution.exemplars: array expected");
                        message.exemplars = [];
                        for (var i = 0; i < object.exemplars.length; ++i) {
                            if (typeof object.exemplars[i] !== "object")
                                throw TypeError(".google.api.Distribution.exemplars: object expected");
                            message.exemplars[i] = $root.google.api.Distribution.Exemplar.fromObject(object.exemplars[i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a Distribution message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.Distribution
                 * @static
                 * @param {google.api.Distribution} message Distribution
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                Distribution.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults) {
                        object.bucketCounts = [];
                        object.exemplars = [];
                    }
                    if (options.defaults) {
                        if ($util.Long) {
                            var long = new $util.Long(0, 0, false);
                            object.count = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
                        } else
                            object.count = options.longs === String ? "0" : 0;
                        object.mean = 0;
                        object.sumOfSquaredDeviation = 0;
                        object.range = null;
                        object.bucketOptions = null;
                    }
                    if (message.count != null && message.hasOwnProperty("count"))
                        if (typeof message.count === "number")
                            object.count = options.longs === String ? String(message.count) : message.count;
                        else
                            object.count = options.longs === String ? $util.Long.prototype.toString.call(message.count) : options.longs === Number ? new $util.LongBits(message.count.low >>> 0, message.count.high >>> 0).toNumber() : message.count;
                    if (message.mean != null && message.hasOwnProperty("mean"))
                        object.mean = options.json && !isFinite(message.mean) ? String(message.mean) : message.mean;
                    if (message.sumOfSquaredDeviation != null && message.hasOwnProperty("sumOfSquaredDeviation"))
                        object.sumOfSquaredDeviation = options.json && !isFinite(message.sumOfSquaredDeviation) ? String(message.sumOfSquaredDeviation) : message.sumOfSquaredDeviation;
                    if (message.range != null && message.hasOwnProperty("range"))
                        object.range = $root.google.api.Distribution.Range.toObject(message.range, options);
                    if (message.bucketOptions != null && message.hasOwnProperty("bucketOptions"))
                        object.bucketOptions = $root.google.api.Distribution.BucketOptions.toObject(message.bucketOptions, options);
                    if (message.bucketCounts && message.bucketCounts.length) {
                        object.bucketCounts = [];
                        for (var j = 0; j < message.bucketCounts.length; ++j)
                            if (typeof message.bucketCounts[j] === "number")
                                object.bucketCounts[j] = options.longs === String ? String(message.bucketCounts[j]) : message.bucketCounts[j];
                            else
                                object.bucketCounts[j] = options.longs === String ? $util.Long.prototype.toString.call(message.bucketCounts[j]) : options.longs === Number ? new $util.LongBits(message.bucketCounts[j].low >>> 0, message.bucketCounts[j].high >>> 0).toNumber() : message.bucketCounts[j];
                    }
                    if (message.exemplars && message.exemplars.length) {
                        object.exemplars = [];
                        for (var j = 0; j < message.exemplars.length; ++j)
                            object.exemplars[j] = $root.google.api.Distribution.Exemplar.toObject(message.exemplars[j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this Distribution to JSON.
                 * @function toJSON
                 * @memberof google.api.Distribution
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                Distribution.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                Distribution.Range = (function() {
    
                    /**
                     * Properties of a Range.
                     * @memberof google.api.Distribution
                     * @interface IRange
                     * @property {number|null} [min] Range min
                     * @property {number|null} [max] Range max
                     */
    
                    /**
                     * Constructs a new Range.
                     * @memberof google.api.Distribution
                     * @classdesc Represents a Range.
                     * @implements IRange
                     * @constructor
                     * @param {google.api.Distribution.IRange=} [properties] Properties to set
                     */
                    function Range(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * Range min.
                     * @member {number} min
                     * @memberof google.api.Distribution.Range
                     * @instance
                     */
                    Range.prototype.min = 0;
    
                    /**
                     * Range max.
                     * @member {number} max
                     * @memberof google.api.Distribution.Range
                     * @instance
                     */
                    Range.prototype.max = 0;
    
                    /**
                     * Creates a new Range instance using the specified properties.
                     * @function create
                     * @memberof google.api.Distribution.Range
                     * @static
                     * @param {google.api.Distribution.IRange=} [properties] Properties to set
                     * @returns {google.api.Distribution.Range} Range instance
                     */
                    Range.create = function create(properties) {
                        return new Range(properties);
                    };
    
                    /**
                     * Encodes the specified Range message. Does not implicitly {@link google.api.Distribution.Range.verify|verify} messages.
                     * @function encode
                     * @memberof google.api.Distribution.Range
                     * @static
                     * @param {google.api.Distribution.IRange} message Range message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Range.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.min != null && Object.hasOwnProperty.call(message, "min"))
                            writer.uint32(/* id 1, wireType 1 =*/9).double(message.min);
                        if (message.max != null && Object.hasOwnProperty.call(message, "max"))
                            writer.uint32(/* id 2, wireType 1 =*/17).double(message.max);
                        return writer;
                    };
    
                    /**
                     * Encodes the specified Range message, length delimited. Does not implicitly {@link google.api.Distribution.Range.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.api.Distribution.Range
                     * @static
                     * @param {google.api.Distribution.IRange} message Range message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Range.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a Range message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.api.Distribution.Range
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.api.Distribution.Range} Range
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Range.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.Distribution.Range();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.min = reader.double();
                                break;
                            case 2:
                                message.max = reader.double();
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a Range message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.api.Distribution.Range
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.api.Distribution.Range} Range
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Range.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a Range message.
                     * @function verify
                     * @memberof google.api.Distribution.Range
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    Range.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.min != null && message.hasOwnProperty("min"))
                            if (typeof message.min !== "number")
                                return "min: number expected";
                        if (message.max != null && message.hasOwnProperty("max"))
                            if (typeof message.max !== "number")
                                return "max: number expected";
                        return null;
                    };
    
                    /**
                     * Creates a Range message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.api.Distribution.Range
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.api.Distribution.Range} Range
                     */
                    Range.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.api.Distribution.Range)
                            return object;
                        var message = new $root.google.api.Distribution.Range();
                        if (object.min != null)
                            message.min = Number(object.min);
                        if (object.max != null)
                            message.max = Number(object.max);
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a Range message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.api.Distribution.Range
                     * @static
                     * @param {google.api.Distribution.Range} message Range
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    Range.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.min = 0;
                            object.max = 0;
                        }
                        if (message.min != null && message.hasOwnProperty("min"))
                            object.min = options.json && !isFinite(message.min) ? String(message.min) : message.min;
                        if (message.max != null && message.hasOwnProperty("max"))
                            object.max = options.json && !isFinite(message.max) ? String(message.max) : message.max;
                        return object;
                    };
    
                    /**
                     * Converts this Range to JSON.
                     * @function toJSON
                     * @memberof google.api.Distribution.Range
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    Range.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return Range;
                })();
    
                Distribution.BucketOptions = (function() {
    
                    /**
                     * Properties of a BucketOptions.
                     * @memberof google.api.Distribution
                     * @interface IBucketOptions
                     * @property {google.api.Distribution.BucketOptions.ILinear|null} [linearBuckets] BucketOptions linearBuckets
                     * @property {google.api.Distribution.BucketOptions.IExponential|null} [exponentialBuckets] BucketOptions exponentialBuckets
                     * @property {google.api.Distribution.BucketOptions.IExplicit|null} [explicitBuckets] BucketOptions explicitBuckets
                     */
    
                    /**
                     * Constructs a new BucketOptions.
                     * @memberof google.api.Distribution
                     * @classdesc Represents a BucketOptions.
                     * @implements IBucketOptions
                     * @constructor
                     * @param {google.api.Distribution.IBucketOptions=} [properties] Properties to set
                     */
                    function BucketOptions(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * BucketOptions linearBuckets.
                     * @member {google.api.Distribution.BucketOptions.ILinear|null|undefined} linearBuckets
                     * @memberof google.api.Distribution.BucketOptions
                     * @instance
                     */
                    BucketOptions.prototype.linearBuckets = null;
    
                    /**
                     * BucketOptions exponentialBuckets.
                     * @member {google.api.Distribution.BucketOptions.IExponential|null|undefined} exponentialBuckets
                     * @memberof google.api.Distribution.BucketOptions
                     * @instance
                     */
                    BucketOptions.prototype.exponentialBuckets = null;
    
                    /**
                     * BucketOptions explicitBuckets.
                     * @member {google.api.Distribution.BucketOptions.IExplicit|null|undefined} explicitBuckets
                     * @memberof google.api.Distribution.BucketOptions
                     * @instance
                     */
                    BucketOptions.prototype.explicitBuckets = null;
    
                    // OneOf field names bound to virtual getters and setters
                    var $oneOfFields;
    
                    /**
                     * BucketOptions options.
                     * @member {"linearBuckets"|"exponentialBuckets"|"explicitBuckets"|undefined} options
                     * @memberof google.api.Distribution.BucketOptions
                     * @instance
                     */
                    Object.defineProperty(BucketOptions.prototype, "options", {
                        get: $util.oneOfGetter($oneOfFields = ["linearBuckets", "exponentialBuckets", "explicitBuckets"]),
                        set: $util.oneOfSetter($oneOfFields)
                    });
    
                    /**
                     * Creates a new BucketOptions instance using the specified properties.
                     * @function create
                     * @memberof google.api.Distribution.BucketOptions
                     * @static
                     * @param {google.api.Distribution.IBucketOptions=} [properties] Properties to set
                     * @returns {google.api.Distribution.BucketOptions} BucketOptions instance
                     */
                    BucketOptions.create = function create(properties) {
                        return new BucketOptions(properties);
                    };
    
                    /**
                     * Encodes the specified BucketOptions message. Does not implicitly {@link google.api.Distribution.BucketOptions.verify|verify} messages.
                     * @function encode
                     * @memberof google.api.Distribution.BucketOptions
                     * @static
                     * @param {google.api.Distribution.IBucketOptions} message BucketOptions message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    BucketOptions.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.linearBuckets != null && Object.hasOwnProperty.call(message, "linearBuckets"))
                            $root.google.api.Distribution.BucketOptions.Linear.encode(message.linearBuckets, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                        if (message.exponentialBuckets != null && Object.hasOwnProperty.call(message, "exponentialBuckets"))
                            $root.google.api.Distribution.BucketOptions.Exponential.encode(message.exponentialBuckets, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.explicitBuckets != null && Object.hasOwnProperty.call(message, "explicitBuckets"))
                            $root.google.api.Distribution.BucketOptions.Explicit.encode(message.explicitBuckets, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified BucketOptions message, length delimited. Does not implicitly {@link google.api.Distribution.BucketOptions.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.api.Distribution.BucketOptions
                     * @static
                     * @param {google.api.Distribution.IBucketOptions} message BucketOptions message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    BucketOptions.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a BucketOptions message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.api.Distribution.BucketOptions
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.api.Distribution.BucketOptions} BucketOptions
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    BucketOptions.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.Distribution.BucketOptions();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.linearBuckets = $root.google.api.Distribution.BucketOptions.Linear.decode(reader, reader.uint32());
                                break;
                            case 2:
                                message.exponentialBuckets = $root.google.api.Distribution.BucketOptions.Exponential.decode(reader, reader.uint32());
                                break;
                            case 3:
                                message.explicitBuckets = $root.google.api.Distribution.BucketOptions.Explicit.decode(reader, reader.uint32());
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a BucketOptions message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.api.Distribution.BucketOptions
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.api.Distribution.BucketOptions} BucketOptions
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    BucketOptions.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a BucketOptions message.
                     * @function verify
                     * @memberof google.api.Distribution.BucketOptions
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    BucketOptions.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        var properties = {};
                        if (message.linearBuckets != null && message.hasOwnProperty("linearBuckets")) {
                            properties.options = 1;
                            {
                                var error = $root.google.api.Distribution.BucketOptions.Linear.verify(message.linearBuckets);
                                if (error)
                                    return "linearBuckets." + error;
                            }
                        }
                        if (message.exponentialBuckets != null && message.hasOwnProperty("exponentialBuckets")) {
                            if (properties.options === 1)
                                return "options: multiple values";
                            properties.options = 1;
                            {
                                var error = $root.google.api.Distribution.BucketOptions.Exponential.verify(message.exponentialBuckets);
                                if (error)
                                    return "exponentialBuckets." + error;
                            }
                        }
                        if (message.explicitBuckets != null && message.hasOwnProperty("explicitBuckets")) {
                            if (properties.options === 1)
                                return "options: multiple values";
                            properties.options = 1;
                            {
                                var error = $root.google.api.Distribution.BucketOptions.Explicit.verify(message.explicitBuckets);
                                if (error)
                                    return "explicitBuckets." + error;
                            }
                        }
                        return null;
                    };
    
                    /**
                     * Creates a BucketOptions message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.api.Distribution.BucketOptions
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.api.Distribution.BucketOptions} BucketOptions
                     */
                    BucketOptions.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.api.Distribution.BucketOptions)
                            return object;
                        var message = new $root.google.api.Distribution.BucketOptions();
                        if (object.linearBuckets != null) {
                            if (typeof object.linearBuckets !== "object")
                                throw TypeError(".google.api.Distribution.BucketOptions.linearBuckets: object expected");
                            message.linearBuckets = $root.google.api.Distribution.BucketOptions.Linear.fromObject(object.linearBuckets);
                        }
                        if (object.exponentialBuckets != null) {
                            if (typeof object.exponentialBuckets !== "object")
                                throw TypeError(".google.api.Distribution.BucketOptions.exponentialBuckets: object expected");
                            message.exponentialBuckets = $root.google.api.Distribution.BucketOptions.Exponential.fromObject(object.exponentialBuckets);
                        }
                        if (object.explicitBuckets != null) {
                            if (typeof object.explicitBuckets !== "object")
                                throw TypeError(".google.api.Distribution.BucketOptions.explicitBuckets: object expected");
                            message.explicitBuckets = $root.google.api.Distribution.BucketOptions.Explicit.fromObject(object.explicitBuckets);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a BucketOptions message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.api.Distribution.BucketOptions
                     * @static
                     * @param {google.api.Distribution.BucketOptions} message BucketOptions
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    BucketOptions.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (message.linearBuckets != null && message.hasOwnProperty("linearBuckets")) {
                            object.linearBuckets = $root.google.api.Distribution.BucketOptions.Linear.toObject(message.linearBuckets, options);
                            if (options.oneofs)
                                object.options = "linearBuckets";
                        }
                        if (message.exponentialBuckets != null && message.hasOwnProperty("exponentialBuckets")) {
                            object.exponentialBuckets = $root.google.api.Distribution.BucketOptions.Exponential.toObject(message.exponentialBuckets, options);
                            if (options.oneofs)
                                object.options = "exponentialBuckets";
                        }
                        if (message.explicitBuckets != null && message.hasOwnProperty("explicitBuckets")) {
                            object.explicitBuckets = $root.google.api.Distribution.BucketOptions.Explicit.toObject(message.explicitBuckets, options);
                            if (options.oneofs)
                                object.options = "explicitBuckets";
                        }
                        return object;
                    };
    
                    /**
                     * Converts this BucketOptions to JSON.
                     * @function toJSON
                     * @memberof google.api.Distribution.BucketOptions
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    BucketOptions.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    BucketOptions.Linear = (function() {
    
                        /**
                         * Properties of a Linear.
                         * @memberof google.api.Distribution.BucketOptions
                         * @interface ILinear
                         * @property {number|null} [numFiniteBuckets] Linear numFiniteBuckets
                         * @property {number|null} [width] Linear width
                         * @property {number|null} [offset] Linear offset
                         */
    
                        /**
                         * Constructs a new Linear.
                         * @memberof google.api.Distribution.BucketOptions
                         * @classdesc Represents a Linear.
                         * @implements ILinear
                         * @constructor
                         * @param {google.api.Distribution.BucketOptions.ILinear=} [properties] Properties to set
                         */
                        function Linear(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * Linear numFiniteBuckets.
                         * @member {number} numFiniteBuckets
                         * @memberof google.api.Distribution.BucketOptions.Linear
                         * @instance
                         */
                        Linear.prototype.numFiniteBuckets = 0;
    
                        /**
                         * Linear width.
                         * @member {number} width
                         * @memberof google.api.Distribution.BucketOptions.Linear
                         * @instance
                         */
                        Linear.prototype.width = 0;
    
                        /**
                         * Linear offset.
                         * @member {number} offset
                         * @memberof google.api.Distribution.BucketOptions.Linear
                         * @instance
                         */
                        Linear.prototype.offset = 0;
    
                        /**
                         * Creates a new Linear instance using the specified properties.
                         * @function create
                         * @memberof google.api.Distribution.BucketOptions.Linear
                         * @static
                         * @param {google.api.Distribution.BucketOptions.ILinear=} [properties] Properties to set
                         * @returns {google.api.Distribution.BucketOptions.Linear} Linear instance
                         */
                        Linear.create = function create(properties) {
                            return new Linear(properties);
                        };
    
                        /**
                         * Encodes the specified Linear message. Does not implicitly {@link google.api.Distribution.BucketOptions.Linear.verify|verify} messages.
                         * @function encode
                         * @memberof google.api.Distribution.BucketOptions.Linear
                         * @static
                         * @param {google.api.Distribution.BucketOptions.ILinear} message Linear message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        Linear.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.numFiniteBuckets != null && Object.hasOwnProperty.call(message, "numFiniteBuckets"))
                                writer.uint32(/* id 1, wireType 0 =*/8).int32(message.numFiniteBuckets);
                            if (message.width != null && Object.hasOwnProperty.call(message, "width"))
                                writer.uint32(/* id 2, wireType 1 =*/17).double(message.width);
                            if (message.offset != null && Object.hasOwnProperty.call(message, "offset"))
                                writer.uint32(/* id 3, wireType 1 =*/25).double(message.offset);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified Linear message, length delimited. Does not implicitly {@link google.api.Distribution.BucketOptions.Linear.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.api.Distribution.BucketOptions.Linear
                         * @static
                         * @param {google.api.Distribution.BucketOptions.ILinear} message Linear message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        Linear.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes a Linear message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.api.Distribution.BucketOptions.Linear
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.api.Distribution.BucketOptions.Linear} Linear
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        Linear.decode = function decode(reader, length) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.Distribution.BucketOptions.Linear();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                switch (tag >>> 3) {
                                case 1:
                                    message.numFiniteBuckets = reader.int32();
                                    break;
                                case 2:
                                    message.width = reader.double();
                                    break;
                                case 3:
                                    message.offset = reader.double();
                                    break;
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes a Linear message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.api.Distribution.BucketOptions.Linear
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.api.Distribution.BucketOptions.Linear} Linear
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        Linear.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies a Linear message.
                         * @function verify
                         * @memberof google.api.Distribution.BucketOptions.Linear
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        Linear.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.numFiniteBuckets != null && message.hasOwnProperty("numFiniteBuckets"))
                                if (!$util.isInteger(message.numFiniteBuckets))
                                    return "numFiniteBuckets: integer expected";
                            if (message.width != null && message.hasOwnProperty("width"))
                                if (typeof message.width !== "number")
                                    return "width: number expected";
                            if (message.offset != null && message.hasOwnProperty("offset"))
                                if (typeof message.offset !== "number")
                                    return "offset: number expected";
                            return null;
                        };
    
                        /**
                         * Creates a Linear message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.api.Distribution.BucketOptions.Linear
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.api.Distribution.BucketOptions.Linear} Linear
                         */
                        Linear.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.api.Distribution.BucketOptions.Linear)
                                return object;
                            var message = new $root.google.api.Distribution.BucketOptions.Linear();
                            if (object.numFiniteBuckets != null)
                                message.numFiniteBuckets = object.numFiniteBuckets | 0;
                            if (object.width != null)
                                message.width = Number(object.width);
                            if (object.offset != null)
                                message.offset = Number(object.offset);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from a Linear message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.api.Distribution.BucketOptions.Linear
                         * @static
                         * @param {google.api.Distribution.BucketOptions.Linear} message Linear
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        Linear.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.numFiniteBuckets = 0;
                                object.width = 0;
                                object.offset = 0;
                            }
                            if (message.numFiniteBuckets != null && message.hasOwnProperty("numFiniteBuckets"))
                                object.numFiniteBuckets = message.numFiniteBuckets;
                            if (message.width != null && message.hasOwnProperty("width"))
                                object.width = options.json && !isFinite(message.width) ? String(message.width) : message.width;
                            if (message.offset != null && message.hasOwnProperty("offset"))
                                object.offset = options.json && !isFinite(message.offset) ? String(message.offset) : message.offset;
                            return object;
                        };
    
                        /**
                         * Converts this Linear to JSON.
                         * @function toJSON
                         * @memberof google.api.Distribution.BucketOptions.Linear
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        Linear.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        return Linear;
                    })();
    
                    BucketOptions.Exponential = (function() {
    
                        /**
                         * Properties of an Exponential.
                         * @memberof google.api.Distribution.BucketOptions
                         * @interface IExponential
                         * @property {number|null} [numFiniteBuckets] Exponential numFiniteBuckets
                         * @property {number|null} [growthFactor] Exponential growthFactor
                         * @property {number|null} [scale] Exponential scale
                         */
    
                        /**
                         * Constructs a new Exponential.
                         * @memberof google.api.Distribution.BucketOptions
                         * @classdesc Represents an Exponential.
                         * @implements IExponential
                         * @constructor
                         * @param {google.api.Distribution.BucketOptions.IExponential=} [properties] Properties to set
                         */
                        function Exponential(properties) {
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * Exponential numFiniteBuckets.
                         * @member {number} numFiniteBuckets
                         * @memberof google.api.Distribution.BucketOptions.Exponential
                         * @instance
                         */
                        Exponential.prototype.numFiniteBuckets = 0;
    
                        /**
                         * Exponential growthFactor.
                         * @member {number} growthFactor
                         * @memberof google.api.Distribution.BucketOptions.Exponential
                         * @instance
                         */
                        Exponential.prototype.growthFactor = 0;
    
                        /**
                         * Exponential scale.
                         * @member {number} scale
                         * @memberof google.api.Distribution.BucketOptions.Exponential
                         * @instance
                         */
                        Exponential.prototype.scale = 0;
    
                        /**
                         * Creates a new Exponential instance using the specified properties.
                         * @function create
                         * @memberof google.api.Distribution.BucketOptions.Exponential
                         * @static
                         * @param {google.api.Distribution.BucketOptions.IExponential=} [properties] Properties to set
                         * @returns {google.api.Distribution.BucketOptions.Exponential} Exponential instance
                         */
                        Exponential.create = function create(properties) {
                            return new Exponential(properties);
                        };
    
                        /**
                         * Encodes the specified Exponential message. Does not implicitly {@link google.api.Distribution.BucketOptions.Exponential.verify|verify} messages.
                         * @function encode
                         * @memberof google.api.Distribution.BucketOptions.Exponential
                         * @static
                         * @param {google.api.Distribution.BucketOptions.IExponential} message Exponential message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        Exponential.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.numFiniteBuckets != null && Object.hasOwnProperty.call(message, "numFiniteBuckets"))
                                writer.uint32(/* id 1, wireType 0 =*/8).int32(message.numFiniteBuckets);
                            if (message.growthFactor != null && Object.hasOwnProperty.call(message, "growthFactor"))
                                writer.uint32(/* id 2, wireType 1 =*/17).double(message.growthFactor);
                            if (message.scale != null && Object.hasOwnProperty.call(message, "scale"))
                                writer.uint32(/* id 3, wireType 1 =*/25).double(message.scale);
                            return writer;
                        };
    
                        /**
                         * Encodes the specified Exponential message, length delimited. Does not implicitly {@link google.api.Distribution.BucketOptions.Exponential.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.api.Distribution.BucketOptions.Exponential
                         * @static
                         * @param {google.api.Distribution.BucketOptions.IExponential} message Exponential message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        Exponential.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes an Exponential message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.api.Distribution.BucketOptions.Exponential
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.api.Distribution.BucketOptions.Exponential} Exponential
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        Exponential.decode = function decode(reader, length) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.Distribution.BucketOptions.Exponential();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                switch (tag >>> 3) {
                                case 1:
                                    message.numFiniteBuckets = reader.int32();
                                    break;
                                case 2:
                                    message.growthFactor = reader.double();
                                    break;
                                case 3:
                                    message.scale = reader.double();
                                    break;
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes an Exponential message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.api.Distribution.BucketOptions.Exponential
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.api.Distribution.BucketOptions.Exponential} Exponential
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        Exponential.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies an Exponential message.
                         * @function verify
                         * @memberof google.api.Distribution.BucketOptions.Exponential
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        Exponential.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.numFiniteBuckets != null && message.hasOwnProperty("numFiniteBuckets"))
                                if (!$util.isInteger(message.numFiniteBuckets))
                                    return "numFiniteBuckets: integer expected";
                            if (message.growthFactor != null && message.hasOwnProperty("growthFactor"))
                                if (typeof message.growthFactor !== "number")
                                    return "growthFactor: number expected";
                            if (message.scale != null && message.hasOwnProperty("scale"))
                                if (typeof message.scale !== "number")
                                    return "scale: number expected";
                            return null;
                        };
    
                        /**
                         * Creates an Exponential message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.api.Distribution.BucketOptions.Exponential
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.api.Distribution.BucketOptions.Exponential} Exponential
                         */
                        Exponential.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.api.Distribution.BucketOptions.Exponential)
                                return object;
                            var message = new $root.google.api.Distribution.BucketOptions.Exponential();
                            if (object.numFiniteBuckets != null)
                                message.numFiniteBuckets = object.numFiniteBuckets | 0;
                            if (object.growthFactor != null)
                                message.growthFactor = Number(object.growthFactor);
                            if (object.scale != null)
                                message.scale = Number(object.scale);
                            return message;
                        };
    
                        /**
                         * Creates a plain object from an Exponential message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.api.Distribution.BucketOptions.Exponential
                         * @static
                         * @param {google.api.Distribution.BucketOptions.Exponential} message Exponential
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        Exponential.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.defaults) {
                                object.numFiniteBuckets = 0;
                                object.growthFactor = 0;
                                object.scale = 0;
                            }
                            if (message.numFiniteBuckets != null && message.hasOwnProperty("numFiniteBuckets"))
                                object.numFiniteBuckets = message.numFiniteBuckets;
                            if (message.growthFactor != null && message.hasOwnProperty("growthFactor"))
                                object.growthFactor = options.json && !isFinite(message.growthFactor) ? String(message.growthFactor) : message.growthFactor;
                            if (message.scale != null && message.hasOwnProperty("scale"))
                                object.scale = options.json && !isFinite(message.scale) ? String(message.scale) : message.scale;
                            return object;
                        };
    
                        /**
                         * Converts this Exponential to JSON.
                         * @function toJSON
                         * @memberof google.api.Distribution.BucketOptions.Exponential
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        Exponential.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        return Exponential;
                    })();
    
                    BucketOptions.Explicit = (function() {
    
                        /**
                         * Properties of an Explicit.
                         * @memberof google.api.Distribution.BucketOptions
                         * @interface IExplicit
                         * @property {Array.<number>|null} [bounds] Explicit bounds
                         */
    
                        /**
                         * Constructs a new Explicit.
                         * @memberof google.api.Distribution.BucketOptions
                         * @classdesc Represents an Explicit.
                         * @implements IExplicit
                         * @constructor
                         * @param {google.api.Distribution.BucketOptions.IExplicit=} [properties] Properties to set
                         */
                        function Explicit(properties) {
                            this.bounds = [];
                            if (properties)
                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                    if (properties[keys[i]] != null)
                                        this[keys[i]] = properties[keys[i]];
                        }
    
                        /**
                         * Explicit bounds.
                         * @member {Array.<number>} bounds
                         * @memberof google.api.Distribution.BucketOptions.Explicit
                         * @instance
                         */
                        Explicit.prototype.bounds = $util.emptyArray;
    
                        /**
                         * Creates a new Explicit instance using the specified properties.
                         * @function create
                         * @memberof google.api.Distribution.BucketOptions.Explicit
                         * @static
                         * @param {google.api.Distribution.BucketOptions.IExplicit=} [properties] Properties to set
                         * @returns {google.api.Distribution.BucketOptions.Explicit} Explicit instance
                         */
                        Explicit.create = function create(properties) {
                            return new Explicit(properties);
                        };
    
                        /**
                         * Encodes the specified Explicit message. Does not implicitly {@link google.api.Distribution.BucketOptions.Explicit.verify|verify} messages.
                         * @function encode
                         * @memberof google.api.Distribution.BucketOptions.Explicit
                         * @static
                         * @param {google.api.Distribution.BucketOptions.IExplicit} message Explicit message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        Explicit.encode = function encode(message, writer) {
                            if (!writer)
                                writer = $Writer.create();
                            if (message.bounds != null && message.bounds.length) {
                                writer.uint32(/* id 1, wireType 2 =*/10).fork();
                                for (var i = 0; i < message.bounds.length; ++i)
                                    writer.double(message.bounds[i]);
                                writer.ldelim();
                            }
                            return writer;
                        };
    
                        /**
                         * Encodes the specified Explicit message, length delimited. Does not implicitly {@link google.api.Distribution.BucketOptions.Explicit.verify|verify} messages.
                         * @function encodeDelimited
                         * @memberof google.api.Distribution.BucketOptions.Explicit
                         * @static
                         * @param {google.api.Distribution.BucketOptions.IExplicit} message Explicit message or plain object to encode
                         * @param {$protobuf.Writer} [writer] Writer to encode to
                         * @returns {$protobuf.Writer} Writer
                         */
                        Explicit.encodeDelimited = function encodeDelimited(message, writer) {
                            return this.encode(message, writer).ldelim();
                        };
    
                        /**
                         * Decodes an Explicit message from the specified reader or buffer.
                         * @function decode
                         * @memberof google.api.Distribution.BucketOptions.Explicit
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @param {number} [length] Message length if known beforehand
                         * @returns {google.api.Distribution.BucketOptions.Explicit} Explicit
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        Explicit.decode = function decode(reader, length) {
                            if (!(reader instanceof $Reader))
                                reader = $Reader.create(reader);
                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.Distribution.BucketOptions.Explicit();
                            while (reader.pos < end) {
                                var tag = reader.uint32();
                                switch (tag >>> 3) {
                                case 1:
                                    if (!(message.bounds && message.bounds.length))
                                        message.bounds = [];
                                    if ((tag & 7) === 2) {
                                        var end2 = reader.uint32() + reader.pos;
                                        while (reader.pos < end2)
                                            message.bounds.push(reader.double());
                                    } else
                                        message.bounds.push(reader.double());
                                    break;
                                default:
                                    reader.skipType(tag & 7);
                                    break;
                                }
                            }
                            return message;
                        };
    
                        /**
                         * Decodes an Explicit message from the specified reader or buffer, length delimited.
                         * @function decodeDelimited
                         * @memberof google.api.Distribution.BucketOptions.Explicit
                         * @static
                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                         * @returns {google.api.Distribution.BucketOptions.Explicit} Explicit
                         * @throws {Error} If the payload is not a reader or valid buffer
                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
                         */
                        Explicit.decodeDelimited = function decodeDelimited(reader) {
                            if (!(reader instanceof $Reader))
                                reader = new $Reader(reader);
                            return this.decode(reader, reader.uint32());
                        };
    
                        /**
                         * Verifies an Explicit message.
                         * @function verify
                         * @memberof google.api.Distribution.BucketOptions.Explicit
                         * @static
                         * @param {Object.<string,*>} message Plain object to verify
                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
                         */
                        Explicit.verify = function verify(message) {
                            if (typeof message !== "object" || message === null)
                                return "object expected";
                            if (message.bounds != null && message.hasOwnProperty("bounds")) {
                                if (!Array.isArray(message.bounds))
                                    return "bounds: array expected";
                                for (var i = 0; i < message.bounds.length; ++i)
                                    if (typeof message.bounds[i] !== "number")
                                        return "bounds: number[] expected";
                            }
                            return null;
                        };
    
                        /**
                         * Creates an Explicit message from a plain object. Also converts values to their respective internal types.
                         * @function fromObject
                         * @memberof google.api.Distribution.BucketOptions.Explicit
                         * @static
                         * @param {Object.<string,*>} object Plain object
                         * @returns {google.api.Distribution.BucketOptions.Explicit} Explicit
                         */
                        Explicit.fromObject = function fromObject(object) {
                            if (object instanceof $root.google.api.Distribution.BucketOptions.Explicit)
                                return object;
                            var message = new $root.google.api.Distribution.BucketOptions.Explicit();
                            if (object.bounds) {
                                if (!Array.isArray(object.bounds))
                                    throw TypeError(".google.api.Distribution.BucketOptions.Explicit.bounds: array expected");
                                message.bounds = [];
                                for (var i = 0; i < object.bounds.length; ++i)
                                    message.bounds[i] = Number(object.bounds[i]);
                            }
                            return message;
                        };
    
                        /**
                         * Creates a plain object from an Explicit message. Also converts values to other types if specified.
                         * @function toObject
                         * @memberof google.api.Distribution.BucketOptions.Explicit
                         * @static
                         * @param {google.api.Distribution.BucketOptions.Explicit} message Explicit
                         * @param {$protobuf.IConversionOptions} [options] Conversion options
                         * @returns {Object.<string,*>} Plain object
                         */
                        Explicit.toObject = function toObject(message, options) {
                            if (!options)
                                options = {};
                            var object = {};
                            if (options.arrays || options.defaults)
                                object.bounds = [];
                            if (message.bounds && message.bounds.length) {
                                object.bounds = [];
                                for (var j = 0; j < message.bounds.length; ++j)
                                    object.bounds[j] = options.json && !isFinite(message.bounds[j]) ? String(message.bounds[j]) : message.bounds[j];
                            }
                            return object;
                        };
    
                        /**
                         * Converts this Explicit to JSON.
                         * @function toJSON
                         * @memberof google.api.Distribution.BucketOptions.Explicit
                         * @instance
                         * @returns {Object.<string,*>} JSON object
                         */
                        Explicit.prototype.toJSON = function toJSON() {
                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                        };
    
                        return Explicit;
                    })();
    
                    return BucketOptions;
                })();
    
                Distribution.Exemplar = (function() {
    
                    /**
                     * Properties of an Exemplar.
                     * @memberof google.api.Distribution
                     * @interface IExemplar
                     * @property {number|null} [value] Exemplar value
                     * @property {google.protobuf.ITimestamp|null} [timestamp] Exemplar timestamp
                     * @property {Array.<google.protobuf.IAny>|null} [attachments] Exemplar attachments
                     */
    
                    /**
                     * Constructs a new Exemplar.
                     * @memberof google.api.Distribution
                     * @classdesc Represents an Exemplar.
                     * @implements IExemplar
                     * @constructor
                     * @param {google.api.Distribution.IExemplar=} [properties] Properties to set
                     */
                    function Exemplar(properties) {
                        this.attachments = [];
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * Exemplar value.
                     * @member {number} value
                     * @memberof google.api.Distribution.Exemplar
                     * @instance
                     */
                    Exemplar.prototype.value = 0;
    
                    /**
                     * Exemplar timestamp.
                     * @member {google.protobuf.ITimestamp|null|undefined} timestamp
                     * @memberof google.api.Distribution.Exemplar
                     * @instance
                     */
                    Exemplar.prototype.timestamp = null;
    
                    /**
                     * Exemplar attachments.
                     * @member {Array.<google.protobuf.IAny>} attachments
                     * @memberof google.api.Distribution.Exemplar
                     * @instance
                     */
                    Exemplar.prototype.attachments = $util.emptyArray;
    
                    /**
                     * Creates a new Exemplar instance using the specified properties.
                     * @function create
                     * @memberof google.api.Distribution.Exemplar
                     * @static
                     * @param {google.api.Distribution.IExemplar=} [properties] Properties to set
                     * @returns {google.api.Distribution.Exemplar} Exemplar instance
                     */
                    Exemplar.create = function create(properties) {
                        return new Exemplar(properties);
                    };
    
                    /**
                     * Encodes the specified Exemplar message. Does not implicitly {@link google.api.Distribution.Exemplar.verify|verify} messages.
                     * @function encode
                     * @memberof google.api.Distribution.Exemplar
                     * @static
                     * @param {google.api.Distribution.IExemplar} message Exemplar message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Exemplar.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                            writer.uint32(/* id 1, wireType 1 =*/9).double(message.value);
                        if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp"))
                            $root.google.protobuf.Timestamp.encode(message.timestamp, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.attachments != null && message.attachments.length)
                            for (var i = 0; i < message.attachments.length; ++i)
                                $root.google.protobuf.Any.encode(message.attachments[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified Exemplar message, length delimited. Does not implicitly {@link google.api.Distribution.Exemplar.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.api.Distribution.Exemplar
                     * @static
                     * @param {google.api.Distribution.IExemplar} message Exemplar message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    Exemplar.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes an Exemplar message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.api.Distribution.Exemplar
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.api.Distribution.Exemplar} Exemplar
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Exemplar.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.Distribution.Exemplar();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.value = reader.double();
                                break;
                            case 2:
                                message.timestamp = $root.google.protobuf.Timestamp.decode(reader, reader.uint32());
                                break;
                            case 3:
                                if (!(message.attachments && message.attachments.length))
                                    message.attachments = [];
                                message.attachments.push($root.google.protobuf.Any.decode(reader, reader.uint32()));
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes an Exemplar message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.api.Distribution.Exemplar
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.api.Distribution.Exemplar} Exemplar
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    Exemplar.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies an Exemplar message.
                     * @function verify
                     * @memberof google.api.Distribution.Exemplar
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    Exemplar.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.value != null && message.hasOwnProperty("value"))
                            if (typeof message.value !== "number")
                                return "value: number expected";
                        if (message.timestamp != null && message.hasOwnProperty("timestamp")) {
                            var error = $root.google.protobuf.Timestamp.verify(message.timestamp);
                            if (error)
                                return "timestamp." + error;
                        }
                        if (message.attachments != null && message.hasOwnProperty("attachments")) {
                            if (!Array.isArray(message.attachments))
                                return "attachments: array expected";
                            for (var i = 0; i < message.attachments.length; ++i) {
                                var error = $root.google.protobuf.Any.verify(message.attachments[i]);
                                if (error)
                                    return "attachments." + error;
                            }
                        }
                        return null;
                    };
    
                    /**
                     * Creates an Exemplar message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.api.Distribution.Exemplar
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.api.Distribution.Exemplar} Exemplar
                     */
                    Exemplar.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.api.Distribution.Exemplar)
                            return object;
                        var message = new $root.google.api.Distribution.Exemplar();
                        if (object.value != null)
                            message.value = Number(object.value);
                        if (object.timestamp != null) {
                            if (typeof object.timestamp !== "object")
                                throw TypeError(".google.api.Distribution.Exemplar.timestamp: object expected");
                            message.timestamp = $root.google.protobuf.Timestamp.fromObject(object.timestamp);
                        }
                        if (object.attachments) {
                            if (!Array.isArray(object.attachments))
                                throw TypeError(".google.api.Distribution.Exemplar.attachments: array expected");
                            message.attachments = [];
                            for (var i = 0; i < object.attachments.length; ++i) {
                                if (typeof object.attachments[i] !== "object")
                                    throw TypeError(".google.api.Distribution.Exemplar.attachments: object expected");
                                message.attachments[i] = $root.google.protobuf.Any.fromObject(object.attachments[i]);
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from an Exemplar message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.api.Distribution.Exemplar
                     * @static
                     * @param {google.api.Distribution.Exemplar} message Exemplar
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    Exemplar.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.arrays || options.defaults)
                            object.attachments = [];
                        if (options.defaults) {
                            object.value = 0;
                            object.timestamp = null;
                        }
                        if (message.value != null && message.hasOwnProperty("value"))
                            object.value = options.json && !isFinite(message.value) ? String(message.value) : message.value;
                        if (message.timestamp != null && message.hasOwnProperty("timestamp"))
                            object.timestamp = $root.google.protobuf.Timestamp.toObject(message.timestamp, options);
                        if (message.attachments && message.attachments.length) {
                            object.attachments = [];
                            for (var j = 0; j < message.attachments.length; ++j)
                                object.attachments[j] = $root.google.protobuf.Any.toObject(message.attachments[j], options);
                        }
                        return object;
                    };
    
                    /**
                     * Converts this Exemplar to JSON.
                     * @function toJSON
                     * @memberof google.api.Distribution.Exemplar
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    Exemplar.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return Exemplar;
                })();
    
                return Distribution;
            })();
    
            api.MetricDescriptor = (function() {
    
                /**
                 * Properties of a MetricDescriptor.
                 * @memberof google.api
                 * @interface IMetricDescriptor
                 * @property {string|null} [name] MetricDescriptor name
                 * @property {string|null} [type] MetricDescriptor type
                 * @property {Array.<google.api.ILabelDescriptor>|null} [labels] MetricDescriptor labels
                 * @property {google.api.MetricDescriptor.MetricKind|null} [metricKind] MetricDescriptor metricKind
                 * @property {google.api.MetricDescriptor.ValueType|null} [valueType] MetricDescriptor valueType
                 * @property {string|null} [unit] MetricDescriptor unit
                 * @property {string|null} [description] MetricDescriptor description
                 * @property {string|null} [displayName] MetricDescriptor displayName
                 * @property {google.api.MetricDescriptor.IMetricDescriptorMetadata|null} [metadata] MetricDescriptor metadata
                 * @property {google.api.LaunchStage|null} [launchStage] MetricDescriptor launchStage
                 * @property {Array.<string>|null} [monitoredResourceTypes] MetricDescriptor monitoredResourceTypes
                 */
    
                /**
                 * Constructs a new MetricDescriptor.
                 * @memberof google.api
                 * @classdesc Represents a MetricDescriptor.
                 * @implements IMetricDescriptor
                 * @constructor
                 * @param {google.api.IMetricDescriptor=} [properties] Properties to set
                 */
                function MetricDescriptor(properties) {
                    this.labels = [];
                    this.monitoredResourceTypes = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * MetricDescriptor name.
                 * @member {string} name
                 * @memberof google.api.MetricDescriptor
                 * @instance
                 */
                MetricDescriptor.prototype.name = "";
    
                /**
                 * MetricDescriptor type.
                 * @member {string} type
                 * @memberof google.api.MetricDescriptor
                 * @instance
                 */
                MetricDescriptor.prototype.type = "";
    
                /**
                 * MetricDescriptor labels.
                 * @member {Array.<google.api.ILabelDescriptor>} labels
                 * @memberof google.api.MetricDescriptor
                 * @instance
                 */
                MetricDescriptor.prototype.labels = $util.emptyArray;
    
                /**
                 * MetricDescriptor metricKind.
                 * @member {google.api.MetricDescriptor.MetricKind} metricKind
                 * @memberof google.api.MetricDescriptor
                 * @instance
                 */
                MetricDescriptor.prototype.metricKind = 0;
    
                /**
                 * MetricDescriptor valueType.
                 * @member {google.api.MetricDescriptor.ValueType} valueType
                 * @memberof google.api.MetricDescriptor
                 * @instance
                 */
                MetricDescriptor.prototype.valueType = 0;
    
                /**
                 * MetricDescriptor unit.
                 * @member {string} unit
                 * @memberof google.api.MetricDescriptor
                 * @instance
                 */
                MetricDescriptor.prototype.unit = "";
    
                /**
                 * MetricDescriptor description.
                 * @member {string} description
                 * @memberof google.api.MetricDescriptor
                 * @instance
                 */
                MetricDescriptor.prototype.description = "";
    
                /**
                 * MetricDescriptor displayName.
                 * @member {string} displayName
                 * @memberof google.api.MetricDescriptor
                 * @instance
                 */
                MetricDescriptor.prototype.displayName = "";
    
                /**
                 * MetricDescriptor metadata.
                 * @member {google.api.MetricDescriptor.IMetricDescriptorMetadata|null|undefined} metadata
                 * @memberof google.api.MetricDescriptor
                 * @instance
                 */
                MetricDescriptor.prototype.metadata = null;
    
                /**
                 * MetricDescriptor launchStage.
                 * @member {google.api.LaunchStage} launchStage
                 * @memberof google.api.MetricDescriptor
                 * @instance
                 */
                MetricDescriptor.prototype.launchStage = 0;
    
                /**
                 * MetricDescriptor monitoredResourceTypes.
                 * @member {Array.<string>} monitoredResourceTypes
                 * @memberof google.api.MetricDescriptor
                 * @instance
                 */
                MetricDescriptor.prototype.monitoredResourceTypes = $util.emptyArray;
    
                /**
                 * Creates a new MetricDescriptor instance using the specified properties.
                 * @function create
                 * @memberof google.api.MetricDescriptor
                 * @static
                 * @param {google.api.IMetricDescriptor=} [properties] Properties to set
                 * @returns {google.api.MetricDescriptor} MetricDescriptor instance
                 */
                MetricDescriptor.create = function create(properties) {
                    return new MetricDescriptor(properties);
                };
    
                /**
                 * Encodes the specified MetricDescriptor message. Does not implicitly {@link google.api.MetricDescriptor.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.MetricDescriptor
                 * @static
                 * @param {google.api.IMetricDescriptor} message MetricDescriptor message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                MetricDescriptor.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    if (message.labels != null && message.labels.length)
                        for (var i = 0; i < message.labels.length; ++i)
                            $root.google.api.LabelDescriptor.encode(message.labels[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                    if (message.metricKind != null && Object.hasOwnProperty.call(message, "metricKind"))
                        writer.uint32(/* id 3, wireType 0 =*/24).int32(message.metricKind);
                    if (message.valueType != null && Object.hasOwnProperty.call(message, "valueType"))
                        writer.uint32(/* id 4, wireType 0 =*/32).int32(message.valueType);
                    if (message.unit != null && Object.hasOwnProperty.call(message, "unit"))
                        writer.uint32(/* id 5, wireType 2 =*/42).string(message.unit);
                    if (message.description != null && Object.hasOwnProperty.call(message, "description"))
                        writer.uint32(/* id 6, wireType 2 =*/50).string(message.description);
                    if (message.displayName != null && Object.hasOwnProperty.call(message, "displayName"))
                        writer.uint32(/* id 7, wireType 2 =*/58).string(message.displayName);
                    if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                        writer.uint32(/* id 8, wireType 2 =*/66).string(message.type);
                    if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata"))
                        $root.google.api.MetricDescriptor.MetricDescriptorMetadata.encode(message.metadata, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim();
                    if (message.launchStage != null && Object.hasOwnProperty.call(message, "launchStage"))
                        writer.uint32(/* id 12, wireType 0 =*/96).int32(message.launchStage);
                    if (message.monitoredResourceTypes != null && message.monitoredResourceTypes.length)
                        for (var i = 0; i < message.monitoredResourceTypes.length; ++i)
                            writer.uint32(/* id 13, wireType 2 =*/106).string(message.monitoredResourceTypes[i]);
                    return writer;
                };
    
                /**
                 * Encodes the specified MetricDescriptor message, length delimited. Does not implicitly {@link google.api.MetricDescriptor.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.MetricDescriptor
                 * @static
                 * @param {google.api.IMetricDescriptor} message MetricDescriptor message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                MetricDescriptor.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a MetricDescriptor message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.MetricDescriptor
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.MetricDescriptor} MetricDescriptor
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                MetricDescriptor.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.MetricDescriptor();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.name = reader.string();
                            break;
                        case 8:
                            message.type = reader.string();
                            break;
                        case 2:
                            if (!(message.labels && message.labels.length))
                                message.labels = [];
                            message.labels.push($root.google.api.LabelDescriptor.decode(reader, reader.uint32()));
                            break;
                        case 3:
                            message.metricKind = reader.int32();
                            break;
                        case 4:
                            message.valueType = reader.int32();
                            break;
                        case 5:
                            message.unit = reader.string();
                            break;
                        case 6:
                            message.description = reader.string();
                            break;
                        case 7:
                            message.displayName = reader.string();
                            break;
                        case 10:
                            message.metadata = $root.google.api.MetricDescriptor.MetricDescriptorMetadata.decode(reader, reader.uint32());
                            break;
                        case 12:
                            message.launchStage = reader.int32();
                            break;
                        case 13:
                            if (!(message.monitoredResourceTypes && message.monitoredResourceTypes.length))
                                message.monitoredResourceTypes = [];
                            message.monitoredResourceTypes.push(reader.string());
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a MetricDescriptor message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.MetricDescriptor
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.MetricDescriptor} MetricDescriptor
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                MetricDescriptor.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a MetricDescriptor message.
                 * @function verify
                 * @memberof google.api.MetricDescriptor
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                MetricDescriptor.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    if (message.type != null && message.hasOwnProperty("type"))
                        if (!$util.isString(message.type))
                            return "type: string expected";
                    if (message.labels != null && message.hasOwnProperty("labels")) {
                        if (!Array.isArray(message.labels))
                            return "labels: array expected";
                        for (var i = 0; i < message.labels.length; ++i) {
                            var error = $root.google.api.LabelDescriptor.verify(message.labels[i]);
                            if (error)
                                return "labels." + error;
                        }
                    }
                    if (message.metricKind != null && message.hasOwnProperty("metricKind"))
                        switch (message.metricKind) {
                        default:
                            return "metricKind: enum value expected";
                        case 0:
                        case 1:
                        case 2:
                        case 3:
                            break;
                        }
                    if (message.valueType != null && message.hasOwnProperty("valueType"))
                        switch (message.valueType) {
                        default:
                            return "valueType: enum value expected";
                        case 0:
                        case 1:
                        case 2:
                        case 3:
                        case 4:
                        case 5:
                        case 6:
                            break;
                        }
                    if (message.unit != null && message.hasOwnProperty("unit"))
                        if (!$util.isString(message.unit))
                            return "unit: string expected";
                    if (message.description != null && message.hasOwnProperty("description"))
                        if (!$util.isString(message.description))
                            return "description: string expected";
                    if (message.displayName != null && message.hasOwnProperty("displayName"))
                        if (!$util.isString(message.displayName))
                            return "displayName: string expected";
                    if (message.metadata != null && message.hasOwnProperty("metadata")) {
                        var error = $root.google.api.MetricDescriptor.MetricDescriptorMetadata.verify(message.metadata);
                        if (error)
                            return "metadata." + error;
                    }
                    if (message.launchStage != null && message.hasOwnProperty("launchStage"))
                        switch (message.launchStage) {
                        default:
                            return "launchStage: enum value expected";
                        case 0:
                        case 6:
                        case 7:
                        case 1:
                        case 2:
                        case 3:
                        case 4:
                        case 5:
                            break;
                        }
                    if (message.monitoredResourceTypes != null && message.hasOwnProperty("monitoredResourceTypes")) {
                        if (!Array.isArray(message.monitoredResourceTypes))
                            return "monitoredResourceTypes: array expected";
                        for (var i = 0; i < message.monitoredResourceTypes.length; ++i)
                            if (!$util.isString(message.monitoredResourceTypes[i]))
                                return "monitoredResourceTypes: string[] expected";
                    }
                    return null;
                };
    
                /**
                 * Creates a MetricDescriptor message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.MetricDescriptor
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.MetricDescriptor} MetricDescriptor
                 */
                MetricDescriptor.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.MetricDescriptor)
                        return object;
                    var message = new $root.google.api.MetricDescriptor();
                    if (object.name != null)
                        message.name = String(object.name);
                    if (object.type != null)
                        message.type = String(object.type);
                    if (object.labels) {
                        if (!Array.isArray(object.labels))
                            throw TypeError(".google.api.MetricDescriptor.labels: array expected");
                        message.labels = [];
                        for (var i = 0; i < object.labels.length; ++i) {
                            if (typeof object.labels[i] !== "object")
                                throw TypeError(".google.api.MetricDescriptor.labels: object expected");
                            message.labels[i] = $root.google.api.LabelDescriptor.fromObject(object.labels[i]);
                        }
                    }
                    switch (object.metricKind) {
                    case "METRIC_KIND_UNSPECIFIED":
                    case 0:
                        message.metricKind = 0;
                        break;
                    case "GAUGE":
                    case 1:
                        message.metricKind = 1;
                        break;
                    case "DELTA":
                    case 2:
                        message.metricKind = 2;
                        break;
                    case "CUMULATIVE":
                    case 3:
                        message.metricKind = 3;
                        break;
                    }
                    switch (object.valueType) {
                    case "VALUE_TYPE_UNSPECIFIED":
                    case 0:
                        message.valueType = 0;
                        break;
                    case "BOOL":
                    case 1:
                        message.valueType = 1;
                        break;
                    case "INT64":
                    case 2:
                        message.valueType = 2;
                        break;
                    case "DOUBLE":
                    case 3:
                        message.valueType = 3;
                        break;
                    case "STRING":
                    case 4:
                        message.valueType = 4;
                        break;
                    case "DISTRIBUTION":
                    case 5:
                        message.valueType = 5;
                        break;
                    case "MONEY":
                    case 6:
                        message.valueType = 6;
                        break;
                    }
                    if (object.unit != null)
                        message.unit = String(object.unit);
                    if (object.description != null)
                        message.description = String(object.description);
                    if (object.displayName != null)
                        message.displayName = String(object.displayName);
                    if (object.metadata != null) {
                        if (typeof object.metadata !== "object")
                            throw TypeError(".google.api.MetricDescriptor.metadata: object expected");
                        message.metadata = $root.google.api.MetricDescriptor.MetricDescriptorMetadata.fromObject(object.metadata);
                    }
                    switch (object.launchStage) {
                    case "LAUNCH_STAGE_UNSPECIFIED":
                    case 0:
                        message.launchStage = 0;
                        break;
                    case "UNIMPLEMENTED":
                    case 6:
                        message.launchStage = 6;
                        break;
                    case "PRELAUNCH":
                    case 7:
                        message.launchStage = 7;
                        break;
                    case "EARLY_ACCESS":
                    case 1:
                        message.launchStage = 1;
                        break;
                    case "ALPHA":
                    case 2:
                        message.launchStage = 2;
                        break;
                    case "BETA":
                    case 3:
                        message.launchStage = 3;
                        break;
                    case "GA":
                    case 4:
                        message.launchStage = 4;
                        break;
                    case "DEPRECATED":
                    case 5:
                        message.launchStage = 5;
                        break;
                    }
                    if (object.monitoredResourceTypes) {
                        if (!Array.isArray(object.monitoredResourceTypes))
                            throw TypeError(".google.api.MetricDescriptor.monitoredResourceTypes: array expected");
                        message.monitoredResourceTypes = [];
                        for (var i = 0; i < object.monitoredResourceTypes.length; ++i)
                            message.monitoredResourceTypes[i] = String(object.monitoredResourceTypes[i]);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a MetricDescriptor message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.MetricDescriptor
                 * @static
                 * @param {google.api.MetricDescriptor} message MetricDescriptor
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                MetricDescriptor.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults) {
                        object.labels = [];
                        object.monitoredResourceTypes = [];
                    }
                    if (options.defaults) {
                        object.name = "";
                        object.metricKind = options.enums === String ? "METRIC_KIND_UNSPECIFIED" : 0;
                        object.valueType = options.enums === String ? "VALUE_TYPE_UNSPECIFIED" : 0;
                        object.unit = "";
                        object.description = "";
                        object.displayName = "";
                        object.type = "";
                        object.metadata = null;
                        object.launchStage = options.enums === String ? "LAUNCH_STAGE_UNSPECIFIED" : 0;
                    }
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    if (message.labels && message.labels.length) {
                        object.labels = [];
                        for (var j = 0; j < message.labels.length; ++j)
                            object.labels[j] = $root.google.api.LabelDescriptor.toObject(message.labels[j], options);
                    }
                    if (message.metricKind != null && message.hasOwnProperty("metricKind"))
                        object.metricKind = options.enums === String ? $root.google.api.MetricDescriptor.MetricKind[message.metricKind] : message.metricKind;
                    if (message.valueType != null && message.hasOwnProperty("valueType"))
                        object.valueType = options.enums === String ? $root.google.api.MetricDescriptor.ValueType[message.valueType] : message.valueType;
                    if (message.unit != null && message.hasOwnProperty("unit"))
                        object.unit = message.unit;
                    if (message.description != null && message.hasOwnProperty("description"))
                        object.description = message.description;
                    if (message.displayName != null && message.hasOwnProperty("displayName"))
                        object.displayName = message.displayName;
                    if (message.type != null && message.hasOwnProperty("type"))
                        object.type = message.type;
                    if (message.metadata != null && message.hasOwnProperty("metadata"))
                        object.metadata = $root.google.api.MetricDescriptor.MetricDescriptorMetadata.toObject(message.metadata, options);
                    if (message.launchStage != null && message.hasOwnProperty("launchStage"))
                        object.launchStage = options.enums === String ? $root.google.api.LaunchStage[message.launchStage] : message.launchStage;
                    if (message.monitoredResourceTypes && message.monitoredResourceTypes.length) {
                        object.monitoredResourceTypes = [];
                        for (var j = 0; j < message.monitoredResourceTypes.length; ++j)
                            object.monitoredResourceTypes[j] = message.monitoredResourceTypes[j];
                    }
                    return object;
                };
    
                /**
                 * Converts this MetricDescriptor to JSON.
                 * @function toJSON
                 * @memberof google.api.MetricDescriptor
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                MetricDescriptor.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                MetricDescriptor.MetricDescriptorMetadata = (function() {
    
                    /**
                     * Properties of a MetricDescriptorMetadata.
                     * @memberof google.api.MetricDescriptor
                     * @interface IMetricDescriptorMetadata
                     * @property {google.api.LaunchStage|null} [launchStage] MetricDescriptorMetadata launchStage
                     * @property {google.protobuf.IDuration|null} [samplePeriod] MetricDescriptorMetadata samplePeriod
                     * @property {google.protobuf.IDuration|null} [ingestDelay] MetricDescriptorMetadata ingestDelay
                     */
    
                    /**
                     * Constructs a new MetricDescriptorMetadata.
                     * @memberof google.api.MetricDescriptor
                     * @classdesc Represents a MetricDescriptorMetadata.
                     * @implements IMetricDescriptorMetadata
                     * @constructor
                     * @param {google.api.MetricDescriptor.IMetricDescriptorMetadata=} [properties] Properties to set
                     */
                    function MetricDescriptorMetadata(properties) {
                        if (properties)
                            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                                if (properties[keys[i]] != null)
                                    this[keys[i]] = properties[keys[i]];
                    }
    
                    /**
                     * MetricDescriptorMetadata launchStage.
                     * @member {google.api.LaunchStage} launchStage
                     * @memberof google.api.MetricDescriptor.MetricDescriptorMetadata
                     * @instance
                     */
                    MetricDescriptorMetadata.prototype.launchStage = 0;
    
                    /**
                     * MetricDescriptorMetadata samplePeriod.
                     * @member {google.protobuf.IDuration|null|undefined} samplePeriod
                     * @memberof google.api.MetricDescriptor.MetricDescriptorMetadata
                     * @instance
                     */
                    MetricDescriptorMetadata.prototype.samplePeriod = null;
    
                    /**
                     * MetricDescriptorMetadata ingestDelay.
                     * @member {google.protobuf.IDuration|null|undefined} ingestDelay
                     * @memberof google.api.MetricDescriptor.MetricDescriptorMetadata
                     * @instance
                     */
                    MetricDescriptorMetadata.prototype.ingestDelay = null;
    
                    /**
                     * Creates a new MetricDescriptorMetadata instance using the specified properties.
                     * @function create
                     * @memberof google.api.MetricDescriptor.MetricDescriptorMetadata
                     * @static
                     * @param {google.api.MetricDescriptor.IMetricDescriptorMetadata=} [properties] Properties to set
                     * @returns {google.api.MetricDescriptor.MetricDescriptorMetadata} MetricDescriptorMetadata instance
                     */
                    MetricDescriptorMetadata.create = function create(properties) {
                        return new MetricDescriptorMetadata(properties);
                    };
    
                    /**
                     * Encodes the specified MetricDescriptorMetadata message. Does not implicitly {@link google.api.MetricDescriptor.MetricDescriptorMetadata.verify|verify} messages.
                     * @function encode
                     * @memberof google.api.MetricDescriptor.MetricDescriptorMetadata
                     * @static
                     * @param {google.api.MetricDescriptor.IMetricDescriptorMetadata} message MetricDescriptorMetadata message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    MetricDescriptorMetadata.encode = function encode(message, writer) {
                        if (!writer)
                            writer = $Writer.create();
                        if (message.launchStage != null && Object.hasOwnProperty.call(message, "launchStage"))
                            writer.uint32(/* id 1, wireType 0 =*/8).int32(message.launchStage);
                        if (message.samplePeriod != null && Object.hasOwnProperty.call(message, "samplePeriod"))
                            $root.google.protobuf.Duration.encode(message.samplePeriod, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                        if (message.ingestDelay != null && Object.hasOwnProperty.call(message, "ingestDelay"))
                            $root.google.protobuf.Duration.encode(message.ingestDelay, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                        return writer;
                    };
    
                    /**
                     * Encodes the specified MetricDescriptorMetadata message, length delimited. Does not implicitly {@link google.api.MetricDescriptor.MetricDescriptorMetadata.verify|verify} messages.
                     * @function encodeDelimited
                     * @memberof google.api.MetricDescriptor.MetricDescriptorMetadata
                     * @static
                     * @param {google.api.MetricDescriptor.IMetricDescriptorMetadata} message MetricDescriptorMetadata message or plain object to encode
                     * @param {$protobuf.Writer} [writer] Writer to encode to
                     * @returns {$protobuf.Writer} Writer
                     */
                    MetricDescriptorMetadata.encodeDelimited = function encodeDelimited(message, writer) {
                        return this.encode(message, writer).ldelim();
                    };
    
                    /**
                     * Decodes a MetricDescriptorMetadata message from the specified reader or buffer.
                     * @function decode
                     * @memberof google.api.MetricDescriptor.MetricDescriptorMetadata
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @param {number} [length] Message length if known beforehand
                     * @returns {google.api.MetricDescriptor.MetricDescriptorMetadata} MetricDescriptorMetadata
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    MetricDescriptorMetadata.decode = function decode(reader, length) {
                        if (!(reader instanceof $Reader))
                            reader = $Reader.create(reader);
                        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.MetricDescriptor.MetricDescriptorMetadata();
                        while (reader.pos < end) {
                            var tag = reader.uint32();
                            switch (tag >>> 3) {
                            case 1:
                                message.launchStage = reader.int32();
                                break;
                            case 2:
                                message.samplePeriod = $root.google.protobuf.Duration.decode(reader, reader.uint32());
                                break;
                            case 3:
                                message.ingestDelay = $root.google.protobuf.Duration.decode(reader, reader.uint32());
                                break;
                            default:
                                reader.skipType(tag & 7);
                                break;
                            }
                        }
                        return message;
                    };
    
                    /**
                     * Decodes a MetricDescriptorMetadata message from the specified reader or buffer, length delimited.
                     * @function decodeDelimited
                     * @memberof google.api.MetricDescriptor.MetricDescriptorMetadata
                     * @static
                     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                     * @returns {google.api.MetricDescriptor.MetricDescriptorMetadata} MetricDescriptorMetadata
                     * @throws {Error} If the payload is not a reader or valid buffer
                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
                     */
                    MetricDescriptorMetadata.decodeDelimited = function decodeDelimited(reader) {
                        if (!(reader instanceof $Reader))
                            reader = new $Reader(reader);
                        return this.decode(reader, reader.uint32());
                    };
    
                    /**
                     * Verifies a MetricDescriptorMetadata message.
                     * @function verify
                     * @memberof google.api.MetricDescriptor.MetricDescriptorMetadata
                     * @static
                     * @param {Object.<string,*>} message Plain object to verify
                     * @returns {string|null} `null` if valid, otherwise the reason why it is not
                     */
                    MetricDescriptorMetadata.verify = function verify(message) {
                        if (typeof message !== "object" || message === null)
                            return "object expected";
                        if (message.launchStage != null && message.hasOwnProperty("launchStage"))
                            switch (message.launchStage) {
                            default:
                                return "launchStage: enum value expected";
                            case 0:
                            case 6:
                            case 7:
                            case 1:
                            case 2:
                            case 3:
                            case 4:
                            case 5:
                                break;
                            }
                        if (message.samplePeriod != null && message.hasOwnProperty("samplePeriod")) {
                            var error = $root.google.protobuf.Duration.verify(message.samplePeriod);
                            if (error)
                                return "samplePeriod." + error;
                        }
                        if (message.ingestDelay != null && message.hasOwnProperty("ingestDelay")) {
                            var error = $root.google.protobuf.Duration.verify(message.ingestDelay);
                            if (error)
                                return "ingestDelay." + error;
                        }
                        return null;
                    };
    
                    /**
                     * Creates a MetricDescriptorMetadata message from a plain object. Also converts values to their respective internal types.
                     * @function fromObject
                     * @memberof google.api.MetricDescriptor.MetricDescriptorMetadata
                     * @static
                     * @param {Object.<string,*>} object Plain object
                     * @returns {google.api.MetricDescriptor.MetricDescriptorMetadata} MetricDescriptorMetadata
                     */
                    MetricDescriptorMetadata.fromObject = function fromObject(object) {
                        if (object instanceof $root.google.api.MetricDescriptor.MetricDescriptorMetadata)
                            return object;
                        var message = new $root.google.api.MetricDescriptor.MetricDescriptorMetadata();
                        switch (object.launchStage) {
                        case "LAUNCH_STAGE_UNSPECIFIED":
                        case 0:
                            message.launchStage = 0;
                            break;
                        case "UNIMPLEMENTED":
                        case 6:
                            message.launchStage = 6;
                            break;
                        case "PRELAUNCH":
                        case 7:
                            message.launchStage = 7;
                            break;
                        case "EARLY_ACCESS":
                        case 1:
                            message.launchStage = 1;
                            break;
                        case "ALPHA":
                        case 2:
                            message.launchStage = 2;
                            break;
                        case "BETA":
                        case 3:
                            message.launchStage = 3;
                            break;
                        case "GA":
                        case 4:
                            message.launchStage = 4;
                            break;
                        case "DEPRECATED":
                        case 5:
                            message.launchStage = 5;
                            break;
                        }
                        if (object.samplePeriod != null) {
                            if (typeof object.samplePeriod !== "object")
                                throw TypeError(".google.api.MetricDescriptor.MetricDescriptorMetadata.samplePeriod: object expected");
                            message.samplePeriod = $root.google.protobuf.Duration.fromObject(object.samplePeriod);
                        }
                        if (object.ingestDelay != null) {
                            if (typeof object.ingestDelay !== "object")
                                throw TypeError(".google.api.MetricDescriptor.MetricDescriptorMetadata.ingestDelay: object expected");
                            message.ingestDelay = $root.google.protobuf.Duration.fromObject(object.ingestDelay);
                        }
                        return message;
                    };
    
                    /**
                     * Creates a plain object from a MetricDescriptorMetadata message. Also converts values to other types if specified.
                     * @function toObject
                     * @memberof google.api.MetricDescriptor.MetricDescriptorMetadata
                     * @static
                     * @param {google.api.MetricDescriptor.MetricDescriptorMetadata} message MetricDescriptorMetadata
                     * @param {$protobuf.IConversionOptions} [options] Conversion options
                     * @returns {Object.<string,*>} Plain object
                     */
                    MetricDescriptorMetadata.toObject = function toObject(message, options) {
                        if (!options)
                            options = {};
                        var object = {};
                        if (options.defaults) {
                            object.launchStage = options.enums === String ? "LAUNCH_STAGE_UNSPECIFIED" : 0;
                            object.samplePeriod = null;
                            object.ingestDelay = null;
                        }
                        if (message.launchStage != null && message.hasOwnProperty("launchStage"))
                            object.launchStage = options.enums === String ? $root.google.api.LaunchStage[message.launchStage] : message.launchStage;
                        if (message.samplePeriod != null && message.hasOwnProperty("samplePeriod"))
                            object.samplePeriod = $root.google.protobuf.Duration.toObject(message.samplePeriod, options);
                        if (message.ingestDelay != null && message.hasOwnProperty("ingestDelay"))
                            object.ingestDelay = $root.google.protobuf.Duration.toObject(message.ingestDelay, options);
                        return object;
                    };
    
                    /**
                     * Converts this MetricDescriptorMetadata to JSON.
                     * @function toJSON
                     * @memberof google.api.MetricDescriptor.MetricDescriptorMetadata
                     * @instance
                     * @returns {Object.<string,*>} JSON object
                     */
                    MetricDescriptorMetadata.prototype.toJSON = function toJSON() {
                        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                    };
    
                    return MetricDescriptorMetadata;
                })();
    
                /**
                 * MetricKind enum.
                 * @name google.api.MetricDescriptor.MetricKind
                 * @enum {number}
                 * @property {number} METRIC_KIND_UNSPECIFIED=0 METRIC_KIND_UNSPECIFIED value
                 * @property {number} GAUGE=1 GAUGE value
                 * @property {number} DELTA=2 DELTA value
                 * @property {number} CUMULATIVE=3 CUMULATIVE value
                 */
                MetricDescriptor.MetricKind = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "METRIC_KIND_UNSPECIFIED"] = 0;
                    values[valuesById[1] = "GAUGE"] = 1;
                    values[valuesById[2] = "DELTA"] = 2;
                    values[valuesById[3] = "CUMULATIVE"] = 3;
                    return values;
                })();
    
                /**
                 * ValueType enum.
                 * @name google.api.MetricDescriptor.ValueType
                 * @enum {number}
                 * @property {number} VALUE_TYPE_UNSPECIFIED=0 VALUE_TYPE_UNSPECIFIED value
                 * @property {number} BOOL=1 BOOL value
                 * @property {number} INT64=2 INT64 value
                 * @property {number} DOUBLE=3 DOUBLE value
                 * @property {number} STRING=4 STRING value
                 * @property {number} DISTRIBUTION=5 DISTRIBUTION value
                 * @property {number} MONEY=6 MONEY value
                 */
                MetricDescriptor.ValueType = (function() {
                    var valuesById = {}, values = Object.create(valuesById);
                    values[valuesById[0] = "VALUE_TYPE_UNSPECIFIED"] = 0;
                    values[valuesById[1] = "BOOL"] = 1;
                    values[valuesById[2] = "INT64"] = 2;
                    values[valuesById[3] = "DOUBLE"] = 3;
                    values[valuesById[4] = "STRING"] = 4;
                    values[valuesById[5] = "DISTRIBUTION"] = 5;
                    values[valuesById[6] = "MONEY"] = 6;
                    return values;
                })();
    
                return MetricDescriptor;
            })();
    
            api.Metric = (function() {
    
                /**
                 * Properties of a Metric.
                 * @memberof google.api
                 * @interface IMetric
                 * @property {string|null} [type] Metric type
                 * @property {Object.<string,string>|null} [labels] Metric labels
                 */
    
                /**
                 * Constructs a new Metric.
                 * @memberof google.api
                 * @classdesc Represents a Metric.
                 * @implements IMetric
                 * @constructor
                 * @param {google.api.IMetric=} [properties] Properties to set
                 */
                function Metric(properties) {
                    this.labels = {};
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * Metric type.
                 * @member {string} type
                 * @memberof google.api.Metric
                 * @instance
                 */
                Metric.prototype.type = "";
    
                /**
                 * Metric labels.
                 * @member {Object.<string,string>} labels
                 * @memberof google.api.Metric
                 * @instance
                 */
                Metric.prototype.labels = $util.emptyObject;
    
                /**
                 * Creates a new Metric instance using the specified properties.
                 * @function create
                 * @memberof google.api.Metric
                 * @static
                 * @param {google.api.IMetric=} [properties] Properties to set
                 * @returns {google.api.Metric} Metric instance
                 */
                Metric.create = function create(properties) {
                    return new Metric(properties);
                };
    
                /**
                 * Encodes the specified Metric message. Does not implicitly {@link google.api.Metric.verify|verify} messages.
                 * @function encode
                 * @memberof google.api.Metric
                 * @static
                 * @param {google.api.IMetric} message Metric message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Metric.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.labels != null && Object.hasOwnProperty.call(message, "labels"))
                        for (var keys = Object.keys(message.labels), i = 0; i < keys.length; ++i)
                            writer.uint32(/* id 2, wireType 2 =*/18).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.labels[keys[i]]).ldelim();
                    if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.type);
                    return writer;
                };
    
                /**
                 * Encodes the specified Metric message, length delimited. Does not implicitly {@link google.api.Metric.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.api.Metric
                 * @static
                 * @param {google.api.IMetric} message Metric message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Metric.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a Metric message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.api.Metric
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.api.Metric} Metric
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Metric.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.api.Metric(), key, value;
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 3:
                            message.type = reader.string();
                            break;
                        case 2:
                            if (message.labels === $util.emptyObject)
                                message.labels = {};
                            var end2 = reader.uint32() + reader.pos;
                            key = "";
                            value = "";
                            while (reader.pos < end2) {
                                var tag2 = reader.uint32();
                                switch (tag2 >>> 3) {
                                case 1:
                                    key = reader.string();
                                    break;
                                case 2:
                                    value = reader.string();
                                    break;
                                default:
                                    reader.skipType(tag2 & 7);
                                    break;
                                }
                            }
                            message.labels[key] = value;
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a Metric message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.api.Metric
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.api.Metric} Metric
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Metric.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a Metric message.
                 * @function verify
                 * @memberof google.api.Metric
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                Metric.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.type != null && message.hasOwnProperty("type"))
                        if (!$util.isString(message.type))
                            return "type: string expected";
                    if (message.labels != null && message.hasOwnProperty("labels")) {
                        if (!$util.isObject(message.labels))
                            return "labels: object expected";
                        var key = Object.keys(message.labels);
                        for (var i = 0; i < key.length; ++i)
                            if (!$util.isString(message.labels[key[i]]))
                                return "labels: string{k:string} expected";
                    }
                    return null;
                };
    
                /**
                 * Creates a Metric message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.api.Metric
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.api.Metric} Metric
                 */
                Metric.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.api.Metric)
                        return object;
                    var message = new $root.google.api.Metric();
                    if (object.type != null)
                        message.type = String(object.type);
                    if (object.labels) {
                        if (typeof object.labels !== "object")
                            throw TypeError(".google.api.Metric.labels: object expected");
                        message.labels = {};
                        for (var keys = Object.keys(object.labels), i = 0; i < keys.length; ++i)
                            message.labels[keys[i]] = String(object.labels[keys[i]]);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a Metric message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.api.Metric
                 * @static
                 * @param {google.api.Metric} message Metric
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                Metric.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.objects || options.defaults)
                        object.labels = {};
                    if (options.defaults)
                        object.type = "";
                    var keys2;
                    if (message.labels && (keys2 = Object.keys(message.labels)).length) {
                        object.labels = {};
                        for (var j = 0; j < keys2.length; ++j)
                            object.labels[keys2[j]] = message.labels[keys2[j]];
                    }
                    if (message.type != null && message.hasOwnProperty("type"))
                        object.type = message.type;
                    return object;
                };
    
                /**
                 * Converts this Metric to JSON.
                 * @function toJSON
                 * @memberof google.api.Metric
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                Metric.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return Metric;
            })();
    
            return api;
        })();
    
        google.rpc = (function() {
    
            /**
             * Namespace rpc.
             * @memberof google
             * @namespace
             */
            var rpc = {};
    
            rpc.Status = (function() {
    
                /**
                 * Properties of a Status.
                 * @memberof google.rpc
                 * @interface IStatus
                 * @property {number|null} [code] Status code
                 * @property {string|null} [message] Status message
                 * @property {Array.<google.protobuf.IAny>|null} [details] Status details
                 */
    
                /**
                 * Constructs a new Status.
                 * @memberof google.rpc
                 * @classdesc Represents a Status.
                 * @implements IStatus
                 * @constructor
                 * @param {google.rpc.IStatus=} [properties] Properties to set
                 */
                function Status(properties) {
                    this.details = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * Status code.
                 * @member {number} code
                 * @memberof google.rpc.Status
                 * @instance
                 */
                Status.prototype.code = 0;
    
                /**
                 * Status message.
                 * @member {string} message
                 * @memberof google.rpc.Status
                 * @instance
                 */
                Status.prototype.message = "";
    
                /**
                 * Status details.
                 * @member {Array.<google.protobuf.IAny>} details
                 * @memberof google.rpc.Status
                 * @instance
                 */
                Status.prototype.details = $util.emptyArray;
    
                /**
                 * Creates a new Status instance using the specified properties.
                 * @function create
                 * @memberof google.rpc.Status
                 * @static
                 * @param {google.rpc.IStatus=} [properties] Properties to set
                 * @returns {google.rpc.Status} Status instance
                 */
                Status.create = function create(properties) {
                    return new Status(properties);
                };
    
                /**
                 * Encodes the specified Status message. Does not implicitly {@link google.rpc.Status.verify|verify} messages.
                 * @function encode
                 * @memberof google.rpc.Status
                 * @static
                 * @param {google.rpc.IStatus} message Status message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Status.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.code != null && Object.hasOwnProperty.call(message, "code"))
                        writer.uint32(/* id 1, wireType 0 =*/8).int32(message.code);
                    if (message.message != null && Object.hasOwnProperty.call(message, "message"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.message);
                    if (message.details != null && message.details.length)
                        for (var i = 0; i < message.details.length; ++i)
                            $root.google.protobuf.Any.encode(message.details[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified Status message, length delimited. Does not implicitly {@link google.rpc.Status.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.rpc.Status
                 * @static
                 * @param {google.rpc.IStatus} message Status message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Status.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a Status message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.rpc.Status
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.rpc.Status} Status
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Status.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.rpc.Status();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.code = reader.int32();
                            break;
                        case 2:
                            message.message = reader.string();
                            break;
                        case 3:
                            if (!(message.details && message.details.length))
                                message.details = [];
                            message.details.push($root.google.protobuf.Any.decode(reader, reader.uint32()));
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a Status message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.rpc.Status
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.rpc.Status} Status
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Status.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a Status message.
                 * @function verify
                 * @memberof google.rpc.Status
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                Status.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.code != null && message.hasOwnProperty("code"))
                        if (!$util.isInteger(message.code))
                            return "code: integer expected";
                    if (message.message != null && message.hasOwnProperty("message"))
                        if (!$util.isString(message.message))
                            return "message: string expected";
                    if (message.details != null && message.hasOwnProperty("details")) {
                        if (!Array.isArray(message.details))
                            return "details: array expected";
                        for (var i = 0; i < message.details.length; ++i) {
                            var error = $root.google.protobuf.Any.verify(message.details[i]);
                            if (error)
                                return "details." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates a Status message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.rpc.Status
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.rpc.Status} Status
                 */
                Status.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.rpc.Status)
                        return object;
                    var message = new $root.google.rpc.Status();
                    if (object.code != null)
                        message.code = object.code | 0;
                    if (object.message != null)
                        message.message = String(object.message);
                    if (object.details) {
                        if (!Array.isArray(object.details))
                            throw TypeError(".google.rpc.Status.details: array expected");
                        message.details = [];
                        for (var i = 0; i < object.details.length; ++i) {
                            if (typeof object.details[i] !== "object")
                                throw TypeError(".google.rpc.Status.details: object expected");
                            message.details[i] = $root.google.protobuf.Any.fromObject(object.details[i]);
                        }
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a Status message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.rpc.Status
                 * @static
                 * @param {google.rpc.Status} message Status
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                Status.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.details = [];
                    if (options.defaults) {
                        object.code = 0;
                        object.message = "";
                    }
                    if (message.code != null && message.hasOwnProperty("code"))
                        object.code = message.code;
                    if (message.message != null && message.hasOwnProperty("message"))
                        object.message = message.message;
                    if (message.details && message.details.length) {
                        object.details = [];
                        for (var j = 0; j < message.details.length; ++j)
                            object.details[j] = $root.google.protobuf.Any.toObject(message.details[j], options);
                    }
                    return object;
                };
    
                /**
                 * Converts this Status to JSON.
                 * @function toJSON
                 * @memberof google.rpc.Status
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                Status.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return Status;
            })();
    
            return rpc;
        })();
    
        google.longrunning = (function() {
    
            /**
             * Namespace longrunning.
             * @memberof google
             * @namespace
             */
            var longrunning = {};
    
            longrunning.Operations = (function() {
    
                /**
                 * Constructs a new Operations service.
                 * @memberof google.longrunning
                 * @classdesc Represents an Operations
                 * @extends $protobuf.rpc.Service
                 * @constructor
                 * @param {$protobuf.RPCImpl} rpcImpl RPC implementation
                 * @param {boolean} [requestDelimited=false] Whether requests are length-delimited
                 * @param {boolean} [responseDelimited=false] Whether responses are length-delimited
                 */
                function Operations(rpcImpl, requestDelimited, responseDelimited) {
                    $protobuf.rpc.Service.call(this, rpcImpl, requestDelimited, responseDelimited);
                }
    
                (Operations.prototype = Object.create($protobuf.rpc.Service.prototype)).constructor = Operations;
    
                /**
                 * Creates new Operations service using the specified rpc implementation.
                 * @function create
                 * @memberof google.longrunning.Operations
                 * @static
                 * @param {$protobuf.RPCImpl} rpcImpl RPC implementation
                 * @param {boolean} [requestDelimited=false] Whether requests are length-delimited
                 * @param {boolean} [responseDelimited=false] Whether responses are length-delimited
                 * @returns {Operations} RPC service. Useful where requests and/or responses are streamed.
                 */
                Operations.create = function create(rpcImpl, requestDelimited, responseDelimited) {
                    return new this(rpcImpl, requestDelimited, responseDelimited);
                };
    
                /**
                 * Callback as used by {@link google.longrunning.Operations|listOperations}.
                 * @memberof google.longrunning.Operations
                 * @typedef ListOperationsCallback
                 * @type {function}
                 * @param {Error|null} error Error, if any
                 * @param {google.longrunning.ListOperationsResponse} [response] ListOperationsResponse
                 */
    
                /**
                 * Calls ListOperations.
                 * @function listOperations
                 * @memberof google.longrunning.Operations
                 * @instance
                 * @param {google.longrunning.IListOperationsRequest} request ListOperationsRequest message or plain object
                 * @param {google.longrunning.Operations.ListOperationsCallback} callback Node-style callback called with the error, if any, and ListOperationsResponse
                 * @returns {undefined}
                 * @variation 1
                 */
                Object.defineProperty(Operations.prototype.listOperations = function listOperations(request, callback) {
                    return this.rpcCall(listOperations, $root.google.longrunning.ListOperationsRequest, $root.google.longrunning.ListOperationsResponse, request, callback);
                }, "name", { value: "ListOperations" });
    
                /**
                 * Calls ListOperations.
                 * @function listOperations
                 * @memberof google.longrunning.Operations
                 * @instance
                 * @param {google.longrunning.IListOperationsRequest} request ListOperationsRequest message or plain object
                 * @returns {Promise<google.longrunning.ListOperationsResponse>} Promise
                 * @variation 2
                 */
    
                /**
                 * Callback as used by {@link google.longrunning.Operations|getOperation}.
                 * @memberof google.longrunning.Operations
                 * @typedef GetOperationCallback
                 * @type {function}
                 * @param {Error|null} error Error, if any
                 * @param {google.longrunning.Operation} [response] Operation
                 */
    
                /**
                 * Calls GetOperation.
                 * @function getOperation
                 * @memberof google.longrunning.Operations
                 * @instance
                 * @param {google.longrunning.IGetOperationRequest} request GetOperationRequest message or plain object
                 * @param {google.longrunning.Operations.GetOperationCallback} callback Node-style callback called with the error, if any, and Operation
                 * @returns {undefined}
                 * @variation 1
                 */
                Object.defineProperty(Operations.prototype.getOperation = function getOperation(request, callback) {
                    return this.rpcCall(getOperation, $root.google.longrunning.GetOperationRequest, $root.google.longrunning.Operation, request, callback);
                }, "name", { value: "GetOperation" });
    
                /**
                 * Calls GetOperation.
                 * @function getOperation
                 * @memberof google.longrunning.Operations
                 * @instance
                 * @param {google.longrunning.IGetOperationRequest} request GetOperationRequest message or plain object
                 * @returns {Promise<google.longrunning.Operation>} Promise
                 * @variation 2
                 */
    
                /**
                 * Callback as used by {@link google.longrunning.Operations|deleteOperation}.
                 * @memberof google.longrunning.Operations
                 * @typedef DeleteOperationCallback
                 * @type {function}
                 * @param {Error|null} error Error, if any
                 * @param {google.protobuf.Empty} [response] Empty
                 */
    
                /**
                 * Calls DeleteOperation.
                 * @function deleteOperation
                 * @memberof google.longrunning.Operations
                 * @instance
                 * @param {google.longrunning.IDeleteOperationRequest} request DeleteOperationRequest message or plain object
                 * @param {google.longrunning.Operations.DeleteOperationCallback} callback Node-style callback called with the error, if any, and Empty
                 * @returns {undefined}
                 * @variation 1
                 */
                Object.defineProperty(Operations.prototype.deleteOperation = function deleteOperation(request, callback) {
                    return this.rpcCall(deleteOperation, $root.google.longrunning.DeleteOperationRequest, $root.google.protobuf.Empty, request, callback);
                }, "name", { value: "DeleteOperation" });
    
                /**
                 * Calls DeleteOperation.
                 * @function deleteOperation
                 * @memberof google.longrunning.Operations
                 * @instance
                 * @param {google.longrunning.IDeleteOperationRequest} request DeleteOperationRequest message or plain object
                 * @returns {Promise<google.protobuf.Empty>} Promise
                 * @variation 2
                 */
    
                /**
                 * Callback as used by {@link google.longrunning.Operations|cancelOperation}.
                 * @memberof google.longrunning.Operations
                 * @typedef CancelOperationCallback
                 * @type {function}
                 * @param {Error|null} error Error, if any
                 * @param {google.protobuf.Empty} [response] Empty
                 */
    
                /**
                 * Calls CancelOperation.
                 * @function cancelOperation
                 * @memberof google.longrunning.Operations
                 * @instance
                 * @param {google.longrunning.ICancelOperationRequest} request CancelOperationRequest message or plain object
                 * @param {google.longrunning.Operations.CancelOperationCallback} callback Node-style callback called with the error, if any, and Empty
                 * @returns {undefined}
                 * @variation 1
                 */
                Object.defineProperty(Operations.prototype.cancelOperation = function cancelOperation(request, callback) {
                    return this.rpcCall(cancelOperation, $root.google.longrunning.CancelOperationRequest, $root.google.protobuf.Empty, request, callback);
                }, "name", { value: "CancelOperation" });
    
                /**
                 * Calls CancelOperation.
                 * @function cancelOperation
                 * @memberof google.longrunning.Operations
                 * @instance
                 * @param {google.longrunning.ICancelOperationRequest} request CancelOperationRequest message or plain object
                 * @returns {Promise<google.protobuf.Empty>} Promise
                 * @variation 2
                 */
    
                /**
                 * Callback as used by {@link google.longrunning.Operations|waitOperation}.
                 * @memberof google.longrunning.Operations
                 * @typedef WaitOperationCallback
                 * @type {function}
                 * @param {Error|null} error Error, if any
                 * @param {google.longrunning.Operation} [response] Operation
                 */
    
                /**
                 * Calls WaitOperation.
                 * @function waitOperation
                 * @memberof google.longrunning.Operations
                 * @instance
                 * @param {google.longrunning.IWaitOperationRequest} request WaitOperationRequest message or plain object
                 * @param {google.longrunning.Operations.WaitOperationCallback} callback Node-style callback called with the error, if any, and Operation
                 * @returns {undefined}
                 * @variation 1
                 */
                Object.defineProperty(Operations.prototype.waitOperation = function waitOperation(request, callback) {
                    return this.rpcCall(waitOperation, $root.google.longrunning.WaitOperationRequest, $root.google.longrunning.Operation, request, callback);
                }, "name", { value: "WaitOperation" });
    
                /**
                 * Calls WaitOperation.
                 * @function waitOperation
                 * @memberof google.longrunning.Operations
                 * @instance
                 * @param {google.longrunning.IWaitOperationRequest} request WaitOperationRequest message or plain object
                 * @returns {Promise<google.longrunning.Operation>} Promise
                 * @variation 2
                 */
    
                return Operations;
            })();
    
            longrunning.Operation = (function() {
    
                /**
                 * Properties of an Operation.
                 * @memberof google.longrunning
                 * @interface IOperation
                 * @property {string|null} [name] Operation name
                 * @property {google.protobuf.IAny|null} [metadata] Operation metadata
                 * @property {boolean|null} [done] Operation done
                 * @property {google.rpc.IStatus|null} [error] Operation error
                 * @property {google.protobuf.IAny|null} [response] Operation response
                 */
    
                /**
                 * Constructs a new Operation.
                 * @memberof google.longrunning
                 * @classdesc Represents an Operation.
                 * @implements IOperation
                 * @constructor
                 * @param {google.longrunning.IOperation=} [properties] Properties to set
                 */
                function Operation(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * Operation name.
                 * @member {string} name
                 * @memberof google.longrunning.Operation
                 * @instance
                 */
                Operation.prototype.name = "";
    
                /**
                 * Operation metadata.
                 * @member {google.protobuf.IAny|null|undefined} metadata
                 * @memberof google.longrunning.Operation
                 * @instance
                 */
                Operation.prototype.metadata = null;
    
                /**
                 * Operation done.
                 * @member {boolean} done
                 * @memberof google.longrunning.Operation
                 * @instance
                 */
                Operation.prototype.done = false;
    
                /**
                 * Operation error.
                 * @member {google.rpc.IStatus|null|undefined} error
                 * @memberof google.longrunning.Operation
                 * @instance
                 */
                Operation.prototype.error = null;
    
                /**
                 * Operation response.
                 * @member {google.protobuf.IAny|null|undefined} response
                 * @memberof google.longrunning.Operation
                 * @instance
                 */
                Operation.prototype.response = null;
    
                // OneOf field names bound to virtual getters and setters
                var $oneOfFields;
    
                /**
                 * Operation result.
                 * @member {"error"|"response"|undefined} result
                 * @memberof google.longrunning.Operation
                 * @instance
                 */
                Object.defineProperty(Operation.prototype, "result", {
                    get: $util.oneOfGetter($oneOfFields = ["error", "response"]),
                    set: $util.oneOfSetter($oneOfFields)
                });
    
                /**
                 * Creates a new Operation instance using the specified properties.
                 * @function create
                 * @memberof google.longrunning.Operation
                 * @static
                 * @param {google.longrunning.IOperation=} [properties] Properties to set
                 * @returns {google.longrunning.Operation} Operation instance
                 */
                Operation.create = function create(properties) {
                    return new Operation(properties);
                };
    
                /**
                 * Encodes the specified Operation message. Does not implicitly {@link google.longrunning.Operation.verify|verify} messages.
                 * @function encode
                 * @memberof google.longrunning.Operation
                 * @static
                 * @param {google.longrunning.IOperation} message Operation message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Operation.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata"))
                        $root.google.protobuf.Any.encode(message.metadata, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                    if (message.done != null && Object.hasOwnProperty.call(message, "done"))
                        writer.uint32(/* id 3, wireType 0 =*/24).bool(message.done);
                    if (message.error != null && Object.hasOwnProperty.call(message, "error"))
                        $root.google.rpc.Status.encode(message.error, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
                    if (message.response != null && Object.hasOwnProperty.call(message, "response"))
                        $root.google.protobuf.Any.encode(message.response, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified Operation message, length delimited. Does not implicitly {@link google.longrunning.Operation.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.longrunning.Operation
                 * @static
                 * @param {google.longrunning.IOperation} message Operation message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                Operation.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an Operation message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.longrunning.Operation
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.longrunning.Operation} Operation
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Operation.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.longrunning.Operation();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.name = reader.string();
                            break;
                        case 2:
                            message.metadata = $root.google.protobuf.Any.decode(reader, reader.uint32());
                            break;
                        case 3:
                            message.done = reader.bool();
                            break;
                        case 4:
                            message.error = $root.google.rpc.Status.decode(reader, reader.uint32());
                            break;
                        case 5:
                            message.response = $root.google.protobuf.Any.decode(reader, reader.uint32());
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an Operation message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.longrunning.Operation
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.longrunning.Operation} Operation
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                Operation.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an Operation message.
                 * @function verify
                 * @memberof google.longrunning.Operation
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                Operation.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    var properties = {};
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    if (message.metadata != null && message.hasOwnProperty("metadata")) {
                        var error = $root.google.protobuf.Any.verify(message.metadata);
                        if (error)
                            return "metadata." + error;
                    }
                    if (message.done != null && message.hasOwnProperty("done"))
                        if (typeof message.done !== "boolean")
                            return "done: boolean expected";
                    if (message.error != null && message.hasOwnProperty("error")) {
                        properties.result = 1;
                        {
                            var error = $root.google.rpc.Status.verify(message.error);
                            if (error)
                                return "error." + error;
                        }
                    }
                    if (message.response != null && message.hasOwnProperty("response")) {
                        if (properties.result === 1)
                            return "result: multiple values";
                        properties.result = 1;
                        {
                            var error = $root.google.protobuf.Any.verify(message.response);
                            if (error)
                                return "response." + error;
                        }
                    }
                    return null;
                };
    
                /**
                 * Creates an Operation message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.longrunning.Operation
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.longrunning.Operation} Operation
                 */
                Operation.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.longrunning.Operation)
                        return object;
                    var message = new $root.google.longrunning.Operation();
                    if (object.name != null)
                        message.name = String(object.name);
                    if (object.metadata != null) {
                        if (typeof object.metadata !== "object")
                            throw TypeError(".google.longrunning.Operation.metadata: object expected");
                        message.metadata = $root.google.protobuf.Any.fromObject(object.metadata);
                    }
                    if (object.done != null)
                        message.done = Boolean(object.done);
                    if (object.error != null) {
                        if (typeof object.error !== "object")
                            throw TypeError(".google.longrunning.Operation.error: object expected");
                        message.error = $root.google.rpc.Status.fromObject(object.error);
                    }
                    if (object.response != null) {
                        if (typeof object.response !== "object")
                            throw TypeError(".google.longrunning.Operation.response: object expected");
                        message.response = $root.google.protobuf.Any.fromObject(object.response);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from an Operation message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.longrunning.Operation
                 * @static
                 * @param {google.longrunning.Operation} message Operation
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                Operation.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.name = "";
                        object.metadata = null;
                        object.done = false;
                    }
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    if (message.metadata != null && message.hasOwnProperty("metadata"))
                        object.metadata = $root.google.protobuf.Any.toObject(message.metadata, options);
                    if (message.done != null && message.hasOwnProperty("done"))
                        object.done = message.done;
                    if (message.error != null && message.hasOwnProperty("error")) {
                        object.error = $root.google.rpc.Status.toObject(message.error, options);
                        if (options.oneofs)
                            object.result = "error";
                    }
                    if (message.response != null && message.hasOwnProperty("response")) {
                        object.response = $root.google.protobuf.Any.toObject(message.response, options);
                        if (options.oneofs)
                            object.result = "response";
                    }
                    return object;
                };
    
                /**
                 * Converts this Operation to JSON.
                 * @function toJSON
                 * @memberof google.longrunning.Operation
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                Operation.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return Operation;
            })();
    
            longrunning.GetOperationRequest = (function() {
    
                /**
                 * Properties of a GetOperationRequest.
                 * @memberof google.longrunning
                 * @interface IGetOperationRequest
                 * @property {string|null} [name] GetOperationRequest name
                 */
    
                /**
                 * Constructs a new GetOperationRequest.
                 * @memberof google.longrunning
                 * @classdesc Represents a GetOperationRequest.
                 * @implements IGetOperationRequest
                 * @constructor
                 * @param {google.longrunning.IGetOperationRequest=} [properties] Properties to set
                 */
                function GetOperationRequest(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * GetOperationRequest name.
                 * @member {string} name
                 * @memberof google.longrunning.GetOperationRequest
                 * @instance
                 */
                GetOperationRequest.prototype.name = "";
    
                /**
                 * Creates a new GetOperationRequest instance using the specified properties.
                 * @function create
                 * @memberof google.longrunning.GetOperationRequest
                 * @static
                 * @param {google.longrunning.IGetOperationRequest=} [properties] Properties to set
                 * @returns {google.longrunning.GetOperationRequest} GetOperationRequest instance
                 */
                GetOperationRequest.create = function create(properties) {
                    return new GetOperationRequest(properties);
                };
    
                /**
                 * Encodes the specified GetOperationRequest message. Does not implicitly {@link google.longrunning.GetOperationRequest.verify|verify} messages.
                 * @function encode
                 * @memberof google.longrunning.GetOperationRequest
                 * @static
                 * @param {google.longrunning.IGetOperationRequest} message GetOperationRequest message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                GetOperationRequest.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    return writer;
                };
    
                /**
                 * Encodes the specified GetOperationRequest message, length delimited. Does not implicitly {@link google.longrunning.GetOperationRequest.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.longrunning.GetOperationRequest
                 * @static
                 * @param {google.longrunning.IGetOperationRequest} message GetOperationRequest message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                GetOperationRequest.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a GetOperationRequest message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.longrunning.GetOperationRequest
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.longrunning.GetOperationRequest} GetOperationRequest
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                GetOperationRequest.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.longrunning.GetOperationRequest();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.name = reader.string();
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a GetOperationRequest message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.longrunning.GetOperationRequest
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.longrunning.GetOperationRequest} GetOperationRequest
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                GetOperationRequest.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a GetOperationRequest message.
                 * @function verify
                 * @memberof google.longrunning.GetOperationRequest
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                GetOperationRequest.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    return null;
                };
    
                /**
                 * Creates a GetOperationRequest message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.longrunning.GetOperationRequest
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.longrunning.GetOperationRequest} GetOperationRequest
                 */
                GetOperationRequest.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.longrunning.GetOperationRequest)
                        return object;
                    var message = new $root.google.longrunning.GetOperationRequest();
                    if (object.name != null)
                        message.name = String(object.name);
                    return message;
                };
    
                /**
                 * Creates a plain object from a GetOperationRequest message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.longrunning.GetOperationRequest
                 * @static
                 * @param {google.longrunning.GetOperationRequest} message GetOperationRequest
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                GetOperationRequest.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults)
                        object.name = "";
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    return object;
                };
    
                /**
                 * Converts this GetOperationRequest to JSON.
                 * @function toJSON
                 * @memberof google.longrunning.GetOperationRequest
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                GetOperationRequest.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return GetOperationRequest;
            })();
    
            longrunning.ListOperationsRequest = (function() {
    
                /**
                 * Properties of a ListOperationsRequest.
                 * @memberof google.longrunning
                 * @interface IListOperationsRequest
                 * @property {string|null} [name] ListOperationsRequest name
                 * @property {string|null} [filter] ListOperationsRequest filter
                 * @property {number|null} [pageSize] ListOperationsRequest pageSize
                 * @property {string|null} [pageToken] ListOperationsRequest pageToken
                 */
    
                /**
                 * Constructs a new ListOperationsRequest.
                 * @memberof google.longrunning
                 * @classdesc Represents a ListOperationsRequest.
                 * @implements IListOperationsRequest
                 * @constructor
                 * @param {google.longrunning.IListOperationsRequest=} [properties] Properties to set
                 */
                function ListOperationsRequest(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * ListOperationsRequest name.
                 * @member {string} name
                 * @memberof google.longrunning.ListOperationsRequest
                 * @instance
                 */
                ListOperationsRequest.prototype.name = "";
    
                /**
                 * ListOperationsRequest filter.
                 * @member {string} filter
                 * @memberof google.longrunning.ListOperationsRequest
                 * @instance
                 */
                ListOperationsRequest.prototype.filter = "";
    
                /**
                 * ListOperationsRequest pageSize.
                 * @member {number} pageSize
                 * @memberof google.longrunning.ListOperationsRequest
                 * @instance
                 */
                ListOperationsRequest.prototype.pageSize = 0;
    
                /**
                 * ListOperationsRequest pageToken.
                 * @member {string} pageToken
                 * @memberof google.longrunning.ListOperationsRequest
                 * @instance
                 */
                ListOperationsRequest.prototype.pageToken = "";
    
                /**
                 * Creates a new ListOperationsRequest instance using the specified properties.
                 * @function create
                 * @memberof google.longrunning.ListOperationsRequest
                 * @static
                 * @param {google.longrunning.IListOperationsRequest=} [properties] Properties to set
                 * @returns {google.longrunning.ListOperationsRequest} ListOperationsRequest instance
                 */
                ListOperationsRequest.create = function create(properties) {
                    return new ListOperationsRequest(properties);
                };
    
                /**
                 * Encodes the specified ListOperationsRequest message. Does not implicitly {@link google.longrunning.ListOperationsRequest.verify|verify} messages.
                 * @function encode
                 * @memberof google.longrunning.ListOperationsRequest
                 * @static
                 * @param {google.longrunning.IListOperationsRequest} message ListOperationsRequest message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ListOperationsRequest.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.filter != null && Object.hasOwnProperty.call(message, "filter"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.filter);
                    if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
                        writer.uint32(/* id 2, wireType 0 =*/16).int32(message.pageSize);
                    if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
                        writer.uint32(/* id 3, wireType 2 =*/26).string(message.pageToken);
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 4, wireType 2 =*/34).string(message.name);
                    return writer;
                };
    
                /**
                 * Encodes the specified ListOperationsRequest message, length delimited. Does not implicitly {@link google.longrunning.ListOperationsRequest.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.longrunning.ListOperationsRequest
                 * @static
                 * @param {google.longrunning.IListOperationsRequest} message ListOperationsRequest message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ListOperationsRequest.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a ListOperationsRequest message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.longrunning.ListOperationsRequest
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.longrunning.ListOperationsRequest} ListOperationsRequest
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ListOperationsRequest.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.longrunning.ListOperationsRequest();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 4:
                            message.name = reader.string();
                            break;
                        case 1:
                            message.filter = reader.string();
                            break;
                        case 2:
                            message.pageSize = reader.int32();
                            break;
                        case 3:
                            message.pageToken = reader.string();
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a ListOperationsRequest message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.longrunning.ListOperationsRequest
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.longrunning.ListOperationsRequest} ListOperationsRequest
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ListOperationsRequest.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a ListOperationsRequest message.
                 * @function verify
                 * @memberof google.longrunning.ListOperationsRequest
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                ListOperationsRequest.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    if (message.filter != null && message.hasOwnProperty("filter"))
                        if (!$util.isString(message.filter))
                            return "filter: string expected";
                    if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                        if (!$util.isInteger(message.pageSize))
                            return "pageSize: integer expected";
                    if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                        if (!$util.isString(message.pageToken))
                            return "pageToken: string expected";
                    return null;
                };
    
                /**
                 * Creates a ListOperationsRequest message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.longrunning.ListOperationsRequest
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.longrunning.ListOperationsRequest} ListOperationsRequest
                 */
                ListOperationsRequest.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.longrunning.ListOperationsRequest)
                        return object;
                    var message = new $root.google.longrunning.ListOperationsRequest();
                    if (object.name != null)
                        message.name = String(object.name);
                    if (object.filter != null)
                        message.filter = String(object.filter);
                    if (object.pageSize != null)
                        message.pageSize = object.pageSize | 0;
                    if (object.pageToken != null)
                        message.pageToken = String(object.pageToken);
                    return message;
                };
    
                /**
                 * Creates a plain object from a ListOperationsRequest message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.longrunning.ListOperationsRequest
                 * @static
                 * @param {google.longrunning.ListOperationsRequest} message ListOperationsRequest
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                ListOperationsRequest.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.filter = "";
                        object.pageSize = 0;
                        object.pageToken = "";
                        object.name = "";
                    }
                    if (message.filter != null && message.hasOwnProperty("filter"))
                        object.filter = message.filter;
                    if (message.pageSize != null && message.hasOwnProperty("pageSize"))
                        object.pageSize = message.pageSize;
                    if (message.pageToken != null && message.hasOwnProperty("pageToken"))
                        object.pageToken = message.pageToken;
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    return object;
                };
    
                /**
                 * Converts this ListOperationsRequest to JSON.
                 * @function toJSON
                 * @memberof google.longrunning.ListOperationsRequest
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                ListOperationsRequest.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return ListOperationsRequest;
            })();
    
            longrunning.ListOperationsResponse = (function() {
    
                /**
                 * Properties of a ListOperationsResponse.
                 * @memberof google.longrunning
                 * @interface IListOperationsResponse
                 * @property {Array.<google.longrunning.IOperation>|null} [operations] ListOperationsResponse operations
                 * @property {string|null} [nextPageToken] ListOperationsResponse nextPageToken
                 */
    
                /**
                 * Constructs a new ListOperationsResponse.
                 * @memberof google.longrunning
                 * @classdesc Represents a ListOperationsResponse.
                 * @implements IListOperationsResponse
                 * @constructor
                 * @param {google.longrunning.IListOperationsResponse=} [properties] Properties to set
                 */
                function ListOperationsResponse(properties) {
                    this.operations = [];
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * ListOperationsResponse operations.
                 * @member {Array.<google.longrunning.IOperation>} operations
                 * @memberof google.longrunning.ListOperationsResponse
                 * @instance
                 */
                ListOperationsResponse.prototype.operations = $util.emptyArray;
    
                /**
                 * ListOperationsResponse nextPageToken.
                 * @member {string} nextPageToken
                 * @memberof google.longrunning.ListOperationsResponse
                 * @instance
                 */
                ListOperationsResponse.prototype.nextPageToken = "";
    
                /**
                 * Creates a new ListOperationsResponse instance using the specified properties.
                 * @function create
                 * @memberof google.longrunning.ListOperationsResponse
                 * @static
                 * @param {google.longrunning.IListOperationsResponse=} [properties] Properties to set
                 * @returns {google.longrunning.ListOperationsResponse} ListOperationsResponse instance
                 */
                ListOperationsResponse.create = function create(properties) {
                    return new ListOperationsResponse(properties);
                };
    
                /**
                 * Encodes the specified ListOperationsResponse message. Does not implicitly {@link google.longrunning.ListOperationsResponse.verify|verify} messages.
                 * @function encode
                 * @memberof google.longrunning.ListOperationsResponse
                 * @static
                 * @param {google.longrunning.IListOperationsResponse} message ListOperationsResponse message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ListOperationsResponse.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.operations != null && message.operations.length)
                        for (var i = 0; i < message.operations.length; ++i)
                            $root.google.longrunning.Operation.encode(message.operations[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
                    if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
                    return writer;
                };
    
                /**
                 * Encodes the specified ListOperationsResponse message, length delimited. Does not implicitly {@link google.longrunning.ListOperationsResponse.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.longrunning.ListOperationsResponse
                 * @static
                 * @param {google.longrunning.IListOperationsResponse} message ListOperationsResponse message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                ListOperationsResponse.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a ListOperationsResponse message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.longrunning.ListOperationsResponse
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.longrunning.ListOperationsResponse} ListOperationsResponse
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ListOperationsResponse.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.longrunning.ListOperationsResponse();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            if (!(message.operations && message.operations.length))
                                message.operations = [];
                            message.operations.push($root.google.longrunning.Operation.decode(reader, reader.uint32()));
                            break;
                        case 2:
                            message.nextPageToken = reader.string();
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a ListOperationsResponse message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.longrunning.ListOperationsResponse
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.longrunning.ListOperationsResponse} ListOperationsResponse
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                ListOperationsResponse.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a ListOperationsResponse message.
                 * @function verify
                 * @memberof google.longrunning.ListOperationsResponse
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                ListOperationsResponse.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.operations != null && message.hasOwnProperty("operations")) {
                        if (!Array.isArray(message.operations))
                            return "operations: array expected";
                        for (var i = 0; i < message.operations.length; ++i) {
                            var error = $root.google.longrunning.Operation.verify(message.operations[i]);
                            if (error)
                                return "operations." + error;
                        }
                    }
                    if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                        if (!$util.isString(message.nextPageToken))
                            return "nextPageToken: string expected";
                    return null;
                };
    
                /**
                 * Creates a ListOperationsResponse message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.longrunning.ListOperationsResponse
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.longrunning.ListOperationsResponse} ListOperationsResponse
                 */
                ListOperationsResponse.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.longrunning.ListOperationsResponse)
                        return object;
                    var message = new $root.google.longrunning.ListOperationsResponse();
                    if (object.operations) {
                        if (!Array.isArray(object.operations))
                            throw TypeError(".google.longrunning.ListOperationsResponse.operations: array expected");
                        message.operations = [];
                        for (var i = 0; i < object.operations.length; ++i) {
                            if (typeof object.operations[i] !== "object")
                                throw TypeError(".google.longrunning.ListOperationsResponse.operations: object expected");
                            message.operations[i] = $root.google.longrunning.Operation.fromObject(object.operations[i]);
                        }
                    }
                    if (object.nextPageToken != null)
                        message.nextPageToken = String(object.nextPageToken);
                    return message;
                };
    
                /**
                 * Creates a plain object from a ListOperationsResponse message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.longrunning.ListOperationsResponse
                 * @static
                 * @param {google.longrunning.ListOperationsResponse} message ListOperationsResponse
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                ListOperationsResponse.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.arrays || options.defaults)
                        object.operations = [];
                    if (options.defaults)
                        object.nextPageToken = "";
                    if (message.operations && message.operations.length) {
                        object.operations = [];
                        for (var j = 0; j < message.operations.length; ++j)
                            object.operations[j] = $root.google.longrunning.Operation.toObject(message.operations[j], options);
                    }
                    if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
                        object.nextPageToken = message.nextPageToken;
                    return object;
                };
    
                /**
                 * Converts this ListOperationsResponse to JSON.
                 * @function toJSON
                 * @memberof google.longrunning.ListOperationsResponse
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                ListOperationsResponse.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return ListOperationsResponse;
            })();
    
            longrunning.CancelOperationRequest = (function() {
    
                /**
                 * Properties of a CancelOperationRequest.
                 * @memberof google.longrunning
                 * @interface ICancelOperationRequest
                 * @property {string|null} [name] CancelOperationRequest name
                 */
    
                /**
                 * Constructs a new CancelOperationRequest.
                 * @memberof google.longrunning
                 * @classdesc Represents a CancelOperationRequest.
                 * @implements ICancelOperationRequest
                 * @constructor
                 * @param {google.longrunning.ICancelOperationRequest=} [properties] Properties to set
                 */
                function CancelOperationRequest(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * CancelOperationRequest name.
                 * @member {string} name
                 * @memberof google.longrunning.CancelOperationRequest
                 * @instance
                 */
                CancelOperationRequest.prototype.name = "";
    
                /**
                 * Creates a new CancelOperationRequest instance using the specified properties.
                 * @function create
                 * @memberof google.longrunning.CancelOperationRequest
                 * @static
                 * @param {google.longrunning.ICancelOperationRequest=} [properties] Properties to set
                 * @returns {google.longrunning.CancelOperationRequest} CancelOperationRequest instance
                 */
                CancelOperationRequest.create = function create(properties) {
                    return new CancelOperationRequest(properties);
                };
    
                /**
                 * Encodes the specified CancelOperationRequest message. Does not implicitly {@link google.longrunning.CancelOperationRequest.verify|verify} messages.
                 * @function encode
                 * @memberof google.longrunning.CancelOperationRequest
                 * @static
                 * @param {google.longrunning.ICancelOperationRequest} message CancelOperationRequest message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                CancelOperationRequest.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    return writer;
                };
    
                /**
                 * Encodes the specified CancelOperationRequest message, length delimited. Does not implicitly {@link google.longrunning.CancelOperationRequest.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.longrunning.CancelOperationRequest
                 * @static
                 * @param {google.longrunning.ICancelOperationRequest} message CancelOperationRequest message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                CancelOperationRequest.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a CancelOperationRequest message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.longrunning.CancelOperationRequest
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.longrunning.CancelOperationRequest} CancelOperationRequest
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                CancelOperationRequest.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.longrunning.CancelOperationRequest();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.name = reader.string();
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a CancelOperationRequest message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.longrunning.CancelOperationRequest
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.longrunning.CancelOperationRequest} CancelOperationRequest
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                CancelOperationRequest.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a CancelOperationRequest message.
                 * @function verify
                 * @memberof google.longrunning.CancelOperationRequest
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                CancelOperationRequest.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    return null;
                };
    
                /**
                 * Creates a CancelOperationRequest message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.longrunning.CancelOperationRequest
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.longrunning.CancelOperationRequest} CancelOperationRequest
                 */
                CancelOperationRequest.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.longrunning.CancelOperationRequest)
                        return object;
                    var message = new $root.google.longrunning.CancelOperationRequest();
                    if (object.name != null)
                        message.name = String(object.name);
                    return message;
                };
    
                /**
                 * Creates a plain object from a CancelOperationRequest message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.longrunning.CancelOperationRequest
                 * @static
                 * @param {google.longrunning.CancelOperationRequest} message CancelOperationRequest
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                CancelOperationRequest.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults)
                        object.name = "";
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    return object;
                };
    
                /**
                 * Converts this CancelOperationRequest to JSON.
                 * @function toJSON
                 * @memberof google.longrunning.CancelOperationRequest
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                CancelOperationRequest.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return CancelOperationRequest;
            })();
    
            longrunning.DeleteOperationRequest = (function() {
    
                /**
                 * Properties of a DeleteOperationRequest.
                 * @memberof google.longrunning
                 * @interface IDeleteOperationRequest
                 * @property {string|null} [name] DeleteOperationRequest name
                 */
    
                /**
                 * Constructs a new DeleteOperationRequest.
                 * @memberof google.longrunning
                 * @classdesc Represents a DeleteOperationRequest.
                 * @implements IDeleteOperationRequest
                 * @constructor
                 * @param {google.longrunning.IDeleteOperationRequest=} [properties] Properties to set
                 */
                function DeleteOperationRequest(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * DeleteOperationRequest name.
                 * @member {string} name
                 * @memberof google.longrunning.DeleteOperationRequest
                 * @instance
                 */
                DeleteOperationRequest.prototype.name = "";
    
                /**
                 * Creates a new DeleteOperationRequest instance using the specified properties.
                 * @function create
                 * @memberof google.longrunning.DeleteOperationRequest
                 * @static
                 * @param {google.longrunning.IDeleteOperationRequest=} [properties] Properties to set
                 * @returns {google.longrunning.DeleteOperationRequest} DeleteOperationRequest instance
                 */
                DeleteOperationRequest.create = function create(properties) {
                    return new DeleteOperationRequest(properties);
                };
    
                /**
                 * Encodes the specified DeleteOperationRequest message. Does not implicitly {@link google.longrunning.DeleteOperationRequest.verify|verify} messages.
                 * @function encode
                 * @memberof google.longrunning.DeleteOperationRequest
                 * @static
                 * @param {google.longrunning.IDeleteOperationRequest} message DeleteOperationRequest message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                DeleteOperationRequest.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    return writer;
                };
    
                /**
                 * Encodes the specified DeleteOperationRequest message, length delimited. Does not implicitly {@link google.longrunning.DeleteOperationRequest.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.longrunning.DeleteOperationRequest
                 * @static
                 * @param {google.longrunning.IDeleteOperationRequest} message DeleteOperationRequest message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                DeleteOperationRequest.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a DeleteOperationRequest message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.longrunning.DeleteOperationRequest
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.longrunning.DeleteOperationRequest} DeleteOperationRequest
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                DeleteOperationRequest.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.longrunning.DeleteOperationRequest();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.name = reader.string();
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a DeleteOperationRequest message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.longrunning.DeleteOperationRequest
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.longrunning.DeleteOperationRequest} DeleteOperationRequest
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                DeleteOperationRequest.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a DeleteOperationRequest message.
                 * @function verify
                 * @memberof google.longrunning.DeleteOperationRequest
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                DeleteOperationRequest.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    return null;
                };
    
                /**
                 * Creates a DeleteOperationRequest message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.longrunning.DeleteOperationRequest
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.longrunning.DeleteOperationRequest} DeleteOperationRequest
                 */
                DeleteOperationRequest.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.longrunning.DeleteOperationRequest)
                        return object;
                    var message = new $root.google.longrunning.DeleteOperationRequest();
                    if (object.name != null)
                        message.name = String(object.name);
                    return message;
                };
    
                /**
                 * Creates a plain object from a DeleteOperationRequest message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.longrunning.DeleteOperationRequest
                 * @static
                 * @param {google.longrunning.DeleteOperationRequest} message DeleteOperationRequest
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                DeleteOperationRequest.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults)
                        object.name = "";
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    return object;
                };
    
                /**
                 * Converts this DeleteOperationRequest to JSON.
                 * @function toJSON
                 * @memberof google.longrunning.DeleteOperationRequest
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                DeleteOperationRequest.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return DeleteOperationRequest;
            })();
    
            longrunning.WaitOperationRequest = (function() {
    
                /**
                 * Properties of a WaitOperationRequest.
                 * @memberof google.longrunning
                 * @interface IWaitOperationRequest
                 * @property {string|null} [name] WaitOperationRequest name
                 * @property {google.protobuf.IDuration|null} [timeout] WaitOperationRequest timeout
                 */
    
                /**
                 * Constructs a new WaitOperationRequest.
                 * @memberof google.longrunning
                 * @classdesc Represents a WaitOperationRequest.
                 * @implements IWaitOperationRequest
                 * @constructor
                 * @param {google.longrunning.IWaitOperationRequest=} [properties] Properties to set
                 */
                function WaitOperationRequest(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * WaitOperationRequest name.
                 * @member {string} name
                 * @memberof google.longrunning.WaitOperationRequest
                 * @instance
                 */
                WaitOperationRequest.prototype.name = "";
    
                /**
                 * WaitOperationRequest timeout.
                 * @member {google.protobuf.IDuration|null|undefined} timeout
                 * @memberof google.longrunning.WaitOperationRequest
                 * @instance
                 */
                WaitOperationRequest.prototype.timeout = null;
    
                /**
                 * Creates a new WaitOperationRequest instance using the specified properties.
                 * @function create
                 * @memberof google.longrunning.WaitOperationRequest
                 * @static
                 * @param {google.longrunning.IWaitOperationRequest=} [properties] Properties to set
                 * @returns {google.longrunning.WaitOperationRequest} WaitOperationRequest instance
                 */
                WaitOperationRequest.create = function create(properties) {
                    return new WaitOperationRequest(properties);
                };
    
                /**
                 * Encodes the specified WaitOperationRequest message. Does not implicitly {@link google.longrunning.WaitOperationRequest.verify|verify} messages.
                 * @function encode
                 * @memberof google.longrunning.WaitOperationRequest
                 * @static
                 * @param {google.longrunning.IWaitOperationRequest} message WaitOperationRequest message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                WaitOperationRequest.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                    if (message.timeout != null && Object.hasOwnProperty.call(message, "timeout"))
                        $root.google.protobuf.Duration.encode(message.timeout, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
                    return writer;
                };
    
                /**
                 * Encodes the specified WaitOperationRequest message, length delimited. Does not implicitly {@link google.longrunning.WaitOperationRequest.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.longrunning.WaitOperationRequest
                 * @static
                 * @param {google.longrunning.IWaitOperationRequest} message WaitOperationRequest message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                WaitOperationRequest.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes a WaitOperationRequest message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.longrunning.WaitOperationRequest
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.longrunning.WaitOperationRequest} WaitOperationRequest
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                WaitOperationRequest.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.longrunning.WaitOperationRequest();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.name = reader.string();
                            break;
                        case 2:
                            message.timeout = $root.google.protobuf.Duration.decode(reader, reader.uint32());
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes a WaitOperationRequest message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.longrunning.WaitOperationRequest
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.longrunning.WaitOperationRequest} WaitOperationRequest
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                WaitOperationRequest.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies a WaitOperationRequest message.
                 * @function verify
                 * @memberof google.longrunning.WaitOperationRequest
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                WaitOperationRequest.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.name != null && message.hasOwnProperty("name"))
                        if (!$util.isString(message.name))
                            return "name: string expected";
                    if (message.timeout != null && message.hasOwnProperty("timeout")) {
                        var error = $root.google.protobuf.Duration.verify(message.timeout);
                        if (error)
                            return "timeout." + error;
                    }
                    return null;
                };
    
                /**
                 * Creates a WaitOperationRequest message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.longrunning.WaitOperationRequest
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.longrunning.WaitOperationRequest} WaitOperationRequest
                 */
                WaitOperationRequest.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.longrunning.WaitOperationRequest)
                        return object;
                    var message = new $root.google.longrunning.WaitOperationRequest();
                    if (object.name != null)
                        message.name = String(object.name);
                    if (object.timeout != null) {
                        if (typeof object.timeout !== "object")
                            throw TypeError(".google.longrunning.WaitOperationRequest.timeout: object expected");
                        message.timeout = $root.google.protobuf.Duration.fromObject(object.timeout);
                    }
                    return message;
                };
    
                /**
                 * Creates a plain object from a WaitOperationRequest message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.longrunning.WaitOperationRequest
                 * @static
                 * @param {google.longrunning.WaitOperationRequest} message WaitOperationRequest
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                WaitOperationRequest.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.name = "";
                        object.timeout = null;
                    }
                    if (message.name != null && message.hasOwnProperty("name"))
                        object.name = message.name;
                    if (message.timeout != null && message.hasOwnProperty("timeout"))
                        object.timeout = $root.google.protobuf.Duration.toObject(message.timeout, options);
                    return object;
                };
    
                /**
                 * Converts this WaitOperationRequest to JSON.
                 * @function toJSON
                 * @memberof google.longrunning.WaitOperationRequest
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                WaitOperationRequest.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return WaitOperationRequest;
            })();
    
            longrunning.OperationInfo = (function() {
    
                /**
                 * Properties of an OperationInfo.
                 * @memberof google.longrunning
                 * @interface IOperationInfo
                 * @property {string|null} [responseType] OperationInfo responseType
                 * @property {string|null} [metadataType] OperationInfo metadataType
                 */
    
                /**
                 * Constructs a new OperationInfo.
                 * @memberof google.longrunning
                 * @classdesc Represents an OperationInfo.
                 * @implements IOperationInfo
                 * @constructor
                 * @param {google.longrunning.IOperationInfo=} [properties] Properties to set
                 */
                function OperationInfo(properties) {
                    if (properties)
                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                            if (properties[keys[i]] != null)
                                this[keys[i]] = properties[keys[i]];
                }
    
                /**
                 * OperationInfo responseType.
                 * @member {string} responseType
                 * @memberof google.longrunning.OperationInfo
                 * @instance
                 */
                OperationInfo.prototype.responseType = "";
    
                /**
                 * OperationInfo metadataType.
                 * @member {string} metadataType
                 * @memberof google.longrunning.OperationInfo
                 * @instance
                 */
                OperationInfo.prototype.metadataType = "";
    
                /**
                 * Creates a new OperationInfo instance using the specified properties.
                 * @function create
                 * @memberof google.longrunning.OperationInfo
                 * @static
                 * @param {google.longrunning.IOperationInfo=} [properties] Properties to set
                 * @returns {google.longrunning.OperationInfo} OperationInfo instance
                 */
                OperationInfo.create = function create(properties) {
                    return new OperationInfo(properties);
                };
    
                /**
                 * Encodes the specified OperationInfo message. Does not implicitly {@link google.longrunning.OperationInfo.verify|verify} messages.
                 * @function encode
                 * @memberof google.longrunning.OperationInfo
                 * @static
                 * @param {google.longrunning.IOperationInfo} message OperationInfo message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                OperationInfo.encode = function encode(message, writer) {
                    if (!writer)
                        writer = $Writer.create();
                    if (message.responseType != null && Object.hasOwnProperty.call(message, "responseType"))
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.responseType);
                    if (message.metadataType != null && Object.hasOwnProperty.call(message, "metadataType"))
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.metadataType);
                    return writer;
                };
    
                /**
                 * Encodes the specified OperationInfo message, length delimited. Does not implicitly {@link google.longrunning.OperationInfo.verify|verify} messages.
                 * @function encodeDelimited
                 * @memberof google.longrunning.OperationInfo
                 * @static
                 * @param {google.longrunning.IOperationInfo} message OperationInfo message or plain object to encode
                 * @param {$protobuf.Writer} [writer] Writer to encode to
                 * @returns {$protobuf.Writer} Writer
                 */
                OperationInfo.encodeDelimited = function encodeDelimited(message, writer) {
                    return this.encode(message, writer).ldelim();
                };
    
                /**
                 * Decodes an OperationInfo message from the specified reader or buffer.
                 * @function decode
                 * @memberof google.longrunning.OperationInfo
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @param {number} [length] Message length if known beforehand
                 * @returns {google.longrunning.OperationInfo} OperationInfo
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                OperationInfo.decode = function decode(reader, length) {
                    if (!(reader instanceof $Reader))
                        reader = $Reader.create(reader);
                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.longrunning.OperationInfo();
                    while (reader.pos < end) {
                        var tag = reader.uint32();
                        switch (tag >>> 3) {
                        case 1:
                            message.responseType = reader.string();
                            break;
                        case 2:
                            message.metadataType = reader.string();
                            break;
                        default:
                            reader.skipType(tag & 7);
                            break;
                        }
                    }
                    return message;
                };
    
                /**
                 * Decodes an OperationInfo message from the specified reader or buffer, length delimited.
                 * @function decodeDelimited
                 * @memberof google.longrunning.OperationInfo
                 * @static
                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
                 * @returns {google.longrunning.OperationInfo} OperationInfo
                 * @throws {Error} If the payload is not a reader or valid buffer
                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
                 */
                OperationInfo.decodeDelimited = function decodeDelimited(reader) {
                    if (!(reader instanceof $Reader))
                        reader = new $Reader(reader);
                    return this.decode(reader, reader.uint32());
                };
    
                /**
                 * Verifies an OperationInfo message.
                 * @function verify
                 * @memberof google.longrunning.OperationInfo
                 * @static
                 * @param {Object.<string,*>} message Plain object to verify
                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
                 */
                OperationInfo.verify = function verify(message) {
                    if (typeof message !== "object" || message === null)
                        return "object expected";
                    if (message.responseType != null && message.hasOwnProperty("responseType"))
                        if (!$util.isString(message.responseType))
                            return "responseType: string expected";
                    if (message.metadataType != null && message.hasOwnProperty("metadataType"))
                        if (!$util.isString(message.metadataType))
                            return "metadataType: string expected";
                    return null;
                };
    
                /**
                 * Creates an OperationInfo message from a plain object. Also converts values to their respective internal types.
                 * @function fromObject
                 * @memberof google.longrunning.OperationInfo
                 * @static
                 * @param {Object.<string,*>} object Plain object
                 * @returns {google.longrunning.OperationInfo} OperationInfo
                 */
                OperationInfo.fromObject = function fromObject(object) {
                    if (object instanceof $root.google.longrunning.OperationInfo)
                        return object;
                    var message = new $root.google.longrunning.OperationInfo();
                    if (object.responseType != null)
                        message.responseType = String(object.responseType);
                    if (object.metadataType != null)
                        message.metadataType = String(object.metadataType);
                    return message;
                };
    
                /**
                 * Creates a plain object from an OperationInfo message. Also converts values to other types if specified.
                 * @function toObject
                 * @memberof google.longrunning.OperationInfo
                 * @static
                 * @param {google.longrunning.OperationInfo} message OperationInfo
                 * @param {$protobuf.IConversionOptions} [options] Conversion options
                 * @returns {Object.<string,*>} Plain object
                 */
                OperationInfo.toObject = function toObject(message, options) {
                    if (!options)
                        options = {};
                    var object = {};
                    if (options.defaults) {
                        object.responseType = "";
                        object.metadataType = "";
                    }
                    if (message.responseType != null && message.hasOwnProperty("responseType"))
                        object.responseType = message.responseType;
                    if (message.metadataType != null && message.hasOwnProperty("metadataType"))
                        object.metadataType = message.metadataType;
                    return object;
                };
    
                /**
                 * Converts this OperationInfo to JSON.
                 * @function toJSON
                 * @memberof google.longrunning.OperationInfo
                 * @instance
                 * @returns {Object.<string,*>} JSON object
                 */
                OperationInfo.prototype.toJSON = function toJSON() {
                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
                };
    
                return OperationInfo;
            })();
    
            return longrunning;
        })();
    
        return google;
    })();

    return $root;
});
