addNumberInput_(name, valueName, canBeDecimal = false, canBeZero = true,
      canBeUnset = false, tooltipMessage) {
    const onChange = (input) => {
      if (input.value == 'Infinity') {
        shakaDemoMain.configure(valueName, Infinity);
      } else if (input.value == '' && canBeUnset) {
        shakaDemoMain.resetConfiguration(valueName);
      } else {
        const valueAsNumber = Number(input.value);
        if (valueAsNumber == 0 && !canBeZero) {
          shakaDemoMain.resetConfiguration(valueName);
        } else if (isNaN(valueAsNumber)) {
          shakaDemoMain.resetConfiguration(valueName);
        } else {
          if (Math.floor(valueAsNumber) != valueAsNumber && !canBeDecimal) {
            shakaDemoMain.resetConfiguration(valueName);
          } else {
            shakaDemoMain.configure(valueName, valueAsNumber);
          }
        }
      }
      shakaDemoMain.remakeHash();
    };
    this.createRow_(name, tooltipMessage);
    this.latestInput_ = new shakaDemo.NumberInput(
        this.getLatestSection_(), name, onChange, canBeDecimal, canBeZero,
        canBeUnset);
    this.latestInput_.input().value =
        shakaDemoMain.getCurrentConfigValue(valueName);
    if (isNaN(Number(this.latestInput_.input().value)) && canBeUnset) {
      this.latestInput_.input().value = '';
    }
    return this;
  }
@param {string} name
@param {string} valueName
@param {boolean=} canBeDecimal
@param {boolean=} canBeZero
@param {boolean=} canBeUnset
@param {string=} tooltipMessage
@return {!shakaDemo.Config}
@private