text: /**
   * @fileoverview
   * @enhanceable
   * @public
   */
  // GENERATED CODE -- DO NOT EDIT!
  
  
  goog.provide('proto.Bar');
  goog.provide('proto.BarChart');
  goog.provide('proto.BarGroup');
  goog.provide('proto.ExplanationDetails');
  goog.provide('proto.ExplanationPoint');
  goog.provide('proto.ExplanationPoints');
  goog.provide('proto.Layer');
  goog.provide('proto.Layers');
  goog.provide('proto.LogFileEntry');
  goog.provide('proto.MultiMessage');
  goog.provide('proto.Record');
  goog.provide('proto.ReplayChoiceConfig');
  goog.provide('proto.SC2ReplaySessionConfig');
  goog.provide('proto.Saliency');
  goog.provide('proto.ScaiiPacket');
  goog.provide('proto.StudyQuestion');
  goog.provide('proto.StudyQuestionAnswer');
  goog.provide('proto.StudyQuestions');
  goog.provide('proto.UserCommand');
  goog.provide('proto.UserCommand.UserCommandType');
  
  goog.require('jspb.Message');
  goog.require('jspb.BinaryReader');
  goog.require('jspb.BinaryWriter');
  
  
  /**
   * Generated by JsPbCodeGenerator.
   * @param {Array=} opt_data Optional initial data array, typically from a
   * server response, or constructed directly in Javascript. The array is used
   * in place and becomes part of the constructed object. It is not cloned.
   * If no data is provided, the constructed object will be empty, but still
   * valid.
   * @extends {jspb.Message}
   * @constructor
   */
  proto.StudyQuestions = function(opt_data) {
    jspb.Message.initialize(this, opt_data, 0, -1, proto.StudyQuestions.repeatedFields_, null);
  };
  goog.inherits(proto.StudyQuestions, jspb.Message);
  if (goog.DEBUG && !COMPILED) {
    proto.StudyQuestions.displayName = 'proto.StudyQuestions';
  }
  /**
   * List of repeated fields within this message type.
   * @private {!Array<number>}
   * @const
   */
  proto.StudyQuestions.repeatedFields_ = [1];
  
  
  
  if (jspb.Message.GENERATE_TO_OBJECT) {
  /**
   * Creates an object representation of this proto suitable for use in Soy templates.
   * Field names that are reserved in JavaScript and will be renamed to pb_name.
   * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
   * For the list of reserved names please see:
   *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
   * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
   *     for transitional soy proto support: http://goto/soy-param-migration
   * @return {!Object}
   */
  proto.StudyQuestions.prototype.toObject = function(opt_includeInstance) {
    return proto.StudyQuestions.toObject(opt_includeInstance, this);
  };
  
  
  /**
   * Static version of the {@see toObject} method.
   * @param {boolean|undefined} includeInstance Whether to include the JSPB
   *     instance for transitional soy proto support:
   *     http://goto/soy-param-migration
   * @param {!proto.StudyQuestions} msg The msg instance to transform.
   * @return {!Object}
   */
  proto.StudyQuestions.toObject = function(includeInstance, msg) {
    var f, obj = {
      studyQuestionsList: jspb.Message.toObjectList(msg.getStudyQuestionsList(),
      proto.StudyQuestion.toObject, includeInstance),
      userId: jspb.Message.getField(msg, 2),
      treatmentId: jspb.Message.getField(msg, 3),
      answerFilename: jspb.Message.getField(msg, 4)
    };
  
    if (includeInstance) {
      obj.$jspbMessageInstance = msg;
    }
    return obj;
  };
  }
  
  
  /**
   * Deserializes binary data (in protobuf wire format).
   * @param {jspb.ByteSource} bytes The bytes to deserialize.
   * @return {!proto.StudyQuestions}
   */
  proto.StudyQuestions.deserializeBinary = function(bytes) {
    var reader = new jspb.BinaryReader(bytes);
    var msg = new proto.StudyQuestions;
    return proto.StudyQuestions.deserializeBinaryFromReader(msg, reader);
  };
  
  
  /**
   * Deserializes binary data (in protobuf wire format) from the
   * given reader into the given message object.
   * @param {!proto.StudyQuestions} msg The message object to deserialize into.
   * @param {!jspb.BinaryReader} reader The BinaryReader to use.
   * @return {!proto.StudyQuestions}
   */
  proto.StudyQuestions.deserializeBinaryFromReader = function(msg, reader) {
    while (reader.nextField()) {
      if (reader.isEndGroup()) {
        break;
      }
      var field = reader.getFieldNumber();
      switch (field) {
      case 1:
        var value = new proto.StudyQuestion;
        reader.readMessage(value,proto.StudyQuestion.deserializeBinaryFromReader);
        msg.getStudyQuestionsList().push(value);
        msg.setStudyQuestionsList(msg.getStudyQuestionsList());
        break;
      case 2:
        var value = /** @type {string} */ (reader.readString());
        msg.setUserId(value);
        break;
      case 3:
        var value = /** @type {string} */ (reader.readString());
        msg.setTreatmentId(value);
        break;
      case 4:
        var value = /** @type {string} */ (reader.readString());
        msg.setAnswerFilename(value);
        break;
      default:
        reader.skipField();
        break;
      }
    }
    return msg;
  };
  
  
  /**
   * Class method variant: serializes the given message to binary data
   * (in protobuf wire format), writing to the given BinaryWriter.
   * @param {!proto.StudyQuestions} message
   * @param {!jspb.BinaryWriter} writer
   */
  proto.StudyQuestions.serializeBinaryToWriter = function(message, writer) {
    message.serializeBinaryToWriter(writer);
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format).
   * @return {!Uint8Array}
   */
  proto.StudyQuestions.prototype.serializeBinary = function() {
    var writer = new jspb.BinaryWriter();
    this.serializeBinaryToWriter(writer);
    return writer.getResultBuffer();
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format),
   * writing to the given BinaryWriter.
   * @param {!jspb.BinaryWriter} writer
   */
  proto.StudyQuestions.prototype.serializeBinaryToWriter = function (writer) {
    var f = undefined;
    f = this.getStudyQuestionsList();
    if (f.length > 0) {
      writer.writeRepeatedMessage(
        1,
        f,
        proto.StudyQuestion.serializeBinaryToWriter
      );
    }
    f = jspb.Message.getField(this, 2);
    if (f != null) {
      writer.writeString(
        2,
        f
      );
    }
    f = jspb.Message.getField(this, 3);
    if (f != null) {
      writer.writeString(
        3,
        f
      );
    }
    f = jspb.Message.getField(this, 4);
    if (f != null) {
      writer.writeString(
        4,
        f
      );
    }
  };
  
  
  /**
   * Creates a deep clone of this proto. No data is shared with the original.
   * @return {!proto.StudyQuestions} The clone.
   */
  proto.StudyQuestions.prototype.cloneMessage = function() {
    return /** @type {!proto.StudyQuestions} */ (jspb.Message.cloneMessage(this));
  };
  
  
  /**
   * repeated StudyQuestion study_questions = 1;
   * If you change this array by adding, removing or replacing elements, or if you
   * replace the array itself, then you must call the setter to update it.
   * @return {!Array.<!proto.StudyQuestion>}
   */
  proto.StudyQuestions.prototype.getStudyQuestionsList = function() {
    return /** @type{!Array.<!proto.StudyQuestion>} */ (
      jspb.Message.getRepeatedWrapperField(this, proto.StudyQuestion, 1));
  };
  
  
  /** @param {Array.<!proto.StudyQuestion>} value  */
  proto.StudyQuestions.prototype.setStudyQuestionsList = function(value) {
    jspb.Message.setRepeatedWrapperField(this, 1, value);
  };
  
  
  proto.StudyQuestions.prototype.clearStudyQuestionsList = function() {
    this.setStudyQuestionsList([]);
  };
  
  
  /**
   * required string user_id = 2;
   * @return {string}
   */
  proto.StudyQuestions.prototype.getUserId = function() {
    return /** @type {string} */ (!this.hasUserId() ? "" : jspb.Message.getField(this, 2));
  };
  
  
  /** @param {string|undefined} value  */
  proto.StudyQuestions.prototype.setUserId = function(value) {
    jspb.Message.setField(this, 2, value);
  };
  
  
  proto.StudyQuestions.prototype.clearUserId = function() {
    jspb.Message.setField(this, 2, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.StudyQuestions.prototype.hasUserId = function() {
    return jspb.Message.getField(this, 2) != null;
  };
  
  
  /**
   * required string treatment_id = 3;
   * @return {string}
   */
  proto.StudyQuestions.prototype.getTreatmentId = function() {
    return /** @type {string} */ (!this.hasTreatmentId() ? "" : jspb.Message.getField(this, 3));
  };
  
  
  /** @param {string|undefined} value  */
  proto.StudyQuestions.prototype.setTreatmentId = function(value) {
    jspb.Message.setField(this, 3, value);
  };
  
  
  proto.StudyQuestions.prototype.clearTreatmentId = function() {
    jspb.Message.setField(this, 3, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.StudyQuestions.prototype.hasTreatmentId = function() {
    return jspb.Message.getField(this, 3) != null;
  };
  
  
  /**
   * required string answer_filename = 4;
   * @return {string}
   */
  proto.StudyQuestions.prototype.getAnswerFilename = function() {
    return /** @type {string} */ (!this.hasAnswerFilename() ? "" : jspb.Message.getField(this, 4));
  };
  
  
  /** @param {string|undefined} value  */
  proto.StudyQuestions.prototype.setAnswerFilename = function(value) {
    jspb.Message.setField(this, 4, value);
  };
  
  
  proto.StudyQuestions.prototype.clearAnswerFilename = function() {
    jspb.Message.setField(this, 4, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.StudyQuestions.prototype.hasAnswerFilename = function() {
    return jspb.Message.getField(this, 4) != null;
  };
  
  
  
  /**
   * Generated by JsPbCodeGenerator.
   * @param {Array=} opt_data Optional initial data array, typically from a
   * server response, or constructed directly in Javascript. The array is used
   * in place and becomes part of the constructed object. It is not cloned.
   * If no data is provided, the constructed object will be empty, but still
   * valid.
   * @extends {jspb.Message}
   * @constructor
   */
  proto.StudyQuestion = function(opt_data) {
    jspb.Message.initialize(this, opt_data, 0, -1, proto.StudyQuestion.repeatedFields_, null);
  };
  goog.inherits(proto.StudyQuestion, jspb.Message);
  if (goog.DEBUG && !COMPILED) {
    proto.StudyQuestion.displayName = 'proto.StudyQuestion';
  }
  /**
   * List of repeated fields within this message type.
   * @private {!Array<number>}
   * @const
   */
  proto.StudyQuestion.repeatedFields_ = [3];
  
  
  
  if (jspb.Message.GENERATE_TO_OBJECT) {
  /**
   * Creates an object representation of this proto suitable for use in Soy templates.
   * Field names that are reserved in JavaScript and will be renamed to pb_name.
   * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
   * For the list of reserved names please see:
   *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
   * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
   *     for transitional soy proto support: http://goto/soy-param-migration
   * @return {!Object}
   */
  proto.StudyQuestion.prototype.toObject = function(opt_includeInstance) {
    return proto.StudyQuestion.toObject(opt_includeInstance, this);
  };
  
  
  /**
   * Static version of the {@see toObject} method.
   * @param {boolean|undefined} includeInstance Whether to include the JSPB
   *     instance for transitional soy proto support:
   *     http://goto/soy-param-migration
   * @param {!proto.StudyQuestion} msg The msg instance to transform.
   * @return {!Object}
   */
  proto.StudyQuestion.toObject = function(includeInstance, msg) {
    var f, obj = {
      step: jspb.Message.getField(msg, 1),
      question: jspb.Message.getField(msg, 2),
      answersList: jspb.Message.getField(msg, 3),
      questionIdForStep: jspb.Message.getField(msg, 4),
      questionType: jspb.Message.getField(msg, 5)
    };
  
    if (includeInstance) {
      obj.$jspbMessageInstance = msg;
    }
    return obj;
  };
  }
  
  
  /**
   * Deserializes binary data (in protobuf wire format).
   * @param {jspb.ByteSource} bytes The bytes to deserialize.
   * @return {!proto.StudyQuestion}
   */
  proto.StudyQuestion.deserializeBinary = function(bytes) {
    var reader = new jspb.BinaryReader(bytes);
    var msg = new proto.StudyQuestion;
    return proto.StudyQuestion.deserializeBinaryFromReader(msg, reader);
  };
  
  
  /**
   * Deserializes binary data (in protobuf wire format) from the
   * given reader into the given message object.
   * @param {!proto.StudyQuestion} msg The message object to deserialize into.
   * @param {!jspb.BinaryReader} reader The BinaryReader to use.
   * @return {!proto.StudyQuestion}
   */
  proto.StudyQuestion.deserializeBinaryFromReader = function(msg, reader) {
    while (reader.nextField()) {
      if (reader.isEndGroup()) {
        break;
      }
      var field = reader.getFieldNumber();
      switch (field) {
      case 1:
        var value = /** @type {string} */ (reader.readString());
        msg.setStep(value);
        break;
      case 2:
        var value = /** @type {string} */ (reader.readString());
        msg.setQuestion(value);
        break;
      case 3:
        var value = /** @type {string} */ (reader.readString());
        msg.getAnswersList().push(value);
        msg.setAnswersList(msg.getAnswersList());
        break;
      case 4:
        var value = /** @type {string} */ (reader.readString());
        msg.setQuestionIdForStep(value);
        break;
      case 5:
        var value = /** @type {string} */ (reader.readString());
        msg.setQuestionType(value);
        break;
      default:
        reader.skipField();
        break;
      }
    }
    return msg;
  };
  
  
  /**
   * Class method variant: serializes the given message to binary data
   * (in protobuf wire format), writing to the given BinaryWriter.
   * @param {!proto.StudyQuestion} message
   * @param {!jspb.BinaryWriter} writer
   */
  proto.StudyQuestion.serializeBinaryToWriter = function(message, writer) {
    message.serializeBinaryToWriter(writer);
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format).
   * @return {!Uint8Array}
   */
  proto.StudyQuestion.prototype.serializeBinary = function() {
    var writer = new jspb.BinaryWriter();
    this.serializeBinaryToWriter(writer);
    return writer.getResultBuffer();
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format),
   * writing to the given BinaryWriter.
   * @param {!jspb.BinaryWriter} writer
   */
  proto.StudyQuestion.prototype.serializeBinaryToWriter = function (writer) {
    var f = undefined;
    f = jspb.Message.getField(this, 1);
    if (f != null) {
      writer.writeString(
        1,
        f
      );
    }
    f = jspb.Message.getField(this, 2);
    if (f != null) {
      writer.writeString(
        2,
        f
      );
    }
    f = this.getAnswersList();
    if (f.length > 0) {
      writer.writeRepeatedString(
        3,
        f
      );
    }
    f = jspb.Message.getField(this, 4);
    if (f != null) {
      writer.writeString(
        4,
        f
      );
    }
    f = jspb.Message.getField(this, 5);
    if (f != null) {
      writer.writeString(
        5,
        f
      );
    }
  };
  
  
  /**
   * Creates a deep clone of this proto. No data is shared with the original.
   * @return {!proto.StudyQuestion} The clone.
   */
  proto.StudyQuestion.prototype.cloneMessage = function() {
    return /** @type {!proto.StudyQuestion} */ (jspb.Message.cloneMessage(this));
  };
  
  
  /**
   * required string step = 1;
   * @return {string}
   */
  proto.StudyQuestion.prototype.getStep = function() {
    return /** @type {string} */ (!this.hasStep() ? "" : jspb.Message.getField(this, 1));
  };
  
  
  /** @param {string|undefined} value  */
  proto.StudyQuestion.prototype.setStep = function(value) {
    jspb.Message.setField(this, 1, value);
  };
  
  
  proto.StudyQuestion.prototype.clearStep = function() {
    jspb.Message.setField(this, 1, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.StudyQuestion.prototype.hasStep = function() {
    return jspb.Message.getField(this, 1) != null;
  };
  
  
  /**
   * required string question = 2;
   * @return {string}
   */
  proto.StudyQuestion.prototype.getQuestion = function() {
    return /** @type {string} */ (!this.hasQuestion() ? "" : jspb.Message.getField(this, 2));
  };
  
  
  /** @param {string|undefined} value  */
  proto.StudyQuestion.prototype.setQuestion = function(value) {
    jspb.Message.setField(this, 2, value);
  };
  
  
  proto.StudyQuestion.prototype.clearQuestion = function() {
    jspb.Message.setField(this, 2, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.StudyQuestion.prototype.hasQuestion = function() {
    return jspb.Message.getField(this, 2) != null;
  };
  
  
  /**
   * repeated string answers = 3;
   * If you change this array by adding, removing or replacing elements, or if you
   * replace the array itself, then you must call the setter to update it.
   * @return {!Array.<string>}
   */
  proto.StudyQuestion.prototype.getAnswersList = function() {
    return /** @type {!Array.<string>} */ (jspb.Message.getField(this, 3));
  };
  
  
  /** @param {Array.<string>} value  */
  proto.StudyQuestion.prototype.setAnswersList = function(value) {
    jspb.Message.setField(this, 3, value || []);
  };
  
  
  proto.StudyQuestion.prototype.clearAnswersList = function() {
    jspb.Message.setField(this, 3, []);
  };
  
  
  /**
   * required string question_id_for_step = 4;
   * @return {string}
   */
  proto.StudyQuestion.prototype.getQuestionIdForStep = function() {
    return /** @type {string} */ (!this.hasQuestionIdForStep() ? "" : jspb.Message.getField(this, 4));
  };
  
  
  /** @param {string|undefined} value  */
  proto.StudyQuestion.prototype.setQuestionIdForStep = function(value) {
    jspb.Message.setField(this, 4, value);
  };
  
  
  proto.StudyQuestion.prototype.clearQuestionIdForStep = function() {
    jspb.Message.setField(this, 4, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.StudyQuestion.prototype.hasQuestionIdForStep = function() {
    return jspb.Message.getField(this, 4) != null;
  };
  
  
  /**
   * required string question_type = 5;
   * @return {string}
   */
  proto.StudyQuestion.prototype.getQuestionType = function() {
    return /** @type {string} */ (!this.hasQuestionType() ? "" : jspb.Message.getField(this, 5));
  };
  
  
  /** @param {string|undefined} value  */
  proto.StudyQuestion.prototype.setQuestionType = function(value) {
    jspb.Message.setField(this, 5, value);
  };
  
  
  proto.StudyQuestion.prototype.clearQuestionType = function() {
    jspb.Message.setField(this, 5, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.StudyQuestion.prototype.hasQuestionType = function() {
    return jspb.Message.getField(this, 5) != null;
  };
  
  
  
  /**
   * Generated by JsPbCodeGenerator.
   * @param {Array=} opt_data Optional initial data array, typically from a
   * server response, or constructed directly in Javascript. The array is used
   * in place and becomes part of the constructed object. It is not cloned.
   * If no data is provided, the constructed object will be empty, but still
   * valid.
   * @extends {jspb.Message}
   * @constructor
   */
  proto.StudyQuestionAnswer = function(opt_data) {
    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
  };
  goog.inherits(proto.StudyQuestionAnswer, jspb.Message);
  if (goog.DEBUG && !COMPILED) {
    proto.StudyQuestionAnswer.displayName = 'proto.StudyQuestionAnswer';
  }
  
  
  if (jspb.Message.GENERATE_TO_OBJECT) {
  /**
   * Creates an object representation of this proto suitable for use in Soy templates.
   * Field names that are reserved in JavaScript and will be renamed to pb_name.
   * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
   * For the list of reserved names please see:
   *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
   * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
   *     for transitional soy proto support: http://goto/soy-param-migration
   * @return {!Object}
   */
  proto.StudyQuestionAnswer.prototype.toObject = function(opt_includeInstance) {
    return proto.StudyQuestionAnswer.toObject(opt_includeInstance, this);
  };
  
  
  /**
   * Static version of the {@see toObject} method.
   * @param {boolean|undefined} includeInstance Whether to include the JSPB
   *     instance for transitional soy proto support:
   *     http://goto/soy-param-migration
   * @param {!proto.StudyQuestionAnswer} msg The msg instance to transform.
   * @return {!Object}
   */
  proto.StudyQuestionAnswer.toObject = function(includeInstance, msg) {
    var f, obj = {
      step: jspb.Message.getField(msg, 1),
      questionNumber: jspb.Message.getField(msg, 2),
      question: jspb.Message.getField(msg, 3),
      answer: jspb.Message.getField(msg, 4),
      userId: jspb.Message.getField(msg, 5),
      treatmentId: jspb.Message.getField(msg, 6)
    };
  
    if (includeInstance) {
      obj.$jspbMessageInstance = msg;
    }
    return obj;
  };
  }
  
  
  /**
   * Deserializes binary data (in protobuf wire format).
   * @param {jspb.ByteSource} bytes The bytes to deserialize.
   * @return {!proto.StudyQuestionAnswer}
   */
  proto.StudyQuestionAnswer.deserializeBinary = function(bytes) {
    var reader = new jspb.BinaryReader(bytes);
    var msg = new proto.StudyQuestionAnswer;
    return proto.StudyQuestionAnswer.deserializeBinaryFromReader(msg, reader);
  };
  
  
  /**
   * Deserializes binary data (in protobuf wire format) from the
   * given reader into the given message object.
   * @param {!proto.StudyQuestionAnswer} msg The message object to deserialize into.
   * @param {!jspb.BinaryReader} reader The BinaryReader to use.
   * @return {!proto.StudyQuestionAnswer}
   */
  proto.StudyQuestionAnswer.deserializeBinaryFromReader = function(msg, reader) {
    while (reader.nextField()) {
      if (reader.isEndGroup()) {
        break;
      }
      var field = reader.getFieldNumber();
      switch (field) {
      case 1:
        var value = /** @type {string} */ (reader.readString());
        msg.setStep(value);
        break;
      case 2:
        var value = /** @type {string} */ (reader.readString());
        msg.setQuestionNumber(value);
        break;
      case 3:
        var value = /** @type {string} */ (reader.readString());
        msg.setQuestion(value);
        break;
      case 4:
        var value = /** @type {string} */ (reader.readString());
        msg.setAnswer(value);
        break;
      case 5:
        var value = /** @type {string} */ (reader.readString());
        msg.setUserId(value);
        break;
      case 6:
        var value = /** @type {string} */ (reader.readString());
        msg.setTreatmentId(value);
        break;
      default:
        reader.skipField();
        break;
      }
    }
    return msg;
  };
  
  
  /**
   * Class method variant: serializes the given message to binary data
   * (in protobuf wire format), writing to the given BinaryWriter.
   * @param {!proto.StudyQuestionAnswer} message
   * @param {!jspb.BinaryWriter} writer
   */
  proto.StudyQuestionAnswer.serializeBinaryToWriter = function(message, writer) {
    message.serializeBinaryToWriter(writer);
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format).
   * @return {!Uint8Array}
   */
  proto.StudyQuestionAnswer.prototype.serializeBinary = function() {
    var writer = new jspb.BinaryWriter();
    this.serializeBinaryToWriter(writer);
    return writer.getResultBuffer();
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format),
   * writing to the given BinaryWriter.
   * @param {!jspb.BinaryWriter} writer
   */
  proto.StudyQuestionAnswer.prototype.serializeBinaryToWriter = function (writer) {
    var f = undefined;
    f = jspb.Message.getField(this, 1);
    if (f != null) {
      writer.writeString(
        1,
        f
      );
    }
    f = jspb.Message.getField(this, 2);
    if (f != null) {
      writer.writeString(
        2,
        f
      );
    }
    f = jspb.Message.getField(this, 3);
    if (f != null) {
      writer.writeString(
        3,
        f
      );
    }
    f = jspb.Message.getField(this, 4);
    if (f != null) {
      writer.writeString(
        4,
        f
      );
    }
    f = jspb.Message.getField(this, 5);
    if (f != null) {
      writer.writeString(
        5,
        f
      );
    }
    f = jspb.Message.getField(this, 6);
    if (f != null) {
      writer.writeString(
        6,
        f
      );
    }
  };
  
  
  /**
   * Creates a deep clone of this proto. No data is shared with the original.
   * @return {!proto.StudyQuestionAnswer} The clone.
   */
  proto.StudyQuestionAnswer.prototype.cloneMessage = function() {
    return /** @type {!proto.StudyQuestionAnswer} */ (jspb.Message.cloneMessage(this));
  };
  
  
  /**
   * required string step = 1;
   * @return {string}
   */
  proto.StudyQuestionAnswer.prototype.getStep = function() {
    return /** @type {string} */ (!this.hasStep() ? "" : jspb.Message.getField(this, 1));
  };
  
  
  /** @param {string|undefined} value  */
  proto.StudyQuestionAnswer.prototype.setStep = function(value) {
    jspb.Message.setField(this, 1, value);
  };
  
  
  proto.StudyQuestionAnswer.prototype.clearStep = function() {
    jspb.Message.setField(this, 1, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.StudyQuestionAnswer.prototype.hasStep = function() {
    return jspb.Message.getField(this, 1) != null;
  };
  
  
  /**
   * required string question_number = 2;
   * @return {string}
   */
  proto.StudyQuestionAnswer.prototype.getQuestionNumber = function() {
    return /** @type {string} */ (!this.hasQuestionNumber() ? "" : jspb.Message.getField(this, 2));
  };
  
  
  /** @param {string|undefined} value  */
  proto.StudyQuestionAnswer.prototype.setQuestionNumber = function(value) {
    jspb.Message.setField(this, 2, value);
  };
  
  
  proto.StudyQuestionAnswer.prototype.clearQuestionNumber = function() {
    jspb.Message.setField(this, 2, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.StudyQuestionAnswer.prototype.hasQuestionNumber = function() {
    return jspb.Message.getField(this, 2) != null;
  };
  
  
  /**
   * required string question = 3;
   * @return {string}
   */
  proto.StudyQuestionAnswer.prototype.getQuestion = function() {
    return /** @type {string} */ (!this.hasQuestion() ? "" : jspb.Message.getField(this, 3));
  };
  
  
  /** @param {string|undefined} value  */
  proto.StudyQuestionAnswer.prototype.setQuestion = function(value) {
    jspb.Message.setField(this, 3, value);
  };
  
  
  proto.StudyQuestionAnswer.prototype.clearQuestion = function() {
    jspb.Message.setField(this, 3, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.StudyQuestionAnswer.prototype.hasQuestion = function() {
    return jspb.Message.getField(this, 3) != null;
  };
  
  
  /**
   * required string answer = 4;
   * @return {string}
   */
  proto.StudyQuestionAnswer.prototype.getAnswer = function() {
    return /** @type {string} */ (!this.hasAnswer() ? "" : jspb.Message.getField(this, 4));
  };
  
  
  /** @param {string|undefined} value  */
  proto.StudyQuestionAnswer.prototype.setAnswer = function(value) {
    jspb.Message.setField(this, 4, value);
  };
  
  
  proto.StudyQuestionAnswer.prototype.clearAnswer = function() {
    jspb.Message.setField(this, 4, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.StudyQuestionAnswer.prototype.hasAnswer = function() {
    return jspb.Message.getField(this, 4) != null;
  };
  
  
  /**
   * required string user_id = 5;
   * @return {string}
   */
  proto.StudyQuestionAnswer.prototype.getUserId = function() {
    return /** @type {string} */ (!this.hasUserId() ? "" : jspb.Message.getField(this, 5));
  };
  
  
  /** @param {string|undefined} value  */
  proto.StudyQuestionAnswer.prototype.setUserId = function(value) {
    jspb.Message.setField(this, 5, value);
  };
  
  
  proto.StudyQuestionAnswer.prototype.clearUserId = function() {
    jspb.Message.setField(this, 5, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.StudyQuestionAnswer.prototype.hasUserId = function() {
    return jspb.Message.getField(this, 5) != null;
  };
  
  
  /**
   * required string treatment_id = 6;
   * @return {string}
   */
  proto.StudyQuestionAnswer.prototype.getTreatmentId = function() {
    return /** @type {string} */ (!this.hasTreatmentId() ? "" : jspb.Message.getField(this, 6));
  };
  
  
  /** @param {string|undefined} value  */
  proto.StudyQuestionAnswer.prototype.setTreatmentId = function(value) {
    jspb.Message.setField(this, 6, value);
  };
  
  
  proto.StudyQuestionAnswer.prototype.clearTreatmentId = function() {
    jspb.Message.setField(this, 6, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.StudyQuestionAnswer.prototype.hasTreatmentId = function() {
    return jspb.Message.getField(this, 6) != null;
  };
  
  
  
  /**
   * Generated by JsPbCodeGenerator.
   * @param {Array=} opt_data Optional initial data array, typically from a
   * server response, or constructed directly in Javascript. The array is used
   * in place and becomes part of the constructed object. It is not cloned.
   * If no data is provided, the constructed object will be empty, but still
   * valid.
   * @extends {jspb.Message}
   * @constructor
   */
  proto.LogFileEntry = function(opt_data) {
    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
  };
  goog.inherits(proto.LogFileEntry, jspb.Message);
  if (goog.DEBUG && !COMPILED) {
    proto.LogFileEntry.displayName = 'proto.LogFileEntry';
  }
  
  
  if (jspb.Message.GENERATE_TO_OBJECT) {
  /**
   * Creates an object representation of this proto suitable for use in Soy templates.
   * Field names that are reserved in JavaScript and will be renamed to pb_name.
   * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
   * For the list of reserved names please see:
   *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
   * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
   *     for transitional soy proto support: http://goto/soy-param-migration
   * @return {!Object}
   */
  proto.LogFileEntry.prototype.toObject = function(opt_includeInstance) {
    return proto.LogFileEntry.toObject(opt_includeInstance, this);
  };
  
  
  /**
   * Static version of the {@see toObject} method.
   * @param {boolean|undefined} includeInstance Whether to include the JSPB
   *     instance for transitional soy proto support:
   *     http://goto/soy-param-migration
   * @param {!proto.LogFileEntry} msg The msg instance to transform.
   * @return {!Object}
   */
  proto.LogFileEntry.toObject = function(includeInstance, msg) {
    var f, obj = {
      filename: jspb.Message.getField(msg, 1),
      entry: jspb.Message.getField(msg, 2),
      isLastLine: jspb.Message.getField(msg, 3)
    };
  
    if (includeInstance) {
      obj.$jspbMessageInstance = msg;
    }
    return obj;
  };
  }
  
  
  /**
   * Deserializes binary data (in protobuf wire format).
   * @param {jspb.ByteSource} bytes The bytes to deserialize.
   * @return {!proto.LogFileEntry}
   */
  proto.LogFileEntry.deserializeBinary = function(bytes) {
    var reader = new jspb.BinaryReader(bytes);
    var msg = new proto.LogFileEntry;
    return proto.LogFileEntry.deserializeBinaryFromReader(msg, reader);
  };
  
  
  /**
   * Deserializes binary data (in protobuf wire format) from the
   * given reader into the given message object.
   * @param {!proto.LogFileEntry} msg The message object to deserialize into.
   * @param {!jspb.BinaryReader} reader The BinaryReader to use.
   * @return {!proto.LogFileEntry}
   */
  proto.LogFileEntry.deserializeBinaryFromReader = function(msg, reader) {
    while (reader.nextField()) {
      if (reader.isEndGroup()) {
        break;
      }
      var field = reader.getFieldNumber();
      switch (field) {
      case 1:
        var value = /** @type {string} */ (reader.readString());
        msg.setFilename(value);
        break;
      case 2:
        var value = /** @type {string} */ (reader.readString());
        msg.setEntry(value);
        break;
      case 3:
        var value = /** @type {boolean} */ (reader.readBool());
        msg.setIsLastLine(value);
        break;
      default:
        reader.skipField();
        break;
      }
    }
    return msg;
  };
  
  
  /**
   * Class method variant: serializes the given message to binary data
   * (in protobuf wire format), writing to the given BinaryWriter.
   * @param {!proto.LogFileEntry} message
   * @param {!jspb.BinaryWriter} writer
   */
  proto.LogFileEntry.serializeBinaryToWriter = function(message, writer) {
    message.serializeBinaryToWriter(writer);
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format).
   * @return {!Uint8Array}
   */
  proto.LogFileEntry.prototype.serializeBinary = function() {
    var writer = new jspb.BinaryWriter();
    this.serializeBinaryToWriter(writer);
    return writer.getResultBuffer();
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format),
   * writing to the given BinaryWriter.
   * @param {!jspb.BinaryWriter} writer
   */
  proto.LogFileEntry.prototype.serializeBinaryToWriter = function (writer) {
    var f = undefined;
    f = jspb.Message.getField(this, 1);
    if (f != null) {
      writer.writeString(
        1,
        f
      );
    }
    f = jspb.Message.getField(this, 2);
    if (f != null) {
      writer.writeString(
        2,
        f
      );
    }
    f = jspb.Message.getField(this, 3);
    if (f != null) {
      writer.writeBool(
        3,
        f
      );
    }
  };
  
  
  /**
   * Creates a deep clone of this proto. No data is shared with the original.
   * @return {!proto.LogFileEntry} The clone.
   */
  proto.LogFileEntry.prototype.cloneMessage = function() {
    return /** @type {!proto.LogFileEntry} */ (jspb.Message.cloneMessage(this));
  };
  
  
  /**
   * required string filename = 1;
   * @return {string}
   */
  proto.LogFileEntry.prototype.getFilename = function() {
    return /** @type {string} */ (!this.hasFilename() ? "" : jspb.Message.getField(this, 1));
  };
  
  
  /** @param {string|undefined} value  */
  proto.LogFileEntry.prototype.setFilename = function(value) {
    jspb.Message.setField(this, 1, value);
  };
  
  
  proto.LogFileEntry.prototype.clearFilename = function() {
    jspb.Message.setField(this, 1, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.LogFileEntry.prototype.hasFilename = function() {
    return jspb.Message.getField(this, 1) != null;
  };
  
  
  /**
   * required string entry = 2;
   * @return {string}
   */
  proto.LogFileEntry.prototype.getEntry = function() {
    return /** @type {string} */ (!this.hasEntry() ? "" : jspb.Message.getField(this, 2));
  };
  
  
  /** @param {string|undefined} value  */
  proto.LogFileEntry.prototype.setEntry = function(value) {
    jspb.Message.setField(this, 2, value);
  };
  
  
  proto.LogFileEntry.prototype.clearEntry = function() {
    jspb.Message.setField(this, 2, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.LogFileEntry.prototype.hasEntry = function() {
    return jspb.Message.getField(this, 2) != null;
  };
  
  
  /**
   * required bool is_last_line = 3;
   * Note that Boolean fields may be set to 0/1 when serialized from a Java server.
   * You should avoid comparisons like {@code val === true/false} in those cases.
   * @return {boolean}
   */
  proto.LogFileEntry.prototype.getIsLastLine = function() {
    return /** @type {boolean} */ (!this.hasIsLastLine() ? false : jspb.Message.getField(this, 3));
  };
  
  
  /** @param {boolean|undefined} value  */
  proto.LogFileEntry.prototype.setIsLastLine = function(value) {
    jspb.Message.setField(this, 3, value);
  };
  
  
  proto.LogFileEntry.prototype.clearIsLastLine = function() {
    jspb.Message.setField(this, 3, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.LogFileEntry.prototype.hasIsLastLine = function() {
    return jspb.Message.getField(this, 3) != null;
  };
  
  
  
  /**
   * Generated by JsPbCodeGenerator.
   * @param {Array=} opt_data Optional initial data array, typically from a
   * server response, or constructed directly in Javascript. The array is used
   * in place and becomes part of the constructed object. It is not cloned.
   * If no data is provided, the constructed object will be empty, but still
   * valid.
   * @extends {jspb.Message}
   * @constructor
   */
  proto.ExplanationPoints = function(opt_data) {
    jspb.Message.initialize(this, opt_data, 0, -1, proto.ExplanationPoints.repeatedFields_, null);
  };
  goog.inherits(proto.ExplanationPoints, jspb.Message);
  if (goog.DEBUG && !COMPILED) {
    proto.ExplanationPoints.displayName = 'proto.ExplanationPoints';
  }
  /**
   * List of repeated fields within this message type.
   * @private {!Array<number>}
   * @const
   */
  proto.ExplanationPoints.repeatedFields_ = [1];
  
  
  
  if (jspb.Message.GENERATE_TO_OBJECT) {
  /**
   * Creates an object representation of this proto suitable for use in Soy templates.
   * Field names that are reserved in JavaScript and will be renamed to pb_name.
   * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
   * For the list of reserved names please see:
   *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
   * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
   *     for transitional soy proto support: http://goto/soy-param-migration
   * @return {!Object}
   */
  proto.ExplanationPoints.prototype.toObject = function(opt_includeInstance) {
    return proto.ExplanationPoints.toObject(opt_includeInstance, this);
  };
  
  
  /**
   * Static version of the {@see toObject} method.
   * @param {boolean|undefined} includeInstance Whether to include the JSPB
   *     instance for transitional soy proto support:
   *     http://goto/soy-param-migration
   * @param {!proto.ExplanationPoints} msg The msg instance to transform.
   * @return {!Object}
   */
  proto.ExplanationPoints.toObject = function(includeInstance, msg) {
    var f, obj = {
      explanationPointsList: jspb.Message.toObjectList(msg.getExplanationPointsList(),
      proto.ExplanationPoint.toObject, includeInstance)
    };
  
    if (includeInstance) {
      obj.$jspbMessageInstance = msg;
    }
    return obj;
  };
  }
  
  
  /**
   * Deserializes binary data (in protobuf wire format).
   * @param {jspb.ByteSource} bytes The bytes to deserialize.
   * @return {!proto.ExplanationPoints}
   */
  proto.ExplanationPoints.deserializeBinary = function(bytes) {
    var reader = new jspb.BinaryReader(bytes);
    var msg = new proto.ExplanationPoints;
    return proto.ExplanationPoints.deserializeBinaryFromReader(msg, reader);
  };
  
  
  /**
   * Deserializes binary data (in protobuf wire format) from the
   * given reader into the given message object.
   * @param {!proto.ExplanationPoints} msg The message object to deserialize into.
   * @param {!jspb.BinaryReader} reader The BinaryReader to use.
   * @return {!proto.ExplanationPoints}
   */
  proto.ExplanationPoints.deserializeBinaryFromReader = function(msg, reader) {
    while (reader.nextField()) {
      if (reader.isEndGroup()) {
        break;
      }
      var field = reader.getFieldNumber();
      switch (field) {
      case 1:
        var value = new proto.ExplanationPoint;
        reader.readMessage(value,proto.ExplanationPoint.deserializeBinaryFromReader);
        msg.getExplanationPointsList().push(value);
        msg.setExplanationPointsList(msg.getExplanationPointsList());
        break;
      default:
        reader.skipField();
        break;
      }
    }
    return msg;
  };
  
  
  /**
   * Class method variant: serializes the given message to binary data
   * (in protobuf wire format), writing to the given BinaryWriter.
   * @param {!proto.ExplanationPoints} message
   * @param {!jspb.BinaryWriter} writer
   */
  proto.ExplanationPoints.serializeBinaryToWriter = function(message, writer) {
    message.serializeBinaryToWriter(writer);
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format).
   * @return {!Uint8Array}
   */
  proto.ExplanationPoints.prototype.serializeBinary = function() {
    var writer = new jspb.BinaryWriter();
    this.serializeBinaryToWriter(writer);
    return writer.getResultBuffer();
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format),
   * writing to the given BinaryWriter.
   * @param {!jspb.BinaryWriter} writer
   */
  proto.ExplanationPoints.prototype.serializeBinaryToWriter = function (writer) {
    var f = undefined;
    f = this.getExplanationPointsList();
    if (f.length > 0) {
      writer.writeRepeatedMessage(
        1,
        f,
        proto.ExplanationPoint.serializeBinaryToWriter
      );
    }
  };
  
  
  /**
   * Creates a deep clone of this proto. No data is shared with the original.
   * @return {!proto.ExplanationPoints} The clone.
   */
  proto.ExplanationPoints.prototype.cloneMessage = function() {
    return /** @type {!proto.ExplanationPoints} */ (jspb.Message.cloneMessage(this));
  };
  
  
  /**
   * repeated ExplanationPoint explanation_points = 1;
   * If you change this array by adding, removing or replacing elements, or if you
   * replace the array itself, then you must call the setter to update it.
   * @return {!Array.<!proto.ExplanationPoint>}
   */
  proto.ExplanationPoints.prototype.getExplanationPointsList = function() {
    return /** @type{!Array.<!proto.ExplanationPoint>} */ (
      jspb.Message.getRepeatedWrapperField(this, proto.ExplanationPoint, 1));
  };
  
  
  /** @param {Array.<!proto.ExplanationPoint>} value  */
  proto.ExplanationPoints.prototype.setExplanationPointsList = function(value) {
    jspb.Message.setRepeatedWrapperField(this, 1, value);
  };
  
  
  proto.ExplanationPoints.prototype.clearExplanationPointsList = function() {
    this.setExplanationPointsList([]);
  };
  
  
  
  /**
   * Generated by JsPbCodeGenerator.
   * @param {Array=} opt_data Optional initial data array, typically from a
   * server response, or constructed directly in Javascript. The array is used
   * in place and becomes part of the constructed object. It is not cloned.
   * If no data is provided, the constructed object will be empty, but still
   * valid.
   * @extends {jspb.Message}
   * @constructor
   */
  proto.ExplanationPoint = function(opt_data) {
    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
  };
  goog.inherits(proto.ExplanationPoint, jspb.Message);
  if (goog.DEBUG && !COMPILED) {
    proto.ExplanationPoint.displayName = 'proto.ExplanationPoint';
  }
  
  
  if (jspb.Message.GENERATE_TO_OBJECT) {
  /**
   * Creates an object representation of this proto suitable for use in Soy templates.
   * Field names that are reserved in JavaScript and will be renamed to pb_name.
   * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
   * For the list of reserved names please see:
   *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
   * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
   *     for transitional soy proto support: http://goto/soy-param-migration
   * @return {!Object}
   */
  proto.ExplanationPoint.prototype.toObject = function(opt_includeInstance) {
    return proto.ExplanationPoint.toObject(opt_includeInstance, this);
  };
  
  
  /**
   * Static version of the {@see toObject} method.
   * @param {boolean|undefined} includeInstance Whether to include the JSPB
   *     instance for transitional soy proto support:
   *     http://goto/soy-param-migration
   * @param {!proto.ExplanationPoint} msg The msg instance to transform.
   * @return {!Object}
   */
  proto.ExplanationPoint.toObject = function(includeInstance, msg) {
    var f, obj = {
      step: jspb.Message.getField(msg, 1),
      id: jspb.Message.getField(msg, 2),
      title: jspb.Message.getField(msg, 3),
      description: jspb.Message.getField(msg, 4),
      saliency: (f = msg.getSaliency()) && proto.Saliency.toObject(includeInstance, f),
      barChart: (f = msg.getBarChart()) && proto.BarChart.toObject(includeInstance, f)
    };
  
    if (includeInstance) {
      obj.$jspbMessageInstance = msg;
    }
    return obj;
  };
  }
  
  
  /**
   * Deserializes binary data (in protobuf wire format).
   * @param {jspb.ByteSource} bytes The bytes to deserialize.
   * @return {!proto.ExplanationPoint}
   */
  proto.ExplanationPoint.deserializeBinary = function(bytes) {
    var reader = new jspb.BinaryReader(bytes);
    var msg = new proto.ExplanationPoint;
    return proto.ExplanationPoint.deserializeBinaryFromReader(msg, reader);
  };
  
  
  /**
   * Deserializes binary data (in protobuf wire format) from the
   * given reader into the given message object.
   * @param {!proto.ExplanationPoint} msg The message object to deserialize into.
   * @param {!jspb.BinaryReader} reader The BinaryReader to use.
   * @return {!proto.ExplanationPoint}
   */
  proto.ExplanationPoint.deserializeBinaryFromReader = function(msg, reader) {
    while (reader.nextField()) {
      if (reader.isEndGroup()) {
        break;
      }
      var field = reader.getFieldNumber();
      switch (field) {
      case 1:
        var value = /** @type {number} */ (reader.readUint32());
        msg.setStep(value);
        break;
      case 2:
        var value = /** @type {number} */ (reader.readUint32());
        msg.setId(value);
        break;
      case 3:
        var value = /** @type {string} */ (reader.readString());
        msg.setTitle(value);
        break;
      case 4:
        var value = /** @type {string} */ (reader.readString());
        msg.setDescription(value);
        break;
      case 5:
        var value = new proto.Saliency;
        reader.readMessage(value,proto.Saliency.deserializeBinaryFromReader);
        msg.setSaliency(value);
        break;
      case 6:
        var value = new proto.BarChart;
        reader.readMessage(value,proto.BarChart.deserializeBinaryFromReader);
        msg.setBarChart(value);
        break;
      default:
        reader.skipField();
        break;
      }
    }
    return msg;
  };
  
  
  /**
   * Class method variant: serializes the given message to binary data
   * (in protobuf wire format), writing to the given BinaryWriter.
   * @param {!proto.ExplanationPoint} message
   * @param {!jspb.BinaryWriter} writer
   */
  proto.ExplanationPoint.serializeBinaryToWriter = function(message, writer) {
    message.serializeBinaryToWriter(writer);
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format).
   * @return {!Uint8Array}
   */
  proto.ExplanationPoint.prototype.serializeBinary = function() {
    var writer = new jspb.BinaryWriter();
    this.serializeBinaryToWriter(writer);
    return writer.getResultBuffer();
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format),
   * writing to the given BinaryWriter.
   * @param {!jspb.BinaryWriter} writer
   */
  proto.ExplanationPoint.prototype.serializeBinaryToWriter = function (writer) {
    var f = undefined;
    f = jspb.Message.getField(this, 1);
    if (f != null) {
      writer.writeUint32(
        1,
        f
      );
    }
    f = jspb.Message.getField(this, 2);
    if (f != null) {
      writer.writeUint32(
        2,
        f
      );
    }
    f = jspb.Message.getField(this, 3);
    if (f != null) {
      writer.writeString(
        3,
        f
      );
    }
    f = jspb.Message.getField(this, 4);
    if (f != null) {
      writer.writeString(
        4,
        f
      );
    }
    f = this.getSaliency();
    if (f != null) {
      writer.writeMessage(
        5,
        f,
        proto.Saliency.serializeBinaryToWriter
      );
    }
    f = this.getBarChart();
    if (f != null) {
      writer.writeMessage(
        6,
        f,
        proto.BarChart.serializeBinaryToWriter
      );
    }
  };
  
  
  /**
   * Creates a deep clone of this proto. No data is shared with the original.
   * @return {!proto.ExplanationPoint} The clone.
   */
  proto.ExplanationPoint.prototype.cloneMessage = function() {
    return /** @type {!proto.ExplanationPoint} */ (jspb.Message.cloneMessage(this));
  };
  
  
  /**
   * optional uint32 step = 1;
   * @return {number}
   */
  proto.ExplanationPoint.prototype.getStep = function() {
    return /** @type {number} */ (!this.hasStep() ? 0 : jspb.Message.getField(this, 1));
  };
  
  
  /** @param {number?|undefined} value  */
  proto.ExplanationPoint.prototype.setStep = function(value) {
    jspb.Message.setField(this, 1, value);
  };
  
  
  proto.ExplanationPoint.prototype.clearStep = function() {
    jspb.Message.setField(this, 1, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.ExplanationPoint.prototype.hasStep = function() {
    return jspb.Message.getField(this, 1) != null;
  };
  
  
  /**
   * optional uint32 id = 2;
   * @return {number}
   */
  proto.ExplanationPoint.prototype.getId = function() {
    return /** @type {number} */ (!this.hasId() ? 0 : jspb.Message.getField(this, 2));
  };
  
  
  /** @param {number?|undefined} value  */
  proto.ExplanationPoint.prototype.setId = function(value) {
    jspb.Message.setField(this, 2, value);
  };
  
  
  proto.ExplanationPoint.prototype.clearId = function() {
    jspb.Message.setField(this, 2, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.ExplanationPoint.prototype.hasId = function() {
    return jspb.Message.getField(this, 2) != null;
  };
  
  
  /**
   * optional string title = 3;
   * @return {string}
   */
  proto.ExplanationPoint.prototype.getTitle = function() {
    return /** @type {string} */ (!this.hasTitle() ? "" : jspb.Message.getField(this, 3));
  };
  
  
  /** @param {string?|undefined} value  */
  proto.ExplanationPoint.prototype.setTitle = function(value) {
    jspb.Message.setField(this, 3, value);
  };
  
  
  proto.ExplanationPoint.prototype.clearTitle = function() {
    jspb.Message.setField(this, 3, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.ExplanationPoint.prototype.hasTitle = function() {
    return jspb.Message.getField(this, 3) != null;
  };
  
  
  /**
   * optional string description = 4;
   * @return {string}
   */
  proto.ExplanationPoint.prototype.getDescription = function() {
    return /** @type {string} */ (!this.hasDescription() ? "" : jspb.Message.getField(this, 4));
  };
  
  
  /** @param {string?|undefined} value  */
  proto.ExplanationPoint.prototype.setDescription = function(value) {
    jspb.Message.setField(this, 4, value);
  };
  
  
  proto.ExplanationPoint.prototype.clearDescription = function() {
    jspb.Message.setField(this, 4, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.ExplanationPoint.prototype.hasDescription = function() {
    return jspb.Message.getField(this, 4) != null;
  };
  
  
  /**
   * optional Saliency saliency = 5;
   * @return {proto.Saliency}
   */
  proto.ExplanationPoint.prototype.getSaliency = function() {
    return /** @type{proto.Saliency} */ (
      jspb.Message.getWrapperField(this, proto.Saliency, 5));
  };
  
  
  /** @param {proto.Saliency|undefined} value  */
  proto.ExplanationPoint.prototype.setSaliency = function(value) {
    jspb.Message.setWrapperField(this, 5, value);
  };
  
  
  proto.ExplanationPoint.prototype.clearSaliency = function() {
    this.setSaliency(undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.ExplanationPoint.prototype.hasSaliency = function() {
    return jspb.Message.getField(this, 5) != null;
  };
  
  
  /**
   * optional BarChart bar_chart = 6;
   * @return {proto.BarChart}
   */
  proto.ExplanationPoint.prototype.getBarChart = function() {
    return /** @type{proto.BarChart} */ (
      jspb.Message.getWrapperField(this, proto.BarChart, 6));
  };
  
  
  /** @param {proto.BarChart|undefined} value  */
  proto.ExplanationPoint.prototype.setBarChart = function(value) {
    jspb.Message.setWrapperField(this, 6, value);
  };
  
  
  proto.ExplanationPoint.prototype.clearBarChart = function() {
    this.setBarChart(undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.ExplanationPoint.prototype.hasBarChart = function() {
    return jspb.Message.getField(this, 6) != null;
  };
  
  
  
  /**
   * Generated by JsPbCodeGenerator.
   * @param {Array=} opt_data Optional initial data array, typically from a
   * server response, or constructed directly in Javascript. The array is used
   * in place and becomes part of the constructed object. It is not cloned.
   * If no data is provided, the constructed object will be empty, but still
   * valid.
   * @extends {jspb.Message}
   * @constructor
   */
  proto.BarChart = function(opt_data) {
    jspb.Message.initialize(this, opt_data, 0, -1, proto.BarChart.repeatedFields_, null);
  };
  goog.inherits(proto.BarChart, jspb.Message);
  if (goog.DEBUG && !COMPILED) {
    proto.BarChart.displayName = 'proto.BarChart';
  }
  /**
   * List of repeated fields within this message type.
   * @private {!Array<number>}
   * @const
   */
  proto.BarChart.repeatedFields_ = [1];
  
  
  
  if (jspb.Message.GENERATE_TO_OBJECT) {
  /**
   * Creates an object representation of this proto suitable for use in Soy templates.
   * Field names that are reserved in JavaScript and will be renamed to pb_name.
   * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
   * For the list of reserved names please see:
   *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
   * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
   *     for transitional soy proto support: http://goto/soy-param-migration
   * @return {!Object}
   */
  proto.BarChart.prototype.toObject = function(opt_includeInstance) {
    return proto.BarChart.toObject(opt_includeInstance, this);
  };
  
  
  /**
   * Static version of the {@see toObject} method.
   * @param {boolean|undefined} includeInstance Whether to include the JSPB
   *     instance for transitional soy proto support:
   *     http://goto/soy-param-migration
   * @param {!proto.BarChart} msg The msg instance to transform.
   * @return {!Object}
   */
  proto.BarChart.toObject = function(includeInstance, msg) {
    var f, obj = {
      groupsList: jspb.Message.toObjectList(msg.getGroupsList(),
      proto.BarGroup.toObject, includeInstance),
      title: jspb.Message.getField(msg, 2),
      vTitle: jspb.Message.getField(msg, 3),
      hTitle: jspb.Message.getField(msg, 4)
    };
  
    if (includeInstance) {
      obj.$jspbMessageInstance = msg;
    }
    return obj;
  };
  }
  
  
  /**
   * Deserializes binary data (in protobuf wire format).
   * @param {jspb.ByteSource} bytes The bytes to deserialize.
   * @return {!proto.BarChart}
   */
  proto.BarChart.deserializeBinary = function(bytes) {
    var reader = new jspb.BinaryReader(bytes);
    var msg = new proto.BarChart;
    return proto.BarChart.deserializeBinaryFromReader(msg, reader);
  };
  
  
  /**
   * Deserializes binary data (in protobuf wire format) from the
   * given reader into the given message object.
   * @param {!proto.BarChart} msg The message object to deserialize into.
   * @param {!jspb.BinaryReader} reader The BinaryReader to use.
   * @return {!proto.BarChart}
   */
  proto.BarChart.deserializeBinaryFromReader = function(msg, reader) {
    while (reader.nextField()) {
      if (reader.isEndGroup()) {
        break;
      }
      var field = reader.getFieldNumber();
      switch (field) {
      case 1:
        var value = new proto.BarGroup;
        reader.readMessage(value,proto.BarGroup.deserializeBinaryFromReader);
        msg.getGroupsList().push(value);
        msg.setGroupsList(msg.getGroupsList());
        break;
      case 2:
        var value = /** @type {string} */ (reader.readString());
        msg.setTitle(value);
        break;
      case 3:
        var value = /** @type {string} */ (reader.readString());
        msg.setVTitle(value);
        break;
      case 4:
        var value = /** @type {string} */ (reader.readString());
        msg.setHTitle(value);
        break;
      default:
        reader.skipField();
        break;
      }
    }
    return msg;
  };
  
  
  /**
   * Class method variant: serializes the given message to binary data
   * (in protobuf wire format), writing to the given BinaryWriter.
   * @param {!proto.BarChart} message
   * @param {!jspb.BinaryWriter} writer
   */
  proto.BarChart.serializeBinaryToWriter = function(message, writer) {
    message.serializeBinaryToWriter(writer);
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format).
   * @return {!Uint8Array}
   */
  proto.BarChart.prototype.serializeBinary = function() {
    var writer = new jspb.BinaryWriter();
    this.serializeBinaryToWriter(writer);
    return writer.getResultBuffer();
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format),
   * writing to the given BinaryWriter.
   * @param {!jspb.BinaryWriter} writer
   */
  proto.BarChart.prototype.serializeBinaryToWriter = function (writer) {
    var f = undefined;
    f = this.getGroupsList();
    if (f.length > 0) {
      writer.writeRepeatedMessage(
        1,
        f,
        proto.BarGroup.serializeBinaryToWriter
      );
    }
    f = jspb.Message.getField(this, 2);
    if (f != null) {
      writer.writeString(
        2,
        f
      );
    }
    f = jspb.Message.getField(this, 3);
    if (f != null) {
      writer.writeString(
        3,
        f
      );
    }
    f = jspb.Message.getField(this, 4);
    if (f != null) {
      writer.writeString(
        4,
        f
      );
    }
  };
  
  
  /**
   * Creates a deep clone of this proto. No data is shared with the original.
   * @return {!proto.BarChart} The clone.
   */
  proto.BarChart.prototype.cloneMessage = function() {
    return /** @type {!proto.BarChart} */ (jspb.Message.cloneMessage(this));
  };
  
  
  /**
   * repeated BarGroup groups = 1;
   * If you change this array by adding, removing or replacing elements, or if you
   * replace the array itself, then you must call the setter to update it.
   * @return {!Array.<!proto.BarGroup>}
   */
  proto.BarChart.prototype.getGroupsList = function() {
    return /** @type{!Array.<!proto.BarGroup>} */ (
      jspb.Message.getRepeatedWrapperField(this, proto.BarGroup, 1));
  };
  
  
  /** @param {Array.<!proto.BarGroup>} value  */
  proto.BarChart.prototype.setGroupsList = function(value) {
    jspb.Message.setRepeatedWrapperField(this, 1, value);
  };
  
  
  proto.BarChart.prototype.clearGroupsList = function() {
    this.setGroupsList([]);
  };
  
  
  /**
   * optional string title = 2;
   * @return {string}
   */
  proto.BarChart.prototype.getTitle = function() {
    return /** @type {string} */ (!this.hasTitle() ? "" : jspb.Message.getField(this, 2));
  };
  
  
  /** @param {string?|undefined} value  */
  proto.BarChart.prototype.setTitle = function(value) {
    jspb.Message.setField(this, 2, value);
  };
  
  
  proto.BarChart.prototype.clearTitle = function() {
    jspb.Message.setField(this, 2, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.BarChart.prototype.hasTitle = function() {
    return jspb.Message.getField(this, 2) != null;
  };
  
  
  /**
   * optional string v_title = 3;
   * @return {string}
   */
  proto.BarChart.prototype.getVTitle = function() {
    return /** @type {string} */ (!this.hasVTitle() ? "" : jspb.Message.getField(this, 3));
  };
  
  
  /** @param {string?|undefined} value  */
  proto.BarChart.prototype.setVTitle = function(value) {
    jspb.Message.setField(this, 3, value);
  };
  
  
  proto.BarChart.prototype.clearVTitle = function() {
    jspb.Message.setField(this, 3, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.BarChart.prototype.hasVTitle = function() {
    return jspb.Message.getField(this, 3) != null;
  };
  
  
  /**
   * optional string h_title = 4;
   * @return {string}
   */
  proto.BarChart.prototype.getHTitle = function() {
    return /** @type {string} */ (!this.hasHTitle() ? "" : jspb.Message.getField(this, 4));
  };
  
  
  /** @param {string?|undefined} value  */
  proto.BarChart.prototype.setHTitle = function(value) {
    jspb.Message.setField(this, 4, value);
  };
  
  
  proto.BarChart.prototype.clearHTitle = function() {
    jspb.Message.setField(this, 4, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.BarChart.prototype.hasHTitle = function() {
    return jspb.Message.getField(this, 4) != null;
  };
  
  
  
  /**
   * Generated by JsPbCodeGenerator.
   * @param {Array=} opt_data Optional initial data array, typically from a
   * server response, or constructed directly in Javascript. The array is used
   * in place and becomes part of the constructed object. It is not cloned.
   * If no data is provided, the constructed object will be empty, but still
   * valid.
   * @extends {jspb.Message}
   * @constructor
   */
  proto.BarGroup = function(opt_data) {
    jspb.Message.initialize(this, opt_data, 0, -1, proto.BarGroup.repeatedFields_, null);
  };
  goog.inherits(proto.BarGroup, jspb.Message);
  if (goog.DEBUG && !COMPILED) {
    proto.BarGroup.displayName = 'proto.BarGroup';
  }
  /**
   * List of repeated fields within this message type.
   * @private {!Array<number>}
   * @const
   */
  proto.BarGroup.repeatedFields_ = [2];
  
  
  
  if (jspb.Message.GENERATE_TO_OBJECT) {
  /**
   * Creates an object representation of this proto suitable for use in Soy templates.
   * Field names that are reserved in JavaScript and will be renamed to pb_name.
   * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
   * For the list of reserved names please see:
   *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
   * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
   *     for transitional soy proto support: http://goto/soy-param-migration
   * @return {!Object}
   */
  proto.BarGroup.prototype.toObject = function(opt_includeInstance) {
    return proto.BarGroup.toObject(opt_includeInstance, this);
  };
  
  
  /**
   * Static version of the {@see toObject} method.
   * @param {boolean|undefined} includeInstance Whether to include the JSPB
   *     instance for transitional soy proto support:
   *     http://goto/soy-param-migration
   * @param {!proto.BarGroup} msg The msg instance to transform.
   * @return {!Object}
   */
  proto.BarGroup.toObject = function(includeInstance, msg) {
    var f, obj = {
      value: jspb.Message.getOptionalFloatingPointField(msg, 1),
      barsList: jspb.Message.toObjectList(msg.getBarsList(),
      proto.Bar.toObject, includeInstance),
      saliencyId: jspb.Message.getField(msg, 3),
      name: jspb.Message.getField(msg, 4)
    };
  
    if (includeInstance) {
      obj.$jspbMessageInstance = msg;
    }
    return obj;
  };
  }
  
  
  /**
   * Deserializes binary data (in protobuf wire format).
   * @param {jspb.ByteSource} bytes The bytes to deserialize.
   * @return {!proto.BarGroup}
   */
  proto.BarGroup.deserializeBinary = function(bytes) {
    var reader = new jspb.BinaryReader(bytes);
    var msg = new proto.BarGroup;
    return proto.BarGroup.deserializeBinaryFromReader(msg, reader);
  };
  
  
  /**
   * Deserializes binary data (in protobuf wire format) from the
   * given reader into the given message object.
   * @param {!proto.BarGroup} msg The message object to deserialize into.
   * @param {!jspb.BinaryReader} reader The BinaryReader to use.
   * @return {!proto.BarGroup}
   */
  proto.BarGroup.deserializeBinaryFromReader = function(msg, reader) {
    while (reader.nextField()) {
      if (reader.isEndGroup()) {
        break;
      }
      var field = reader.getFieldNumber();
      switch (field) {
      case 1:
        var value = /** @type {number} */ (reader.readDouble());
        msg.setValue(value);
        break;
      case 2:
        var value = new proto.Bar;
        reader.readMessage(value,proto.Bar.deserializeBinaryFromReader);
        msg.getBarsList().push(value);
        msg.setBarsList(msg.getBarsList());
        break;
      case 3:
        var value = /** @type {string} */ (reader.readString());
        msg.setSaliencyId(value);
        break;
      case 4:
        var value = /** @type {string} */ (reader.readString());
        msg.setName(value);
        break;
      default:
        reader.skipField();
        break;
      }
    }
    return msg;
  };
  
  
  /**
   * Class method variant: serializes the given message to binary data
   * (in protobuf wire format), writing to the given BinaryWriter.
   * @param {!proto.BarGroup} message
   * @param {!jspb.BinaryWriter} writer
   */
  proto.BarGroup.serializeBinaryToWriter = function(message, writer) {
    message.serializeBinaryToWriter(writer);
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format).
   * @return {!Uint8Array}
   */
  proto.BarGroup.prototype.serializeBinary = function() {
    var writer = new jspb.BinaryWriter();
    this.serializeBinaryToWriter(writer);
    return writer.getResultBuffer();
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format),
   * writing to the given BinaryWriter.
   * @param {!jspb.BinaryWriter} writer
   */
  proto.BarGroup.prototype.serializeBinaryToWriter = function (writer) {
    var f = undefined;
    f = jspb.Message.getField(this, 1);
    if (f != null) {
      writer.writeDouble(
        1,
        f
      );
    }
    f = this.getBarsList();
    if (f.length > 0) {
      writer.writeRepeatedMessage(
        2,
        f,
        proto.Bar.serializeBinaryToWriter
      );
    }
    f = jspb.Message.getField(this, 3);
    if (f != null) {
      writer.writeString(
        3,
        f
      );
    }
    f = jspb.Message.getField(this, 4);
    if (f != null) {
      writer.writeString(
        4,
        f
      );
    }
  };
  
  
  /**
   * Creates a deep clone of this proto. No data is shared with the original.
   * @return {!proto.BarGroup} The clone.
   */
  proto.BarGroup.prototype.cloneMessage = function() {
    return /** @type {!proto.BarGroup} */ (jspb.Message.cloneMessage(this));
  };
  
  
  /**
   * optional double value = 1;
   * @return {number}
   */
  proto.BarGroup.prototype.getValue = function() {
    return /** @type {number} */ (!this.hasValue() ? 0.0 : +jspb.Message.getField(this, 1));
  };
  
  
  /** @param {number?|undefined} value  */
  proto.BarGroup.prototype.setValue = function(value) {
    jspb.Message.setField(this, 1, value);
  };
  
  
  proto.BarGroup.prototype.clearValue = function() {
    jspb.Message.setField(this, 1, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.BarGroup.prototype.hasValue = function() {
    return jspb.Message.getField(this, 1) != null;
  };
  
  
  /**
   * repeated Bar bars = 2;
   * If you change this array by adding, removing or replacing elements, or if you
   * replace the array itself, then you must call the setter to update it.
   * @return {!Array.<!proto.Bar>}
   */
  proto.BarGroup.prototype.getBarsList = function() {
    return /** @type{!Array.<!proto.Bar>} */ (
      jspb.Message.getRepeatedWrapperField(this, proto.Bar, 2));
  };
  
  
  /** @param {Array.<!proto.Bar>} value  */
  proto.BarGroup.prototype.setBarsList = function(value) {
    jspb.Message.setRepeatedWrapperField(this, 2, value);
  };
  
  
  proto.BarGroup.prototype.clearBarsList = function() {
    this.setBarsList([]);
  };
  
  
  /**
   * optional string saliency_id = 3;
   * @return {string}
   */
  proto.BarGroup.prototype.getSaliencyId = function() {
    return /** @type {string} */ (!this.hasSaliencyId() ? "" : jspb.Message.getField(this, 3));
  };
  
  
  /** @param {string?|undefined} value  */
  proto.BarGroup.prototype.setSaliencyId = function(value) {
    jspb.Message.setField(this, 3, value);
  };
  
  
  proto.BarGroup.prototype.clearSaliencyId = function() {
    jspb.Message.setField(this, 3, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.BarGroup.prototype.hasSaliencyId = function() {
    return jspb.Message.getField(this, 3) != null;
  };
  
  
  /**
   * optional string name = 4;
   * @return {string}
   */
  proto.BarGroup.prototype.getName = function() {
    return /** @type {string} */ (!this.hasName() ? "" : jspb.Message.getField(this, 4));
  };
  
  
  /** @param {string?|undefined} value  */
  proto.BarGroup.prototype.setName = function(value) {
    jspb.Message.setField(this, 4, value);
  };
  
  
  proto.BarGroup.prototype.clearName = function() {
    jspb.Message.setField(this, 4, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.BarGroup.prototype.hasName = function() {
    return jspb.Message.getField(this, 4) != null;
  };
  
  
  
  /**
   * Generated by JsPbCodeGenerator.
   * @param {Array=} opt_data Optional initial data array, typically from a
   * server response, or constructed directly in Javascript. The array is used
   * in place and becomes part of the constructed object. It is not cloned.
   * If no data is provided, the constructed object will be empty, but still
   * valid.
   * @extends {jspb.Message}
   * @constructor
   */
  proto.Bar = function(opt_data) {
    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
  };
  goog.inherits(proto.Bar, jspb.Message);
  if (goog.DEBUG && !COMPILED) {
    proto.Bar.displayName = 'proto.Bar';
  }
  
  
  if (jspb.Message.GENERATE_TO_OBJECT) {
  /**
   * Creates an object representation of this proto suitable for use in Soy templates.
   * Field names that are reserved in JavaScript and will be renamed to pb_name.
   * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
   * For the list of reserved names please see:
   *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
   * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
   *     for transitional soy proto support: http://goto/soy-param-migration
   * @return {!Object}
   */
  proto.Bar.prototype.toObject = function(opt_includeInstance) {
    return proto.Bar.toObject(opt_includeInstance, this);
  };
  
  
  /**
   * Static version of the {@see toObject} method.
   * @param {boolean|undefined} includeInstance Whether to include the JSPB
   *     instance for transitional soy proto support:
   *     http://goto/soy-param-migration
   * @param {!proto.Bar} msg The msg instance to transform.
   * @return {!Object}
   */
  proto.Bar.toObject = function(includeInstance, msg) {
    var f, obj = {
      value: +jspb.Message.getField(msg, 1),
      saliencyId: jspb.Message.getField(msg, 2),
      name: jspb.Message.getField(msg, 3)
    };
  
    if (includeInstance) {
      obj.$jspbMessageInstance = msg;
    }
    return obj;
  };
  }
  
  
  /**
   * Deserializes binary data (in protobuf wire format).
   * @param {jspb.ByteSource} bytes The bytes to deserialize.
   * @return {!proto.Bar}
   */
  proto.Bar.deserializeBinary = function(bytes) {
    var reader = new jspb.BinaryReader(bytes);
    var msg = new proto.Bar;
    return proto.Bar.deserializeBinaryFromReader(msg, reader);
  };
  
  
  /**
   * Deserializes binary data (in protobuf wire format) from the
   * given reader into the given message object.
   * @param {!proto.Bar} msg The message object to deserialize into.
   * @param {!jspb.BinaryReader} reader The BinaryReader to use.
   * @return {!proto.Bar}
   */
  proto.Bar.deserializeBinaryFromReader = function(msg, reader) {
    while (reader.nextField()) {
      if (reader.isEndGroup()) {
        break;
      }
      var field = reader.getFieldNumber();
      switch (field) {
      case 1:
        var value = /** @type {number} */ (reader.readDouble());
        msg.setValue(value);
        break;
      case 2:
        var value = /** @type {string} */ (reader.readString());
        msg.setSaliencyId(value);
        break;
      case 3:
        var value = /** @type {string} */ (reader.readString());
        msg.setName(value);
        break;
      default:
        reader.skipField();
        break;
      }
    }
    return msg;
  };
  
  
  /**
   * Class method variant: serializes the given message to binary data
   * (in protobuf wire format), writing to the given BinaryWriter.
   * @param {!proto.Bar} message
   * @param {!jspb.BinaryWriter} writer
   */
  proto.Bar.serializeBinaryToWriter = function(message, writer) {
    message.serializeBinaryToWriter(writer);
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format).
   * @return {!Uint8Array}
   */
  proto.Bar.prototype.serializeBinary = function() {
    var writer = new jspb.BinaryWriter();
    this.serializeBinaryToWriter(writer);
    return writer.getResultBuffer();
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format),
   * writing to the given BinaryWriter.
   * @param {!jspb.BinaryWriter} writer
   */
  proto.Bar.prototype.serializeBinaryToWriter = function (writer) {
    var f = undefined;
    f = jspb.Message.getField(this, 1);
    if (f != null) {
      writer.writeDouble(
        1,
        f
      );
    }
    f = jspb.Message.getField(this, 2);
    if (f != null) {
      writer.writeString(
        2,
        f
      );
    }
    f = jspb.Message.getField(this, 3);
    if (f != null) {
      writer.writeString(
        3,
        f
      );
    }
  };
  
  
  /**
   * Creates a deep clone of this proto. No data is shared with the original.
   * @return {!proto.Bar} The clone.
   */
  proto.Bar.prototype.cloneMessage = function() {
    return /** @type {!proto.Bar} */ (jspb.Message.cloneMessage(this));
  };
  
  
  /**
   * required double value = 1;
   * @return {number}
   */
  proto.Bar.prototype.getValue = function() {
    return /** @type {number} */ (!this.hasValue() ? 0.0 : +jspb.Message.getField(this, 1));
  };
  
  
  /** @param {number|undefined} value  */
  proto.Bar.prototype.setValue = function(value) {
    jspb.Message.setField(this, 1, value);
  };
  
  
  proto.Bar.prototype.clearValue = function() {
    jspb.Message.setField(this, 1, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.Bar.prototype.hasValue = function() {
    return jspb.Message.getField(this, 1) != null;
  };
  
  
  /**
   * optional string saliency_id = 2;
   * @return {string}
   */
  proto.Bar.prototype.getSaliencyId = function() {
    return /** @type {string} */ (!this.hasSaliencyId() ? "" : jspb.Message.getField(this, 2));
  };
  
  
  /** @param {string?|undefined} value  */
  proto.Bar.prototype.setSaliencyId = function(value) {
    jspb.Message.setField(this, 2, value);
  };
  
  
  proto.Bar.prototype.clearSaliencyId = function() {
    jspb.Message.setField(this, 2, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.Bar.prototype.hasSaliencyId = function() {
    return jspb.Message.getField(this, 2) != null;
  };
  
  
  /**
   * optional string name = 3;
   * @return {string}
   */
  proto.Bar.prototype.getName = function() {
    return /** @type {string} */ (!this.hasName() ? "" : jspb.Message.getField(this, 3));
  };
  
  
  /** @param {string?|undefined} value  */
  proto.Bar.prototype.setName = function(value) {
    jspb.Message.setField(this, 3, value);
  };
  
  
  proto.Bar.prototype.clearName = function() {
    jspb.Message.setField(this, 3, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.Bar.prototype.hasName = function() {
    return jspb.Message.getField(this, 3) != null;
  };
  
  
  
  /**
   * Generated by JsPbCodeGenerator.
   * @param {Array=} opt_data Optional initial data array, typically from a
   * server response, or constructed directly in Javascript. The array is used
   * in place and becomes part of the constructed object. It is not cloned.
   * If no data is provided, the constructed object will be empty, but still
   * valid.
   * @extends {jspb.Message}
   * @constructor
   */
  proto.Layer = function(opt_data) {
    jspb.Message.initialize(this, opt_data, 0, -1, proto.Layer.repeatedFields_, null);
  };
  goog.inherits(proto.Layer, jspb.Message);
  if (goog.DEBUG && !COMPILED) {
    proto.Layer.displayName = 'proto.Layer';
  }
  /**
   * List of repeated fields within this message type.
   * @private {!Array<number>}
   * @const
   */
  proto.Layer.repeatedFields_ = [2];
  
  
  
  if (jspb.Message.GENERATE_TO_OBJECT) {
  /**
   * Creates an object representation of this proto suitable for use in Soy templates.
   * Field names that are reserved in JavaScript and will be renamed to pb_name.
   * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
   * For the list of reserved names please see:
   *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
   * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
   *     for transitional soy proto support: http://goto/soy-param-migration
   * @return {!Object}
   */
  proto.Layer.prototype.toObject = function(opt_includeInstance) {
    return proto.Layer.toObject(opt_includeInstance, this);
  };
  
  
  /**
   * Static version of the {@see toObject} method.
   * @param {boolean|undefined} includeInstance Whether to include the JSPB
   *     instance for transitional soy proto support:
   *     http://goto/soy-param-migration
   * @param {!proto.Layer} msg The msg instance to transform.
   * @return {!Object}
   */
  proto.Layer.toObject = function(includeInstance, msg) {
    var f, obj = {
      name: jspb.Message.getField(msg, 1),
      cellsList: jspb.Message.getRepeatedFloatingPointField(msg, 2),
      width: jspb.Message.getField(msg, 3),
      height: jspb.Message.getField(msg, 4)
    };
  
    if (includeInstance) {
      obj.$jspbMessageInstance = msg;
    }
    return obj;
  };
  }
  
  
  /**
   * Deserializes binary data (in protobuf wire format).
   * @param {jspb.ByteSource} bytes The bytes to deserialize.
   * @return {!proto.Layer}
   */
  proto.Layer.deserializeBinary = function(bytes) {
    var reader = new jspb.BinaryReader(bytes);
    var msg = new proto.Layer;
    return proto.Layer.deserializeBinaryFromReader(msg, reader);
  };
  
  
  /**
   * Deserializes binary data (in protobuf wire format) from the
   * given reader into the given message object.
   * @param {!proto.Layer} msg The message object to deserialize into.
   * @param {!jspb.BinaryReader} reader The BinaryReader to use.
   * @return {!proto.Layer}
   */
  proto.Layer.deserializeBinaryFromReader = function(msg, reader) {
    while (reader.nextField()) {
      if (reader.isEndGroup()) {
        break;
      }
      var field = reader.getFieldNumber();
      switch (field) {
      case 1:
        var value = /** @type {string} */ (reader.readString());
        msg.setName(value);
        break;
      case 2:
        var value = /** @type {number} */ (reader.readDouble());
        msg.getCellsList().push(value);
        msg.setCellsList(msg.getCellsList());
        break;
      case 3:
        var value = /** @type {number} */ (reader.readUint32());
        msg.setWidth(value);
        break;
      case 4:
        var value = /** @type {number} */ (reader.readUint32());
        msg.setHeight(value);
        break;
      default:
        reader.skipField();
        break;
      }
    }
    return msg;
  };
  
  
  /**
   * Class method variant: serializes the given message to binary data
   * (in protobuf wire format), writing to the given BinaryWriter.
   * @param {!proto.Layer} message
   * @param {!jspb.BinaryWriter} writer
   */
  proto.Layer.serializeBinaryToWriter = function(message, writer) {
    message.serializeBinaryToWriter(writer);
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format).
   * @return {!Uint8Array}
   */
  proto.Layer.prototype.serializeBinary = function() {
    var writer = new jspb.BinaryWriter();
    this.serializeBinaryToWriter(writer);
    return writer.getResultBuffer();
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format),
   * writing to the given BinaryWriter.
   * @param {!jspb.BinaryWriter} writer
   */
  proto.Layer.prototype.serializeBinaryToWriter = function (writer) {
    var f = undefined;
    f = jspb.Message.getField(this, 1);
    if (f != null) {
      writer.writeString(
        1,
        f
      );
    }
    f = this.getCellsList();
    if (f.length > 0) {
      writer.writeRepeatedDouble(
        2,
        f
      );
    }
    f = jspb.Message.getField(this, 3);
    if (f != null) {
      writer.writeUint32(
        3,
        f
      );
    }
    f = jspb.Message.getField(this, 4);
    if (f != null) {
      writer.writeUint32(
        4,
        f
      );
    }
  };
  
  
  /**
   * Creates a deep clone of this proto. No data is shared with the original.
   * @return {!proto.Layer} The clone.
   */
  proto.Layer.prototype.cloneMessage = function() {
    return /** @type {!proto.Layer} */ (jspb.Message.cloneMessage(this));
  };
  
  
  /**
   * optional string name = 1;
   * @return {string}
   */
  proto.Layer.prototype.getName = function() {
    return /** @type {string} */ (!this.hasName() ? "" : jspb.Message.getField(this, 1));
  };
  
  
  /** @param {string?|undefined} value  */
  proto.Layer.prototype.setName = function(value) {
    jspb.Message.setField(this, 1, value);
  };
  
  
  proto.Layer.prototype.clearName = function() {
    jspb.Message.setField(this, 1, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.Layer.prototype.hasName = function() {
    return jspb.Message.getField(this, 1) != null;
  };
  
  
  /**
   * repeated double cells = 2;
   * If you change this array by adding, removing or replacing elements, or if you
   * replace the array itself, then you must call the setter to update it.
   * @return {!Array.<number>}
   */
  proto.Layer.prototype.getCellsList = function() {
    return /** @type {!Array.<number>} */ (jspb.Message.getRepeatedFloatingPointField(this, 2));
  };
  
  
  /** @param {Array.<number>} value  */
  proto.Layer.prototype.setCellsList = function(value) {
    jspb.Message.setField(this, 2, value || []);
  };
  
  
  proto.Layer.prototype.clearCellsList = function() {
    jspb.Message.setField(this, 2, []);
  };
  
  
  /**
   * optional uint32 width = 3;
   * @return {number}
   */
  proto.Layer.prototype.getWidth = function() {
    return /** @type {number} */ (!this.hasWidth() ? 0 : jspb.Message.getField(this, 3));
  };
  
  
  /** @param {number?|undefined} value  */
  proto.Layer.prototype.setWidth = function(value) {
    jspb.Message.setField(this, 3, value);
  };
  
  
  proto.Layer.prototype.clearWidth = function() {
    jspb.Message.setField(this, 3, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.Layer.prototype.hasWidth = function() {
    return jspb.Message.getField(this, 3) != null;
  };
  
  
  /**
   * optional uint32 height = 4;
   * @return {number}
   */
  proto.Layer.prototype.getHeight = function() {
    return /** @type {number} */ (!this.hasHeight() ? 0 : jspb.Message.getField(this, 4));
  };
  
  
  /** @param {number?|undefined} value  */
  proto.Layer.prototype.setHeight = function(value) {
    jspb.Message.setField(this, 4, value);
  };
  
  
  proto.Layer.prototype.clearHeight = function() {
    jspb.Message.setField(this, 4, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.Layer.prototype.hasHeight = function() {
    return jspb.Message.getField(this, 4) != null;
  };
  
  
  
  /**
   * Generated by JsPbCodeGenerator.
   * @param {Array=} opt_data Optional initial data array, typically from a
   * server response, or constructed directly in Javascript. The array is used
   * in place and becomes part of the constructed object. It is not cloned.
   * If no data is provided, the constructed object will be empty, but still
   * valid.
   * @extends {jspb.Message}
   * @constructor
   */
  proto.Layers = function(opt_data) {
    jspb.Message.initialize(this, opt_data, 0, -1, proto.Layers.repeatedFields_, null);
  };
  goog.inherits(proto.Layers, jspb.Message);
  if (goog.DEBUG && !COMPILED) {
    proto.Layers.displayName = 'proto.Layers';
  }
  /**
   * List of repeated fields within this message type.
   * @private {!Array<number>}
   * @const
   */
  proto.Layers.repeatedFields_ = [1];
  
  
  
  if (jspb.Message.GENERATE_TO_OBJECT) {
  /**
   * Creates an object representation of this proto suitable for use in Soy templates.
   * Field names that are reserved in JavaScript and will be renamed to pb_name.
   * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
   * For the list of reserved names please see:
   *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
   * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
   *     for transitional soy proto support: http://goto/soy-param-migration
   * @return {!Object}
   */
  proto.Layers.prototype.toObject = function(opt_includeInstance) {
    return proto.Layers.toObject(opt_includeInstance, this);
  };
  
  
  /**
   * Static version of the {@see toObject} method.
   * @param {boolean|undefined} includeInstance Whether to include the JSPB
   *     instance for transitional soy proto support:
   *     http://goto/soy-param-migration
   * @param {!proto.Layers} msg The msg instance to transform.
   * @return {!Object}
   */
  proto.Layers.toObject = function(includeInstance, msg) {
    var f, obj = {
      layersList: jspb.Message.toObjectList(msg.getLayersList(),
      proto.Layer.toObject, includeInstance)
    };
  
    if (includeInstance) {
      obj.$jspbMessageInstance = msg;
    }
    return obj;
  };
  }
  
  
  /**
   * Deserializes binary data (in protobuf wire format).
   * @param {jspb.ByteSource} bytes The bytes to deserialize.
   * @return {!proto.Layers}
   */
  proto.Layers.deserializeBinary = function(bytes) {
    var reader = new jspb.BinaryReader(bytes);
    var msg = new proto.Layers;
    return proto.Layers.deserializeBinaryFromReader(msg, reader);
  };
  
  
  /**
   * Deserializes binary data (in protobuf wire format) from the
   * given reader into the given message object.
   * @param {!proto.Layers} msg The message object to deserialize into.
   * @param {!jspb.BinaryReader} reader The BinaryReader to use.
   * @return {!proto.Layers}
   */
  proto.Layers.deserializeBinaryFromReader = function(msg, reader) {
    while (reader.nextField()) {
      if (reader.isEndGroup()) {
        break;
      }
      var field = reader.getFieldNumber();
      switch (field) {
      case 1:
        var value = new proto.Layer;
        reader.readMessage(value,proto.Layer.deserializeBinaryFromReader);
        msg.getLayersList().push(value);
        msg.setLayersList(msg.getLayersList());
        break;
      default:
        reader.skipField();
        break;
      }
    }
    return msg;
  };
  
  
  /**
   * Class method variant: serializes the given message to binary data
   * (in protobuf wire format), writing to the given BinaryWriter.
   * @param {!proto.Layers} message
   * @param {!jspb.BinaryWriter} writer
   */
  proto.Layers.serializeBinaryToWriter = function(message, writer) {
    message.serializeBinaryToWriter(writer);
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format).
   * @return {!Uint8Array}
   */
  proto.Layers.prototype.serializeBinary = function() {
    var writer = new jspb.BinaryWriter();
    this.serializeBinaryToWriter(writer);
    return writer.getResultBuffer();
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format),
   * writing to the given BinaryWriter.
   * @param {!jspb.BinaryWriter} writer
   */
  proto.Layers.prototype.serializeBinaryToWriter = function (writer) {
    var f = undefined;
    f = this.getLayersList();
    if (f.length > 0) {
      writer.writeRepeatedMessage(
        1,
        f,
        proto.Layer.serializeBinaryToWriter
      );
    }
  };
  
  
  /**
   * Creates a deep clone of this proto. No data is shared with the original.
   * @return {!proto.Layers} The clone.
   */
  proto.Layers.prototype.cloneMessage = function() {
    return /** @type {!proto.Layers} */ (jspb.Message.cloneMessage(this));
  };
  
  
  /**
   * repeated Layer layers = 1;
   * If you change this array by adding, removing or replacing elements, or if you
   * replace the array itself, then you must call the setter to update it.
   * @return {!Array.<!proto.Layer>}
   */
  proto.Layers.prototype.getLayersList = function() {
    return /** @type{!Array.<!proto.Layer>} */ (
      jspb.Message.getRepeatedWrapperField(this, proto.Layer, 1));
  };
  
  
  /** @param {Array.<!proto.Layer>} value  */
  proto.Layers.prototype.setLayersList = function(value) {
    jspb.Message.setRepeatedWrapperField(this, 1, value);
  };
  
  
  proto.Layers.prototype.clearLayersList = function() {
    this.setLayersList([]);
  };
  
  
  
  /**
   * Generated by JsPbCodeGenerator.
   * @param {Array=} opt_data Optional initial data array, typically from a
   * server response, or constructed directly in Javascript. The array is used
   * in place and becomes part of the constructed object. It is not cloned.
   * If no data is provided, the constructed object will be empty, but still
   * valid.
   * @extends {jspb.Message}
   * @constructor
   */
  proto.Saliency = function(opt_data) {
    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
  };
  goog.inherits(proto.Saliency, jspb.Message);
  if (goog.DEBUG && !COMPILED) {
    proto.Saliency.displayName = 'proto.Saliency';
  }
  
  
  if (jspb.Message.GENERATE_TO_OBJECT) {
  /**
   * Creates an object representation of this proto suitable for use in Soy templates.
   * Field names that are reserved in JavaScript and will be renamed to pb_name.
   * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
   * For the list of reserved names please see:
   *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
   * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
   *     for transitional soy proto support: http://goto/soy-param-migration
   * @return {!Object}
   */
  proto.Saliency.prototype.toObject = function(opt_includeInstance) {
    return proto.Saliency.toObject(opt_includeInstance, this);
  };
  
  
  /**
   * Static version of the {@see toObject} method.
   * @param {boolean|undefined} includeInstance Whether to include the JSPB
   *     instance for transitional soy proto support:
   *     http://goto/soy-param-migration
   * @param {!proto.Saliency} msg The msg instance to transform.
   * @return {!Object}
   */
  proto.Saliency.toObject = function(includeInstance, msg) {
    var f, obj = {
      saliencyMapMap: (f = msg.getSaliencyMapMap(true)) ? f.toArray() : []
    };
  
    if (includeInstance) {
      obj.$jspbMessageInstance = msg;
    }
    return obj;
  };
  }
  
  
  /**
   * Deserializes binary data (in protobuf wire format).
   * @param {jspb.ByteSource} bytes The bytes to deserialize.
   * @return {!proto.Saliency}
   */
  proto.Saliency.deserializeBinary = function(bytes) {
    var reader = new jspb.BinaryReader(bytes);
    var msg = new proto.Saliency;
    return proto.Saliency.deserializeBinaryFromReader(msg, reader);
  };
  
  
  /**
   * Deserializes binary data (in protobuf wire format) from the
   * given reader into the given message object.
   * @param {!proto.Saliency} msg The message object to deserialize into.
   * @param {!jspb.BinaryReader} reader The BinaryReader to use.
   * @return {!proto.Saliency}
   */
  proto.Saliency.deserializeBinaryFromReader = function(msg, reader) {
    while (reader.nextField()) {
      if (reader.isEndGroup()) {
        break;
      }
      var field = reader.getFieldNumber();
      switch (field) {
      case 1:
        var value = msg.getSaliencyMapMap();
        reader.readMessage(value, function(message, reader) {
          jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readMessage, proto.Layers.deserializeBinaryFromReader);
           });
        break;
      default:
        reader.skipField();
        break;
      }
    }
    return msg;
  };
  
  
  /**
   * Class method variant: serializes the given message to binary data
   * (in protobuf wire format), writing to the given BinaryWriter.
   * @param {!proto.Saliency} message
   * @param {!jspb.BinaryWriter} writer
   */
  proto.Saliency.serializeBinaryToWriter = function(message, writer) {
    message.serializeBinaryToWriter(writer);
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format).
   * @return {!Uint8Array}
   */
  proto.Saliency.prototype.serializeBinary = function() {
    var writer = new jspb.BinaryWriter();
    this.serializeBinaryToWriter(writer);
    return writer.getResultBuffer();
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format),
   * writing to the given BinaryWriter.
   * @param {!jspb.BinaryWriter} writer
   */
  proto.Saliency.prototype.serializeBinaryToWriter = function (writer) {
    var f = undefined;
    f = this.getSaliencyMapMap(true);
    if (f && f.getLength() > 0) {
      f.serializeBinary(1, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeMessage, proto.Layers.serializeBinaryToWriter);
    }
  };
  
  
  /**
   * Creates a deep clone of this proto. No data is shared with the original.
   * @return {!proto.Saliency} The clone.
   */
  proto.Saliency.prototype.cloneMessage = function() {
    return /** @type {!proto.Saliency} */ (jspb.Message.cloneMessage(this));
  };
  
  
  /**
   * map<string, Layers> saliency_map = 1;
   * @param {boolean=} opt_noLazyCreate Do not create the map if
   * empty, instead returning `undefined`
   * @return {!jspb.Map<string,!proto.Layers>}
   */
  proto.Saliency.prototype.getSaliencyMapMap = function(opt_noLazyCreate) {
    return /** @type {!jspb.Map<string,!proto.Layers>} */ (
        jspb.Message.getMapField(this, 1, opt_noLazyCreate,
        proto.Layers));
  };
  
  
  
  /**
   * Generated by JsPbCodeGenerator.
   * @param {Array=} opt_data Optional initial data array, typically from a
   * server response, or constructed directly in Javascript. The array is used
   * in place and becomes part of the constructed object. It is not cloned.
   * If no data is provided, the constructed object will be empty, but still
   * valid.
   * @extends {jspb.Message}
   * @constructor
   */
  proto.MultiMessage = function(opt_data) {
    jspb.Message.initialize(this, opt_data, 0, -1, proto.MultiMessage.repeatedFields_, null);
  };
  goog.inherits(proto.MultiMessage, jspb.Message);
  if (goog.DEBUG && !COMPILED) {
    proto.MultiMessage.displayName = 'proto.MultiMessage';
  }
  /**
   * List of repeated fields within this message type.
   * @private {!Array<number>}
   * @const
   */
  proto.MultiMessage.repeatedFields_ = [1];
  
  
  
  if (jspb.Message.GENERATE_TO_OBJECT) {
  /**
   * Creates an object representation of this proto suitable for use in Soy templates.
   * Field names that are reserved in JavaScript and will be renamed to pb_name.
   * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
   * For the list of reserved names please see:
   *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
   * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
   *     for transitional soy proto support: http://goto/soy-param-migration
   * @return {!Object}
   */
  proto.MultiMessage.prototype.toObject = function(opt_includeInstance) {
    return proto.MultiMessage.toObject(opt_includeInstance, this);
  };
  
  
  /**
   * Static version of the {@see toObject} method.
   * @param {boolean|undefined} includeInstance Whether to include the JSPB
   *     instance for transitional soy proto support:
   *     http://goto/soy-param-migration
   * @param {!proto.MultiMessage} msg The msg instance to transform.
   * @return {!Object}
   */
  proto.MultiMessage.toObject = function(includeInstance, msg) {
    var f, obj = {
      packetsList: jspb.Message.toObjectList(msg.getPacketsList(),
      proto.ScaiiPacket.toObject, includeInstance)
    };
  
    if (includeInstance) {
      obj.$jspbMessageInstance = msg;
    }
    return obj;
  };
  }
  
  
  /**
   * Deserializes binary data (in protobuf wire format).
   * @param {jspb.ByteSource} bytes The bytes to deserialize.
   * @return {!proto.MultiMessage}
   */
  proto.MultiMessage.deserializeBinary = function(bytes) {
    var reader = new jspb.BinaryReader(bytes);
    var msg = new proto.MultiMessage;
    return proto.MultiMessage.deserializeBinaryFromReader(msg, reader);
  };
  
  
  /**
   * Deserializes binary data (in protobuf wire format) from the
   * given reader into the given message object.
   * @param {!proto.MultiMessage} msg The message object to deserialize into.
   * @param {!jspb.BinaryReader} reader The BinaryReader to use.
   * @return {!proto.MultiMessage}
   */
  proto.MultiMessage.deserializeBinaryFromReader = function(msg, reader) {
    while (reader.nextField()) {
      if (reader.isEndGroup()) {
        break;
      }
      var field = reader.getFieldNumber();
      switch (field) {
      case 1:
        var value = new proto.ScaiiPacket;
        reader.readMessage(value,proto.ScaiiPacket.deserializeBinaryFromReader);
        msg.getPacketsList().push(value);
        msg.setPacketsList(msg.getPacketsList());
        break;
      default:
        reader.skipField();
        break;
      }
    }
    return msg;
  };
  
  
  /**
   * Class method variant: serializes the given message to binary data
   * (in protobuf wire format), writing to the given BinaryWriter.
   * @param {!proto.MultiMessage} message
   * @param {!jspb.BinaryWriter} writer
   */
  proto.MultiMessage.serializeBinaryToWriter = function(message, writer) {
    message.serializeBinaryToWriter(writer);
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format).
   * @return {!Uint8Array}
   */
  proto.MultiMessage.prototype.serializeBinary = function() {
    var writer = new jspb.BinaryWriter();
    this.serializeBinaryToWriter(writer);
    return writer.getResultBuffer();
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format),
   * writing to the given BinaryWriter.
   * @param {!jspb.BinaryWriter} writer
   */
  proto.MultiMessage.prototype.serializeBinaryToWriter = function (writer) {
    var f = undefined;
    f = this.getPacketsList();
    if (f.length > 0) {
      writer.writeRepeatedMessage(
        1,
        f,
        proto.ScaiiPacket.serializeBinaryToWriter
      );
    }
  };
  
  
  /**
   * Creates a deep clone of this proto. No data is shared with the original.
   * @return {!proto.MultiMessage} The clone.
   */
  proto.MultiMessage.prototype.cloneMessage = function() {
    return /** @type {!proto.MultiMessage} */ (jspb.Message.cloneMessage(this));
  };
  
  
  /**
   * repeated ScaiiPacket packets = 1;
   * If you change this array by adding, removing or replacing elements, or if you
   * replace the array itself, then you must call the setter to update it.
   * @return {!Array.<!proto.ScaiiPacket>}
   */
  proto.MultiMessage.prototype.getPacketsList = function() {
    return /** @type{!Array.<!proto.ScaiiPacket>} */ (
      jspb.Message.getRepeatedWrapperField(this, proto.ScaiiPacket, 1));
  };
  
  
  /** @param {Array.<!proto.ScaiiPacket>} value  */
  proto.MultiMessage.prototype.setPacketsList = function(value) {
    jspb.Message.setRepeatedWrapperField(this, 1, value);
  };
  
  
  proto.MultiMessage.prototype.clearPacketsList = function() {
    this.setPacketsList([]);
  };
  
  
  
  /**
   * Generated by JsPbCodeGenerator.
   * @param {Array=} opt_data Optional initial data array, typically from a
   * server response, or constructed directly in Javascript. The array is used
   * in place and becomes part of the constructed object. It is not cloned.
   * If no data is provided, the constructed object will be empty, but still
   * valid.
   * @extends {jspb.Message}
   * @constructor
   */
  proto.ScaiiPacket = function(opt_data) {
    jspb.Message.initialize(this, opt_data, 0, -1, null, proto.ScaiiPacket.oneofGroups_);
  };
  goog.inherits(proto.ScaiiPacket, jspb.Message);
  if (goog.DEBUG && !COMPILED) {
    proto.ScaiiPacket.displayName = 'proto.ScaiiPacket';
  }
  /**
   * Oneof group definitions for this message. Each group defines the field
   * numbers belonging to that group. When of these fields' value is set, all
   * other fields in the group are cleared. During deserialization, if multiple
   * fields are encountered for a group, only the last value seen will be kept.
   * @private {!Array<!Array<number>>}
   * @const
   */
  proto.ScaiiPacket.oneofGroups_ = [[1,2,3,4,5,6,7]];
  
  /**
   * @enum {number}
   */
  proto.ScaiiPacket.SpecificMsgCase = {
    SPECIFIC_MSG_NOT_SET: 0,
    USER_COMMAND: 1,
    REPLAY_SESSION_CONFIG: 2,
    EXPL_DETAILS: 3,
    REPLAY_CHOICE_CONFIG: 4,
    STUDY_QUESTIONS: 5,
    STUDY_QUESTION_ANSWER: 6,
    LOG_FILE_ENTRY: 7
  };
  
  /**
   * @return {proto.ScaiiPacket.SpecificMsgCase}
   */
  proto.ScaiiPacket.prototype.getSpecificMsgCase = function() {
    return /** @type {proto.ScaiiPacket.SpecificMsgCase} */(jspb.Message.computeOneofCase(this, proto.ScaiiPacket.oneofGroups_[0]));
  };
  
  
  
  if (jspb.Message.GENERATE_TO_OBJECT) {
  /**
   * Creates an object representation of this proto suitable for use in Soy templates.
   * Field names that are reserved in JavaScript and will be renamed to pb_name.
   * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
   * For the list of reserved names please see:
   *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
   * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
   *     for transitional soy proto support: http://goto/soy-param-migration
   * @return {!Object}
   */
  proto.ScaiiPacket.prototype.toObject = function(opt_includeInstance) {
    return proto.ScaiiPacket.toObject(opt_includeInstance, this);
  };
  
  
  /**
   * Static version of the {@see toObject} method.
   * @param {boolean|undefined} includeInstance Whether to include the JSPB
   *     instance for transitional soy proto support:
   *     http://goto/soy-param-migration
   * @param {!proto.ScaiiPacket} msg The msg instance to transform.
   * @return {!Object}
   */
  proto.ScaiiPacket.toObject = function(includeInstance, msg) {
    var f, obj = {
      userCommand: (f = msg.getUserCommand()) && proto.UserCommand.toObject(includeInstance, f),
      replaySessionConfig: (f = msg.getReplaySessionConfig()) && proto.SC2ReplaySessionConfig.toObject(includeInstance, f),
      explDetails: (f = msg.getExplDetails()) && proto.ExplanationDetails.toObject(includeInstance, f),
      replayChoiceConfig: (f = msg.getReplayChoiceConfig()) && proto.ReplayChoiceConfig.toObject(includeInstance, f),
      studyQuestions: (f = msg.getStudyQuestions()) && proto.StudyQuestions.toObject(includeInstance, f),
      studyQuestionAnswer: (f = msg.getStudyQuestionAnswer()) && proto.StudyQuestionAnswer.toObject(includeInstance, f),
      logFileEntry: (f = msg.getLogFileEntry()) && proto.LogFileEntry.toObject(includeInstance, f)
    };
  
    if (includeInstance) {
      obj.$jspbMessageInstance = msg;
    }
    return obj;
  };
  }
  
  
  /**
   * Deserializes binary data (in protobuf wire format).
   * @param {jspb.ByteSource} bytes The bytes to deserialize.
   * @return {!proto.ScaiiPacket}
   */
  proto.ScaiiPacket.deserializeBinary = function(bytes) {
    var reader = new jspb.BinaryReader(bytes);
    var msg = new proto.ScaiiPacket;
    return proto.ScaiiPacket.deserializeBinaryFromReader(msg, reader);
  };
  
  
  /**
   * Deserializes binary data (in protobuf wire format) from the
   * given reader into the given message object.
   * @param {!proto.ScaiiPacket} msg The message object to deserialize into.
   * @param {!jspb.BinaryReader} reader The BinaryReader to use.
   * @return {!proto.ScaiiPacket}
   */
  proto.ScaiiPacket.deserializeBinaryFromReader = function(msg, reader) {
    while (reader.nextField()) {
      if (reader.isEndGroup()) {
        break;
      }
      var field = reader.getFieldNumber();
      switch (field) {
      case 1:
        var value = new proto.UserCommand;
        reader.readMessage(value,proto.UserCommand.deserializeBinaryFromReader);
        msg.setUserCommand(value);
        break;
      case 2:
        var value = new proto.SC2ReplaySessionConfig;
        reader.readMessage(value,proto.SC2ReplaySessionConfig.deserializeBinaryFromReader);
        msg.setReplaySessionConfig(value);
        break;
      case 3:
        var value = new proto.ExplanationDetails;
        reader.readMessage(value,proto.ExplanationDetails.deserializeBinaryFromReader);
        msg.setExplDetails(value);
        break;
      case 4:
        var value = new proto.ReplayChoiceConfig;
        reader.readMessage(value,proto.ReplayChoiceConfig.deserializeBinaryFromReader);
        msg.setReplayChoiceConfig(value);
        break;
      case 5:
        var value = new proto.StudyQuestions;
        reader.readMessage(value,proto.StudyQuestions.deserializeBinaryFromReader);
        msg.setStudyQuestions(value);
        break;
      case 6:
        var value = new proto.StudyQuestionAnswer;
        reader.readMessage(value,proto.StudyQuestionAnswer.deserializeBinaryFromReader);
        msg.setStudyQuestionAnswer(value);
        break;
      case 7:
        var value = new proto.LogFileEntry;
        reader.readMessage(value,proto.LogFileEntry.deserializeBinaryFromReader);
        msg.setLogFileEntry(value);
        break;
      default:
        reader.skipField();
        break;
      }
    }
    return msg;
  };
  
  
  /**
   * Class method variant: serializes the given message to binary data
   * (in protobuf wire format), writing to the given BinaryWriter.
   * @param {!proto.ScaiiPacket} message
   * @param {!jspb.BinaryWriter} writer
   */
  proto.ScaiiPacket.serializeBinaryToWriter = function(message, writer) {
    message.serializeBinaryToWriter(writer);
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format).
   * @return {!Uint8Array}
   */
  proto.ScaiiPacket.prototype.serializeBinary = function() {
    var writer = new jspb.BinaryWriter();
    this.serializeBinaryToWriter(writer);
    return writer.getResultBuffer();
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format),
   * writing to the given BinaryWriter.
   * @param {!jspb.BinaryWriter} writer
   */
  proto.ScaiiPacket.prototype.serializeBinaryToWriter = function (writer) {
    var f = undefined;
    f = this.getUserCommand();
    if (f != null) {
      writer.writeMessage(
        1,
        f,
        proto.UserCommand.serializeBinaryToWriter
      );
    }
    f = this.getReplaySessionConfig();
    if (f != null) {
      writer.writeMessage(
        2,
        f,
        proto.SC2ReplaySessionConfig.serializeBinaryToWriter
      );
    }
    f = this.getExplDetails();
    if (f != null) {
      writer.writeMessage(
        3,
        f,
        proto.ExplanationDetails.serializeBinaryToWriter
      );
    }
    f = this.getReplayChoiceConfig();
    if (f != null) {
      writer.writeMessage(
        4,
        f,
        proto.ReplayChoiceConfig.serializeBinaryToWriter
      );
    }
    f = this.getStudyQuestions();
    if (f != null) {
      writer.writeMessage(
        5,
        f,
        proto.StudyQuestions.serializeBinaryToWriter
      );
    }
    f = this.getStudyQuestionAnswer();
    if (f != null) {
      writer.writeMessage(
        6,
        f,
        proto.StudyQuestionAnswer.serializeBinaryToWriter
      );
    }
    f = this.getLogFileEntry();
    if (f != null) {
      writer.writeMessage(
        7,
        f,
        proto.LogFileEntry.serializeBinaryToWriter
      );
    }
  };
  
  
  /**
   * Creates a deep clone of this proto. No data is shared with the original.
   * @return {!proto.ScaiiPacket} The clone.
   */
  proto.ScaiiPacket.prototype.cloneMessage = function() {
    return /** @type {!proto.ScaiiPacket} */ (jspb.Message.cloneMessage(this));
  };
  
  
  /**
   * optional UserCommand user_command = 1;
   * @return {proto.UserCommand}
   */
  proto.ScaiiPacket.prototype.getUserCommand = function() {
    return /** @type{proto.UserCommand} */ (
      jspb.Message.getWrapperField(this, proto.UserCommand, 1));
  };
  
  
  /** @param {proto.UserCommand|undefined} value  */
  proto.ScaiiPacket.prototype.setUserCommand = function(value) {
    jspb.Message.setOneofWrapperField(this, 1, proto.ScaiiPacket.oneofGroups_[0], value);
  };
  
  
  proto.ScaiiPacket.prototype.clearUserCommand = function() {
    this.setUserCommand(undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.ScaiiPacket.prototype.hasUserCommand = function() {
    return jspb.Message.getField(this, 1) != null;
  };
  
  
  /**
   * optional SC2ReplaySessionConfig replay_session_config = 2;
   * @return {proto.SC2ReplaySessionConfig}
   */
  proto.ScaiiPacket.prototype.getReplaySessionConfig = function() {
    return /** @type{proto.SC2ReplaySessionConfig} */ (
      jspb.Message.getWrapperField(this, proto.SC2ReplaySessionConfig, 2));
  };
  
  
  /** @param {proto.SC2ReplaySessionConfig|undefined} value  */
  proto.ScaiiPacket.prototype.setReplaySessionConfig = function(value) {
    jspb.Message.setOneofWrapperField(this, 2, proto.ScaiiPacket.oneofGroups_[0], value);
  };
  
  
  proto.ScaiiPacket.prototype.clearReplaySessionConfig = function() {
    this.setReplaySessionConfig(undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.ScaiiPacket.prototype.hasReplaySessionConfig = function() {
    return jspb.Message.getField(this, 2) != null;
  };
  
  
  /**
   * optional ExplanationDetails expl_details = 3;
   * @return {proto.ExplanationDetails}
   */
  proto.ScaiiPacket.prototype.getExplDetails = function() {
    return /** @type{proto.ExplanationDetails} */ (
      jspb.Message.getWrapperField(this, proto.ExplanationDetails, 3));
  };
  
  
  /** @param {proto.ExplanationDetails|undefined} value  */
  proto.ScaiiPacket.prototype.setExplDetails = function(value) {
    jspb.Message.setOneofWrapperField(this, 3, proto.ScaiiPacket.oneofGroups_[0], value);
  };
  
  
  proto.ScaiiPacket.prototype.clearExplDetails = function() {
    this.setExplDetails(undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.ScaiiPacket.prototype.hasExplDetails = function() {
    return jspb.Message.getField(this, 3) != null;
  };
  
  
  /**
   * optional ReplayChoiceConfig replay_choice_config = 4;
   * @return {proto.ReplayChoiceConfig}
   */
  proto.ScaiiPacket.prototype.getReplayChoiceConfig = function() {
    return /** @type{proto.ReplayChoiceConfig} */ (
      jspb.Message.getWrapperField(this, proto.ReplayChoiceConfig, 4));
  };
  
  
  /** @param {proto.ReplayChoiceConfig|undefined} value  */
  proto.ScaiiPacket.prototype.setReplayChoiceConfig = function(value) {
    jspb.Message.setOneofWrapperField(this, 4, proto.ScaiiPacket.oneofGroups_[0], value);
  };
  
  
  proto.ScaiiPacket.prototype.clearReplayChoiceConfig = function() {
    this.setReplayChoiceConfig(undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.ScaiiPacket.prototype.hasReplayChoiceConfig = function() {
    return jspb.Message.getField(this, 4) != null;
  };
  
  
  /**
   * optional StudyQuestions study_questions = 5;
   * @return {proto.StudyQuestions}
   */
  proto.ScaiiPacket.prototype.getStudyQuestions = function() {
    return /** @type{proto.StudyQuestions} */ (
      jspb.Message.getWrapperField(this, proto.StudyQuestions, 5));
  };
  
  
  /** @param {proto.StudyQuestions|undefined} value  */
  proto.ScaiiPacket.prototype.setStudyQuestions = function(value) {
    jspb.Message.setOneofWrapperField(this, 5, proto.ScaiiPacket.oneofGroups_[0], value);
  };
  
  
  proto.ScaiiPacket.prototype.clearStudyQuestions = function() {
    this.setStudyQuestions(undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.ScaiiPacket.prototype.hasStudyQuestions = function() {
    return jspb.Message.getField(this, 5) != null;
  };
  
  
  /**
   * optional StudyQuestionAnswer study_question_answer = 6;
   * @return {proto.StudyQuestionAnswer}
   */
  proto.ScaiiPacket.prototype.getStudyQuestionAnswer = function() {
    return /** @type{proto.StudyQuestionAnswer} */ (
      jspb.Message.getWrapperField(this, proto.StudyQuestionAnswer, 6));
  };
  
  
  /** @param {proto.StudyQuestionAnswer|undefined} value  */
  proto.ScaiiPacket.prototype.setStudyQuestionAnswer = function(value) {
    jspb.Message.setOneofWrapperField(this, 6, proto.ScaiiPacket.oneofGroups_[0], value);
  };
  
  
  proto.ScaiiPacket.prototype.clearStudyQuestionAnswer = function() {
    this.setStudyQuestionAnswer(undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.ScaiiPacket.prototype.hasStudyQuestionAnswer = function() {
    return jspb.Message.getField(this, 6) != null;
  };
  
  
  /**
   * optional LogFileEntry log_file_entry = 7;
   * @return {proto.LogFileEntry}
   */
  proto.ScaiiPacket.prototype.getLogFileEntry = function() {
    return /** @type{proto.LogFileEntry} */ (
      jspb.Message.getWrapperField(this, proto.LogFileEntry, 7));
  };
  
  
  /** @param {proto.LogFileEntry|undefined} value  */
  proto.ScaiiPacket.prototype.setLogFileEntry = function(value) {
    jspb.Message.setOneofWrapperField(this, 7, proto.ScaiiPacket.oneofGroups_[0], value);
  };
  
  
  proto.ScaiiPacket.prototype.clearLogFileEntry = function() {
    this.setLogFileEntry(undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.ScaiiPacket.prototype.hasLogFileEntry = function() {
    return jspb.Message.getField(this, 7) != null;
  };
  
  
  
  /**
   * Generated by JsPbCodeGenerator.
   * @param {Array=} opt_data Optional initial data array, typically from a
   * server response, or constructed directly in Javascript. The array is used
   * in place and becomes part of the constructed object. It is not cloned.
   * If no data is provided, the constructed object will be empty, but still
   * valid.
   * @extends {jspb.Message}
   * @constructor
   */
  proto.UserCommand = function(opt_data) {
    jspb.Message.initialize(this, opt_data, 0, -1, proto.UserCommand.repeatedFields_, null);
  };
  goog.inherits(proto.UserCommand, jspb.Message);
  if (goog.DEBUG && !COMPILED) {
    proto.UserCommand.displayName = 'proto.UserCommand';
  }
  /**
   * List of repeated fields within this message type.
   * @private {!Array<number>}
   * @const
   */
  proto.UserCommand.repeatedFields_ = [2];
  
  
  
  if (jspb.Message.GENERATE_TO_OBJECT) {
  /**
   * Creates an object representation of this proto suitable for use in Soy templates.
   * Field names that are reserved in JavaScript and will be renamed to pb_name.
   * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
   * For the list of reserved names please see:
   *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
   * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
   *     for transitional soy proto support: http://goto/soy-param-migration
   * @return {!Object}
   */
  proto.UserCommand.prototype.toObject = function(opt_includeInstance) {
    return proto.UserCommand.toObject(opt_includeInstance, this);
  };
  
  
  /**
   * Static version of the {@see toObject} method.
   * @param {boolean|undefined} includeInstance Whether to include the JSPB
   *     instance for transitional soy proto support:
   *     http://goto/soy-param-migration
   * @param {!proto.UserCommand} msg The msg instance to transform.
   * @return {!Object}
   */
  proto.UserCommand.toObject = function(includeInstance, msg) {
    var f, obj = {
      commandType: jspb.Message.getField(msg, 1),
      argsList: jspb.Message.getField(msg, 2)
    };
  
    if (includeInstance) {
      obj.$jspbMessageInstance = msg;
    }
    return obj;
  };
  }
  
  
  /**
   * Deserializes binary data (in protobuf wire format).
   * @param {jspb.ByteSource} bytes The bytes to deserialize.
   * @return {!proto.UserCommand}
   */
  proto.UserCommand.deserializeBinary = function(bytes) {
    var reader = new jspb.BinaryReader(bytes);
    var msg = new proto.UserCommand;
    return proto.UserCommand.deserializeBinaryFromReader(msg, reader);
  };
  
  
  /**
   * Deserializes binary data (in protobuf wire format) from the
   * given reader into the given message object.
   * @param {!proto.UserCommand} msg The message object to deserialize into.
   * @param {!jspb.BinaryReader} reader The BinaryReader to use.
   * @return {!proto.UserCommand}
   */
  proto.UserCommand.deserializeBinaryFromReader = function(msg, reader) {
    while (reader.nextField()) {
      if (reader.isEndGroup()) {
        break;
      }
      var field = reader.getFieldNumber();
      switch (field) {
      case 1:
        var value = /** @type {!proto.UserCommand.UserCommandType} */ (reader.readEnum());
        msg.setCommandType(value);
        break;
      case 2:
        var value = /** @type {string} */ (reader.readString());
        msg.getArgsList().push(value);
        msg.setArgsList(msg.getArgsList());
        break;
      default:
        reader.skipField();
        break;
      }
    }
    return msg;
  };
  
  
  /**
   * Class method variant: serializes the given message to binary data
   * (in protobuf wire format), writing to the given BinaryWriter.
   * @param {!proto.UserCommand} message
   * @param {!jspb.BinaryWriter} writer
   */
  proto.UserCommand.serializeBinaryToWriter = function(message, writer) {
    message.serializeBinaryToWriter(writer);
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format).
   * @return {!Uint8Array}
   */
  proto.UserCommand.prototype.serializeBinary = function() {
    var writer = new jspb.BinaryWriter();
    this.serializeBinaryToWriter(writer);
    return writer.getResultBuffer();
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format),
   * writing to the given BinaryWriter.
   * @param {!jspb.BinaryWriter} writer
   */
  proto.UserCommand.prototype.serializeBinaryToWriter = function (writer) {
    var f = undefined;
    f = jspb.Message.getField(this, 1);
    if (f != null) {
      writer.writeEnum(
        1,
        f
      );
    }
    f = this.getArgsList();
    if (f.length > 0) {
      writer.writeRepeatedString(
        2,
        f
      );
    }
  };
  
  
  /**
   * Creates a deep clone of this proto. No data is shared with the original.
   * @return {!proto.UserCommand} The clone.
   */
  proto.UserCommand.prototype.cloneMessage = function() {
    return /** @type {!proto.UserCommand} */ (jspb.Message.cloneMessage(this));
  };
  
  
  /**
   * required UserCommandType command_type = 1;
   * @return {!proto.UserCommand.UserCommandType}
   */
  proto.UserCommand.prototype.getCommandType = function() {
    return /** @type {!proto.UserCommand.UserCommandType} */ (!this.hasCommandType() ? 0 : jspb.Message.getField(this, 1));
  };
  
  
  /** @param {proto.UserCommand.UserCommandType|undefined} value  */
  proto.UserCommand.prototype.setCommandType = function(value) {
    jspb.Message.setField(this, 1, value);
  };
  
  
  proto.UserCommand.prototype.clearCommandType = function() {
    jspb.Message.setField(this, 1, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.UserCommand.prototype.hasCommandType = function() {
    return jspb.Message.getField(this, 1) != null;
  };
  
  
  /**
   * repeated string args = 2;
   * If you change this array by adding, removing or replacing elements, or if you
   * replace the array itself, then you must call the setter to update it.
   * @return {!Array.<string>}
   */
  proto.UserCommand.prototype.getArgsList = function() {
    return /** @type {!Array.<string>} */ (jspb.Message.getField(this, 2));
  };
  
  
  /** @param {Array.<string>} value  */
  proto.UserCommand.prototype.setArgsList = function(value) {
    jspb.Message.setField(this, 2, value || []);
  };
  
  
  proto.UserCommand.prototype.clearArgsList = function() {
    jspb.Message.setField(this, 2, []);
  };
  
  
  /**
   * @enum {number}
   */
  proto.UserCommand.UserCommandType = {
    NONE: 0,
    EXPLAIN: 1,
    POLL_FOR_COMMANDS: 5,
    SET_SPEED: 8,
    SELECT_FILE: 9
  };
  
  
  /**
   * Generated by JsPbCodeGenerator.
   * @param {Array=} opt_data Optional initial data array, typically from a
   * server response, or constructed directly in Javascript. The array is used
   * in place and becomes part of the constructed object. It is not cloned.
   * If no data is provided, the constructed object will be empty, but still
   * valid.
   * @extends {jspb.Message}
   * @constructor
   */
  proto.ReplayChoiceConfig = function(opt_data) {
    jspb.Message.initialize(this, opt_data, 0, -1, proto.ReplayChoiceConfig.repeatedFields_, null);
  };
  goog.inherits(proto.ReplayChoiceConfig, jspb.Message);
  if (goog.DEBUG && !COMPILED) {
    proto.ReplayChoiceConfig.displayName = 'proto.ReplayChoiceConfig';
  }
  /**
   * List of repeated fields within this message type.
   * @private {!Array<number>}
   * @const
   */
  proto.ReplayChoiceConfig.repeatedFields_ = [1];
  
  
  
  if (jspb.Message.GENERATE_TO_OBJECT) {
  /**
   * Creates an object representation of this proto suitable for use in Soy templates.
   * Field names that are reserved in JavaScript and will be renamed to pb_name.
   * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
   * For the list of reserved names please see:
   *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
   * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
   *     for transitional soy proto support: http://goto/soy-param-migration
   * @return {!Object}
   */
  proto.ReplayChoiceConfig.prototype.toObject = function(opt_includeInstance) {
    return proto.ReplayChoiceConfig.toObject(opt_includeInstance, this);
  };
  
  
  /**
   * Static version of the {@see toObject} method.
   * @param {boolean|undefined} includeInstance Whether to include the JSPB
   *     instance for transitional soy proto support:
   *     http://goto/soy-param-migration
   * @param {!proto.ReplayChoiceConfig} msg The msg instance to transform.
   * @return {!Object}
   */
  proto.ReplayChoiceConfig.toObject = function(includeInstance, msg) {
    var f, obj = {
      replayFilenamesList: jspb.Message.getField(msg, 1),
      userStudyMode: jspb.Message.getField(msg, 6)
    };
  
    if (includeInstance) {
      obj.$jspbMessageInstance = msg;
    }
    return obj;
  };
  }
  
  
  /**
   * Deserializes binary data (in protobuf wire format).
   * @param {jspb.ByteSource} bytes The bytes to deserialize.
   * @return {!proto.ReplayChoiceConfig}
   */
  proto.ReplayChoiceConfig.deserializeBinary = function(bytes) {
    var reader = new jspb.BinaryReader(bytes);
    var msg = new proto.ReplayChoiceConfig;
    return proto.ReplayChoiceConfig.deserializeBinaryFromReader(msg, reader);
  };
  
  
  /**
   * Deserializes binary data (in protobuf wire format) from the
   * given reader into the given message object.
   * @param {!proto.ReplayChoiceConfig} msg The message object to deserialize into.
   * @param {!jspb.BinaryReader} reader The BinaryReader to use.
   * @return {!proto.ReplayChoiceConfig}
   */
  proto.ReplayChoiceConfig.deserializeBinaryFromReader = function(msg, reader) {
    while (reader.nextField()) {
      if (reader.isEndGroup()) {
        break;
      }
      var field = reader.getFieldNumber();
      switch (field) {
      case 1:
        var value = /** @type {string} */ (reader.readString());
        msg.getReplayFilenamesList().push(value);
        msg.setReplayFilenamesList(msg.getReplayFilenamesList());
        break;
      case 6:
        var value = /** @type {boolean} */ (reader.readBool());
        msg.setUserStudyMode(value);
        break;
      default:
        reader.skipField();
        break;
      }
    }
    return msg;
  };
  
  
  /**
   * Class method variant: serializes the given message to binary data
   * (in protobuf wire format), writing to the given BinaryWriter.
   * @param {!proto.ReplayChoiceConfig} message
   * @param {!jspb.BinaryWriter} writer
   */
  proto.ReplayChoiceConfig.serializeBinaryToWriter = function(message, writer) {
    message.serializeBinaryToWriter(writer);
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format).
   * @return {!Uint8Array}
   */
  proto.ReplayChoiceConfig.prototype.serializeBinary = function() {
    var writer = new jspb.BinaryWriter();
    this.serializeBinaryToWriter(writer);
    return writer.getResultBuffer();
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format),
   * writing to the given BinaryWriter.
   * @param {!jspb.BinaryWriter} writer
   */
  proto.ReplayChoiceConfig.prototype.serializeBinaryToWriter = function (writer) {
    var f = undefined;
    f = this.getReplayFilenamesList();
    if (f.length > 0) {
      writer.writeRepeatedString(
        1,
        f
      );
    }
    f = jspb.Message.getField(this, 6);
    if (f != null) {
      writer.writeBool(
        6,
        f
      );
    }
  };
  
  
  /**
   * Creates a deep clone of this proto. No data is shared with the original.
   * @return {!proto.ReplayChoiceConfig} The clone.
   */
  proto.ReplayChoiceConfig.prototype.cloneMessage = function() {
    return /** @type {!proto.ReplayChoiceConfig} */ (jspb.Message.cloneMessage(this));
  };
  
  
  /**
   * repeated string replay_filenames = 1;
   * If you change this array by adding, removing or replacing elements, or if you
   * replace the array itself, then you must call the setter to update it.
   * @return {!Array.<string>}
   */
  proto.ReplayChoiceConfig.prototype.getReplayFilenamesList = function() {
    return /** @type {!Array.<string>} */ (jspb.Message.getField(this, 1));
  };
  
  
  /** @param {Array.<string>} value  */
  proto.ReplayChoiceConfig.prototype.setReplayFilenamesList = function(value) {
    jspb.Message.setField(this, 1, value || []);
  };
  
  
  proto.ReplayChoiceConfig.prototype.clearReplayFilenamesList = function() {
    jspb.Message.setField(this, 1, []);
  };
  
  
  /**
   * required bool user_study_mode = 6;
   * Note that Boolean fields may be set to 0/1 when serialized from a Java server.
   * You should avoid comparisons like {@code val === true/false} in those cases.
   * @return {boolean}
   */
  proto.ReplayChoiceConfig.prototype.getUserStudyMode = function() {
    return /** @type {boolean} */ (!this.hasUserStudyMode() ? false : jspb.Message.getField(this, 6));
  };
  
  
  /** @param {boolean|undefined} value  */
  proto.ReplayChoiceConfig.prototype.setUserStudyMode = function(value) {
    jspb.Message.setField(this, 6, value);
  };
  
  
  proto.ReplayChoiceConfig.prototype.clearUserStudyMode = function() {
    jspb.Message.setField(this, 6, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.ReplayChoiceConfig.prototype.hasUserStudyMode = function() {
    return jspb.Message.getField(this, 6) != null;
  };
  
  
  
  /**
   * Generated by JsPbCodeGenerator.
   * @param {Array=} opt_data Optional initial data array, typically from a
   * server response, or constructed directly in Javascript. The array is used
   * in place and becomes part of the constructed object. It is not cloned.
   * If no data is provided, the constructed object will be empty, but still
   * valid.
   * @extends {jspb.Message}
   * @constructor
   */
  proto.SC2ReplaySessionConfig = function(opt_data) {
    jspb.Message.initialize(this, opt_data, 0, -1, proto.SC2ReplaySessionConfig.repeatedFields_, null);
  };
  goog.inherits(proto.SC2ReplaySessionConfig, jspb.Message);
  if (goog.DEBUG && !COMPILED) {
    proto.SC2ReplaySessionConfig.displayName = 'proto.SC2ReplaySessionConfig';
  }
  /**
   * List of repeated fields within this message type.
   * @private {!Array<number>}
   * @const
   */
  proto.SC2ReplaySessionConfig.repeatedFields_ = [2,3];
  
  
  
  if (jspb.Message.GENERATE_TO_OBJECT) {
  /**
   * Creates an object representation of this proto suitable for use in Soy templates.
   * Field names that are reserved in JavaScript and will be renamed to pb_name.
   * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
   * For the list of reserved names please see:
   *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
   * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
   *     for transitional soy proto support: http://goto/soy-param-migration
   * @return {!Object}
   */
  proto.SC2ReplaySessionConfig.prototype.toObject = function(opt_includeInstance) {
    return proto.SC2ReplaySessionConfig.toObject(opt_includeInstance, this);
  };
  
  
  /**
   * Static version of the {@see toObject} method.
   * @param {boolean|undefined} includeInstance Whether to include the JSPB
   *     instance for transitional soy proto support:
   *     http://goto/soy-param-migration
   * @param {!proto.SC2ReplaySessionConfig} msg The msg instance to transform.
   * @return {!Object}
   */
  proto.SC2ReplaySessionConfig.toObject = function(includeInstance, msg) {
    var f, obj = {
      jsonData: jspb.Message.getField(msg, 1),
      explanationsList: jspb.Message.toObjectList(msg.getExplanationsList(),
      proto.ExplanationPoint.toObject, includeInstance),
      rewardTypesList: jspb.Message.getField(msg, 3)
    };
  
    if (includeInstance) {
      obj.$jspbMessageInstance = msg;
    }
    return obj;
  };
  }
  
  
  /**
   * Deserializes binary data (in protobuf wire format).
   * @param {jspb.ByteSource} bytes The bytes to deserialize.
   * @return {!proto.SC2ReplaySessionConfig}
   */
  proto.SC2ReplaySessionConfig.deserializeBinary = function(bytes) {
    var reader = new jspb.BinaryReader(bytes);
    var msg = new proto.SC2ReplaySessionConfig;
    return proto.SC2ReplaySessionConfig.deserializeBinaryFromReader(msg, reader);
  };
  
  
  /**
   * Deserializes binary data (in protobuf wire format) from the
   * given reader into the given message object.
   * @param {!proto.SC2ReplaySessionConfig} msg The message object to deserialize into.
   * @param {!jspb.BinaryReader} reader The BinaryReader to use.
   * @return {!proto.SC2ReplaySessionConfig}
   */
  proto.SC2ReplaySessionConfig.deserializeBinaryFromReader = function(msg, reader) {
    while (reader.nextField()) {
      if (reader.isEndGroup()) {
        break;
      }
      var field = reader.getFieldNumber();
      switch (field) {
      case 1:
        var value = /** @type {string} */ (reader.readString());
        msg.setJsonData(value);
        break;
      case 2:
        var value = new proto.ExplanationPoint;
        reader.readMessage(value,proto.ExplanationPoint.deserializeBinaryFromReader);
        msg.getExplanationsList().push(value);
        msg.setExplanationsList(msg.getExplanationsList());
        break;
      case 3:
        var value = /** @type {string} */ (reader.readString());
        msg.getRewardTypesList().push(value);
        msg.setRewardTypesList(msg.getRewardTypesList());
        break;
      default:
        reader.skipField();
        break;
      }
    }
    return msg;
  };
  
  
  /**
   * Class method variant: serializes the given message to binary data
   * (in protobuf wire format), writing to the given BinaryWriter.
   * @param {!proto.SC2ReplaySessionConfig} message
   * @param {!jspb.BinaryWriter} writer
   */
  proto.SC2ReplaySessionConfig.serializeBinaryToWriter = function(message, writer) {
    message.serializeBinaryToWriter(writer);
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format).
   * @return {!Uint8Array}
   */
  proto.SC2ReplaySessionConfig.prototype.serializeBinary = function() {
    var writer = new jspb.BinaryWriter();
    this.serializeBinaryToWriter(writer);
    return writer.getResultBuffer();
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format),
   * writing to the given BinaryWriter.
   * @param {!jspb.BinaryWriter} writer
   */
  proto.SC2ReplaySessionConfig.prototype.serializeBinaryToWriter = function (writer) {
    var f = undefined;
    f = jspb.Message.getField(this, 1);
    if (f != null) {
      writer.writeString(
        1,
        f
      );
    }
    f = this.getExplanationsList();
    if (f.length > 0) {
      writer.writeRepeatedMessage(
        2,
        f,
        proto.ExplanationPoint.serializeBinaryToWriter
      );
    }
    f = this.getRewardTypesList();
    if (f.length > 0) {
      writer.writeRepeatedString(
        3,
        f
      );
    }
  };
  
  
  /**
   * Creates a deep clone of this proto. No data is shared with the original.
   * @return {!proto.SC2ReplaySessionConfig} The clone.
   */
  proto.SC2ReplaySessionConfig.prototype.cloneMessage = function() {
    return /** @type {!proto.SC2ReplaySessionConfig} */ (jspb.Message.cloneMessage(this));
  };
  
  
  /**
   * required string json_data = 1;
   * @return {string}
   */
  proto.SC2ReplaySessionConfig.prototype.getJsonData = function() {
    return /** @type {string} */ (!this.hasJsonData() ? "" : jspb.Message.getField(this, 1));
  };
  
  
  /** @param {string|undefined} value  */
  proto.SC2ReplaySessionConfig.prototype.setJsonData = function(value) {
    jspb.Message.setField(this, 1, value);
  };
  
  
  proto.SC2ReplaySessionConfig.prototype.clearJsonData = function() {
    jspb.Message.setField(this, 1, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.SC2ReplaySessionConfig.prototype.hasJsonData = function() {
    return jspb.Message.getField(this, 1) != null;
  };
  
  
  /**
   * repeated ExplanationPoint explanations = 2;
   * If you change this array by adding, removing or replacing elements, or if you
   * replace the array itself, then you must call the setter to update it.
   * @return {!Array.<!proto.ExplanationPoint>}
   */
  proto.SC2ReplaySessionConfig.prototype.getExplanationsList = function() {
    return /** @type{!Array.<!proto.ExplanationPoint>} */ (
      jspb.Message.getRepeatedWrapperField(this, proto.ExplanationPoint, 2));
  };
  
  
  /** @param {Array.<!proto.ExplanationPoint>} value  */
  proto.SC2ReplaySessionConfig.prototype.setExplanationsList = function(value) {
    jspb.Message.setRepeatedWrapperField(this, 2, value);
  };
  
  
  proto.SC2ReplaySessionConfig.prototype.clearExplanationsList = function() {
    this.setExplanationsList([]);
  };
  
  
  /**
   * repeated string reward_types = 3;
   * If you change this array by adding, removing or replacing elements, or if you
   * replace the array itself, then you must call the setter to update it.
   * @return {!Array.<string>}
   */
  proto.SC2ReplaySessionConfig.prototype.getRewardTypesList = function() {
    return /** @type {!Array.<string>} */ (jspb.Message.getField(this, 3));
  };
  
  
  /** @param {Array.<string>} value  */
  proto.SC2ReplaySessionConfig.prototype.setRewardTypesList = function(value) {
    jspb.Message.setField(this, 3, value || []);
  };
  
  
  proto.SC2ReplaySessionConfig.prototype.clearRewardTypesList = function() {
    jspb.Message.setField(this, 3, []);
  };
  
  
  
  /**
   * Generated by JsPbCodeGenerator.
   * @param {Array=} opt_data Optional initial data array, typically from a
   * server response, or constructed directly in Javascript. The array is used
   * in place and becomes part of the constructed object. It is not cloned.
   * If no data is provided, the constructed object will be empty, but still
   * valid.
   * @extends {jspb.Message}
   * @constructor
   */
  proto.Record = function(opt_data) {
    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
  };
  goog.inherits(proto.Record, jspb.Message);
  if (goog.DEBUG && !COMPILED) {
    proto.Record.displayName = 'proto.Record';
  }
  
  
  if (jspb.Message.GENERATE_TO_OBJECT) {
  /**
   * Creates an object representation of this proto suitable for use in Soy templates.
   * Field names that are reserved in JavaScript and will be renamed to pb_name.
   * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
   * For the list of reserved names please see:
   *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
   * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
   *     for transitional soy proto support: http://goto/soy-param-migration
   * @return {!Object}
   */
  proto.Record.prototype.toObject = function(opt_includeInstance) {
    return proto.Record.toObject(opt_includeInstance, this);
  };
  
  
  /**
   * Static version of the {@see toObject} method.
   * @param {boolean|undefined} includeInstance Whether to include the JSPB
   *     instance for transitional soy proto support:
   *     http://goto/soy-param-migration
   * @param {!proto.Record} msg The msg instance to transform.
   * @return {!Object}
   */
  proto.Record.toObject = function(includeInstance, msg) {
    var f, obj = {
      keyframeInterval: jspb.Message.getField(msg, 1)
    };
  
    if (includeInstance) {
      obj.$jspbMessageInstance = msg;
    }
    return obj;
  };
  }
  
  
  /**
   * Deserializes binary data (in protobuf wire format).
   * @param {jspb.ByteSource} bytes The bytes to deserialize.
   * @return {!proto.Record}
   */
  proto.Record.deserializeBinary = function(bytes) {
    var reader = new jspb.BinaryReader(bytes);
    var msg = new proto.Record;
    return proto.Record.deserializeBinaryFromReader(msg, reader);
  };
  
  
  /**
   * Deserializes binary data (in protobuf wire format) from the
   * given reader into the given message object.
   * @param {!proto.Record} msg The message object to deserialize into.
   * @param {!jspb.BinaryReader} reader The BinaryReader to use.
   * @return {!proto.Record}
   */
  proto.Record.deserializeBinaryFromReader = function(msg, reader) {
    while (reader.nextField()) {
      if (reader.isEndGroup()) {
        break;
      }
      var field = reader.getFieldNumber();
      switch (field) {
      case 1:
        var value = /** @type {number} */ (reader.readUint32());
        msg.setKeyframeInterval(value);
        break;
      default:
        reader.skipField();
        break;
      }
    }
    return msg;
  };
  
  
  /**
   * Class method variant: serializes the given message to binary data
   * (in protobuf wire format), writing to the given BinaryWriter.
   * @param {!proto.Record} message
   * @param {!jspb.BinaryWriter} writer
   */
  proto.Record.serializeBinaryToWriter = function(message, writer) {
    message.serializeBinaryToWriter(writer);
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format).
   * @return {!Uint8Array}
   */
  proto.Record.prototype.serializeBinary = function() {
    var writer = new jspb.BinaryWriter();
    this.serializeBinaryToWriter(writer);
    return writer.getResultBuffer();
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format),
   * writing to the given BinaryWriter.
   * @param {!jspb.BinaryWriter} writer
   */
  proto.Record.prototype.serializeBinaryToWriter = function (writer) {
    var f = undefined;
    f = jspb.Message.getField(this, 1);
    if (f != null) {
      writer.writeUint32(
        1,
        f
      );
    }
  };
  
  
  /**
   * Creates a deep clone of this proto. No data is shared with the original.
   * @return {!proto.Record} The clone.
   */
  proto.Record.prototype.cloneMessage = function() {
    return /** @type {!proto.Record} */ (jspb.Message.cloneMessage(this));
  };
  
  
  /**
   * required uint32 keyframe_interval = 1;
   * @return {number}
   */
  proto.Record.prototype.getKeyframeInterval = function() {
    return /** @type {number} */ (!this.hasKeyframeInterval() ? 0 : jspb.Message.getField(this, 1));
  };
  
  
  /** @param {number|undefined} value  */
  proto.Record.prototype.setKeyframeInterval = function(value) {
    jspb.Message.setField(this, 1, value);
  };
  
  
  proto.Record.prototype.clearKeyframeInterval = function() {
    jspb.Message.setField(this, 1, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.Record.prototype.hasKeyframeInterval = function() {
    return jspb.Message.getField(this, 1) != null;
  };
  
  
  
  /**
   * Generated by JsPbCodeGenerator.
   * @param {Array=} opt_data Optional initial data array, typically from a
   * server response, or constructed directly in Javascript. The array is used
   * in place and becomes part of the constructed object. It is not cloned.
   * If no data is provided, the constructed object will be empty, but still
   * valid.
   * @extends {jspb.Message}
   * @constructor
   */
  proto.ExplanationDetails = function(opt_data) {
    jspb.Message.initialize(this, opt_data, 0, -1, null, null);
  };
  goog.inherits(proto.ExplanationDetails, jspb.Message);
  if (goog.DEBUG && !COMPILED) {
    proto.ExplanationDetails.displayName = 'proto.ExplanationDetails';
  }
  
  
  if (jspb.Message.GENERATE_TO_OBJECT) {
  /**
   * Creates an object representation of this proto suitable for use in Soy templates.
   * Field names that are reserved in JavaScript and will be renamed to pb_name.
   * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
   * For the list of reserved names please see:
   *     com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.
   * @param {boolean=} opt_includeInstance Whether to include the JSPB instance
   *     for transitional soy proto support: http://goto/soy-param-migration
   * @return {!Object}
   */
  proto.ExplanationDetails.prototype.toObject = function(opt_includeInstance) {
    return proto.ExplanationDetails.toObject(opt_includeInstance, this);
  };
  
  
  /**
   * Static version of the {@see toObject} method.
   * @param {boolean|undefined} includeInstance Whether to include the JSPB
   *     instance for transitional soy proto support:
   *     http://goto/soy-param-migration
   * @param {!proto.ExplanationDetails} msg The msg instance to transform.
   * @return {!Object}
   */
  proto.ExplanationDetails.toObject = function(includeInstance, msg) {
    var f, obj = {
      step: jspb.Message.getField(msg, 1),
      explPoint: (f = msg.getExplPoint()) && proto.ExplanationPoint.toObject(includeInstance, f)
    };
  
    if (includeInstance) {
      obj.$jspbMessageInstance = msg;
    }
    return obj;
  };
  }
  
  
  /**
   * Deserializes binary data (in protobuf wire format).
   * @param {jspb.ByteSource} bytes The bytes to deserialize.
   * @return {!proto.ExplanationDetails}
   */
  proto.ExplanationDetails.deserializeBinary = function(bytes) {
    var reader = new jspb.BinaryReader(bytes);
    var msg = new proto.ExplanationDetails;
    return proto.ExplanationDetails.deserializeBinaryFromReader(msg, reader);
  };
  
  
  /**
   * Deserializes binary data (in protobuf wire format) from the
   * given reader into the given message object.
   * @param {!proto.ExplanationDetails} msg The message object to deserialize into.
   * @param {!jspb.BinaryReader} reader The BinaryReader to use.
   * @return {!proto.ExplanationDetails}
   */
  proto.ExplanationDetails.deserializeBinaryFromReader = function(msg, reader) {
    while (reader.nextField()) {
      if (reader.isEndGroup()) {
        break;
      }
      var field = reader.getFieldNumber();
      switch (field) {
      case 1:
        var value = /** @type {number} */ (reader.readUint32());
        msg.setStep(value);
        break;
      case 2:
        var value = new proto.ExplanationPoint;
        reader.readMessage(value,proto.ExplanationPoint.deserializeBinaryFromReader);
        msg.setExplPoint(value);
        break;
      default:
        reader.skipField();
        break;
      }
    }
    return msg;
  };
  
  
  /**
   * Class method variant: serializes the given message to binary data
   * (in protobuf wire format), writing to the given BinaryWriter.
   * @param {!proto.ExplanationDetails} message
   * @param {!jspb.BinaryWriter} writer
   */
  proto.ExplanationDetails.serializeBinaryToWriter = function(message, writer) {
    message.serializeBinaryToWriter(writer);
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format).
   * @return {!Uint8Array}
   */
  proto.ExplanationDetails.prototype.serializeBinary = function() {
    var writer = new jspb.BinaryWriter();
    this.serializeBinaryToWriter(writer);
    return writer.getResultBuffer();
  };
  
  
  /**
   * Serializes the message to binary data (in protobuf wire format),
   * writing to the given BinaryWriter.
   * @param {!jspb.BinaryWriter} writer
   */
  proto.ExplanationDetails.prototype.serializeBinaryToWriter = function (writer) {
    var f = undefined;
    f = jspb.Message.getField(this, 1);
    if (f != null) {
      writer.writeUint32(
        1,
        f
      );
    }
    f = this.getExplPoint();
    if (f != null) {
      writer.writeMessage(
        2,
        f,
        proto.ExplanationPoint.serializeBinaryToWriter
      );
    }
  };
  
  
  /**
   * Creates a deep clone of this proto. No data is shared with the original.
   * @return {!proto.ExplanationDetails} The clone.
   */
  proto.ExplanationDetails.prototype.cloneMessage = function() {
    return /** @type {!proto.ExplanationDetails} */ (jspb.Message.cloneMessage(this));
  };
  
  
  /**
   * optional uint32 step = 1;
   * @return {number}
   */
  proto.ExplanationDetails.prototype.getStep = function() {
    return /** @type {number} */ (!this.hasStep() ? 0 : jspb.Message.getField(this, 1));
  };
  
  
  /** @param {number?|undefined} value  */
  proto.ExplanationDetails.prototype.setStep = function(value) {
    jspb.Message.setField(this, 1, value);
  };
  
  
  proto.ExplanationDetails.prototype.clearStep = function() {
    jspb.Message.setField(this, 1, undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.ExplanationDetails.prototype.hasStep = function() {
    return jspb.Message.getField(this, 1) != null;
  };
  
  
  /**
   * optional ExplanationPoint expl_point = 2;
   * @return {proto.ExplanationPoint}
   */
  proto.ExplanationDetails.prototype.getExplPoint = function() {
    return /** @type{proto.ExplanationPoint} */ (
      jspb.Message.getWrapperField(this, proto.ExplanationPoint, 2));
  };
  
  
  /** @param {proto.ExplanationPoint|undefined} value  */
  proto.ExplanationDetails.prototype.setExplPoint = function(value) {
    jspb.Message.setWrapperField(this, 2, value);
  };
  
  
  proto.ExplanationDetails.prototype.clearExplPoint = function() {
    this.setExplPoint(undefined);
  };
  
  
  /**
   * Returns whether this field is set.
   * @return{!boolean}
   */
  proto.ExplanationDetails.prototype.hasExplPoint = function() {
    return jspb.Message.getField(this, 2) != null;
  };
  
  
  