{"version":3,"file":"index.mjs","sources":["../src/index.js"],"sourcesContent":["'use strict';\n\n/**\n * Time utilities\n * https://github.com/yr/time\n * @copyright Yr\n * @license MIT\n */\nconst MISSING_LOCALE_STRING = '[missing locale]';\nconst DEFAULT_DATE = 'Invalid Date';\nconst DEFAULT_DAY_STARTS_AT = 0;\nconst DEFAULT_NIGHT_STARTS_AT = 18;\nconst DEFAULT_OFFSET = '+00:00';\nconst FLAGS = {\n  Y: 1,\n  M: 2,\n  D: 4,\n  H: 8,\n  m: 16,\n  s: 32,\n  S: 64\n};\nconst FLAGS_START_OF = {\n  Y: FLAGS.S | FLAGS.s | FLAGS.m | FLAGS.H | FLAGS.D | FLAGS.M,\n  M: FLAGS.S | FLAGS.s | FLAGS.m | FLAGS.H | FLAGS.D,\n  D: FLAGS.S | FLAGS.s | FLAGS.m | FLAGS.H,\n  H: FLAGS.S | FLAGS.s | FLAGS.m,\n  m: FLAGS.S | FLAGS.s,\n  s: FLAGS.S\n};\n// YYYY-MM-DDTHH:mm:ss or YYYY-MM-DDTHH:mm:ss.SSSZ or YYYY-MM-DDTHH:mm:ss+00:00\nconst RE_PARSE = /^(\\d{2,4})-?(\\d{1,2})?-?(\\d{1,2})?T?(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?\\.?(\\d{3})?(?:Z|(([+-])(\\d{2}):?(\\d{2})))?$/;\nconst RE_TOKEN = /(LTS?|L{1,4}|Y{4}|Y{2}|M{1,4}|D{1,2}|d{3}r|d{2}r|d{1,4}|H{1,2}r?|m{1,2}|s{1,2}|S{1,3}|ZZ)/g;\nconst RE_TOKEN_ESCAPE = /(\\[[^\\]]+\\])/g;\nconst RE_TOKEN_ESCAPED = /(\\$\\d\\d?)/g;\nlet dayStartsAt = DEFAULT_DAY_STARTS_AT;\nlet nightStartsAt = DEFAULT_NIGHT_STARTS_AT;\n\nexport default {\n  isTime,\n\n  /**\n   * Initialize with defaults\n   * @param {Object} [options]\n   *  - {Number} dayStartsAt\n   *  - {Number} nightStartsAt\n   *  - {Array} parseKeys\n   */\n  init (options = {}) {\n    dayStartsAt = options.dayStartsAt || DEFAULT_DAY_STARTS_AT;\n    nightStartsAt = options.nightStartsAt || DEFAULT_NIGHT_STARTS_AT;\n  },\n\n  /**\n   * Instance factory\n   * @param {String|Time} [timeString]\n   * @returns {Time}\n   */\n  create (timeString) {\n    // Return if passed Time instance\n    if (timeString && typeof timeString != 'string' && isTime(timeString)) return timeString;\n    return new Time(timeString);\n  },\n\n  /**\n   * Retrieve instance at current client time\n   * @returns {Time}\n   */\n  now () {\n    return this.create().utc();\n  }\n};\n\nclass Time {\n  /**\n   * Constructor\n   * @param {String} [timeString]\n   */\n  constructor (timeString) {\n    // Return if timeString not a string\n    if (timeString && 'string' != typeof timeString) return timeString;\n\n    this._date = DEFAULT_DATE;\n    this._locale = null;\n    this._offset = 0;\n    this._offsetString = DEFAULT_OFFSET;\n    this.isValid = false;\n    this.timeString = DEFAULT_DATE;\n\n    // Local \"now\"\n    if (timeString == null) timeString = clientNow();\n    // Prevent regex denial of service\n    if (timeString.length > 30) return;\n\n    const match = timeString.match(RE_PARSE);\n\n    if (!match) return;\n\n    // We check for match[i] == null because of a bug in Samsung Internet browser causing the RegEx matching to fail after many iterations\n    // Link to GitHub issue: https://github.com/SamsungInternet/support/issues/82\n    const year = parseInt(match[1], 10);\n    const month = match[2] == null ? 1 : parseInt(match[2], 10);\n    const day = match[3] == null ? 1 : parseInt(match[3], 10);\n    const hour = match[4] == null ? 0 : parseInt(match[4], 10);\n    const minute = match[5] == null ? 0 : parseInt(match[5], 10);\n    const second = match[6] == null ? 0 : parseInt(match[6], 10);\n    const millisecond = match[7] == null ? 0 : parseInt(match[7], 10);\n    const offset = match[8] == null ? '' : match[8];\n\n    // Handle TZ offset\n    if (offset && offset != DEFAULT_OFFSET) {\n      const dir = (match[9] == '+') ? 1 : -1;\n\n      this._offset = dir * ((+match[10] * 60) + +match[11]);\n      this._offsetString = offset;\n    }\n\n    // Create UTC date based on local time so we can always use UTC methods\n    this._date = new Date(Date.UTC(year, month - 1, day, hour, minute, second, millisecond));\n    this.isValid = isValid(this._date);\n    this.timeString = this.toString();\n  }\n\n  /**\n   * Modify Offset with new 'value' in minutes\n   * @param {Number} value\n   * @returns {Time}\n   */\n  offset (value) {\n    if (value == this._offset) return this;\n\n    let instance = this.utc()._manipulate(value, 'minutes');\n\n    instance._offset = value;\n    instance._offsetString = minutesToOffsetString(value);\n    update(instance);\n    return instance;\n  }\n\n  /**\n   * Add 'value' of 'unit' (years|months|days|hours|minutes|seconds|milliseconds)\n   * Returns new instance\n   * @param {Number} value\n   * @param {String} unit\n   * @returns {Time}\n   */\n  add (value, unit) {\n    return this._manipulate(value, unit);\n  }\n\n  /**\n   * Subtract 'value' of 'unit' (years|months|days|hours|minutes|seconds|milliseconds)\n   * Returns new instance\n   * @param {Number} value\n   * @param {String} unit\n   * @returns {Time}\n   */\n  subtract (value, unit) {\n    return this._manipulate(value * -1, unit);\n  }\n\n  /**\n   * Compute difference between 'time' of 'unit'\n   * (from Moment.js)\n   * @param {Time} time\n   * @param {String} unit\n   * @param {Boolean} [asFloat]\n   * @returns {Number}\n   */\n  diff (time, unit, asFloat) {\n    if (!this.isValid) return NaN;\n    if (!time.isValid) return NaN;\n\n    unit = normalizeUnit(unit);\n\n    let diff = 0;\n    let t1 = this;\n    let t2 = time;\n\n    if (unit == 'Y' || unit == 'M') {\n      diff = t1._monthDiff(t2);\n      if (unit == 'Y') diff /= 12;\n    } else {\n      // Correct for custom day start\n      if (unit == 'D' && !asFloat) {\n        t1 = t1.startOf('D');\n        t2 = t2.startOf('D');\n      }\n      const delta = t1 - t2;\n\n      switch (unit) {\n        case 'D':\n          const offsetDelta = 6e4 * (t1._offset - t2._offset);\n\n          diff = (delta + offsetDelta) / 864e5;\n          break;\n        case 'H':\n          diff = delta / 36e5;\n          break;\n        case 'm':\n          diff = delta / 6e4;\n          break;\n        case 's':\n          diff = delta / 1e3;\n          break;\n        default:\n          diff = delta;\n      }\n    }\n\n    return asFloat ? diff : round(diff);\n  }\n\n  /**\n   * Reset to start of 'unit'\n   * Returns new instance\n   * @param {String} unit\n   * @returns {Time}\n   */\n  startOf (unit) {\n    if (this.isValid) {\n      unit = normalizeUnit(unit);\n\n      const flags = FLAGS_START_OF[unit];\n      let instance = this.clone();\n      let d = instance._date;\n\n      for (const dim in FLAGS) {\n        if (flags & FLAGS[dim]) {\n          switch (dim) {\n            case 'M':\n              d.setUTCMonth(0);\n              break;\n            case 'D':\n              d.setUTCDate(1);\n              break;\n            case 'H':\n              // Adjust day if less than day start hour\n              if (unit == 'D' && dayStartsAt > d.getUTCHours()) d.setUTCDate(d.getUTCDate() - 1);\n              d.setUTCHours(dayStartsAt);\n              break;\n            case 'm':\n              d.setUTCMinutes(0);\n              break;\n            case 's':\n              d.setUTCSeconds(0);\n              break;\n            case 'S':\n              d.setUTCMilliseconds(0);\n              break;\n          }\n        }\n      }\n\n      return update(instance);\n    }\n\n    return this;\n  }\n\n  /**\n   * Reset to end of 'unit'\n   * Returns new instance\n   * @param {String} unit\n   * @returns {Time}\n   */\n  endOf (unit) {\n    unit = normalizeUnit(unit === undefined ? 'S' : unit);\n    if (unit === 'S') return this.clone();\n    return this.startOf(unit).add(1, unit).subtract(1, 'S');\n  }\n\n  /**\n   * Get/set full year\n   * Returns new instance when setting\n   * @param {Number} [value]\n   * @returns {Number|Time}\n   */\n  year (value) {\n    if (value != null) return this._set(value, 'setUTCFullYear');\n    return this._date.getUTCFullYear();\n  }\n\n  /**\n   * Get/set month (0-11)\n   * Returns new instance when setting\n   * @param {Number} [value]\n   * @returns {Number|Time}\n   */\n  month (value) {\n    if (value != null) return this._set(value, 'setUTCMonth');\n    return this._date.getUTCMonth();\n  }\n\n  /**\n   * Get/set date (1-31)\n   * Returns new instance when setting\n   * @param {Number} [value]\n   * @returns {Number|Time}\n   */\n  date (value) {\n    if (value != null) return this._set(value, 'setUTCDate');\n    return this._date.getUTCDate();\n  }\n\n  /**\n   * Retrieve day of week (0-6)\n   * Returns new instance when setting\n   * @param {Number} [value]\n   * @returns {Number|Time}\n   */\n  day (value) {\n    const day = this._date.getUTCDay();\n\n    if (value != null) return this._set(this.date() + value - day, 'setUTCDate');\n    return day;\n  }\n\n  /**\n   * Get/set hour (0-23)\n   * Returns new instance when setting\n   * @param {Number} [value]\n   * @returns {Number|Time}\n   */\n  hour (value) {\n    if (value != null) return this._set(value, 'setUTCHours');\n    return this._date.getUTCHours();\n  }\n\n  /**\n   * Get/set minute (0-59)\n   * Returns new instance when setting\n   * @param {Number} [value]\n   * @returns {Number|Time}\n   */\n  minute (value) {\n    if (value != null) return this._set(value, 'setUTCMinutes');\n    return this._date.getUTCMinutes();\n  }\n\n  /**\n   * Get/set second (0-59)\n   * Returns new instance when setting\n   * @param {Number} [value]\n   * @returns {Number|Time}\n   */\n  second (value) {\n    if (value != null) return this._set(value, 'setUTCSeconds');\n    return this._date.getUTCSeconds();\n  }\n\n  /**\n   * Get/set millisecond (0-999)\n   * Returns new instance when setting\n   * @param {Number} [value]\n   * @returns {Number|Time}\n   */\n  millisecond (value) {\n    if (value != null) return this._set(value, 'setUTCMilliseconds');\n    return this._date.getUTCMilliseconds();\n  }\n\n  /**\n   * Compare 'time', limited by 'unit', and determine if is similar\n   * @param {Time} time\n   * @param {String} [unit]\n   * @returns {Boolean}\n   */\n  isSame (time, unit) {\n    if (!this.isValid || !time.isValid) return false;\n\n    unit = normalizeUnit(unit);\n\n    if (!unit || unit == 'S') return +this._date === +time._date;\n\n    let t1 = this;\n    let t2 = time;\n\n    // Correct for custom day start\n    if (unit == 'D') {\n      t1 = t1.startOf(unit);\n      t2 = t2.startOf(unit);\n    }\n\n    switch (unit) {\n      case 'Y':\n        return t1.year() == t2.year();\n      case 'M':\n        return t1.year() == t2.year()\n          && t1.month() == t2.month();\n      case 'D':\n        return t1.year() == t2.year()\n          && t1.month() == t2.month()\n          && t1.date() == t2.date();\n      case 'H':\n        return t1.year() == t2.year()\n          && t1.month() == t2.month()\n          && t1.date() == t2.date()\n          && t1.hour() == t2.hour();\n      case 'm':\n        return t1.year() == t2.year()\n          && t1.month() == t2.month()\n          && t1.date() == t2.date()\n          && t1.hour() == t2.hour()\n          && t1.minute() == t2.minute();\n      case 's':\n        return t1.year() == t2.year()\n          && t1.month() == t2.month()\n          && t1.date() == t2.date()\n          && t1.hour() == t2.hour()\n          && t1.minute() == t2.minute()\n          && t1.second() == t2.second();\n    }\n  }\n\n  /**\n   * Compare this, limited by 'unit', and determine if this is before 'time'\n   * @param {Time} time\n   * @param {String} [unit]\n   * @returns {Boolean}\n   */\n  isBefore (time, unit) {\n    if (!this.isValid || !time.isValid) {\n      return false;\n    }\n\n    unit = normalizeUnit(unit);\n    const thisLimited = unit == 'S' ? this : this.endOf(unit);\n\n    return thisLimited.valueOf() < time.valueOf();\n  }\n\n  /**\n   * Compare this, limited by 'unit', and determine if this is after 'time'\n   * @param {Time} time\n   * @param {String} [unit]\n   * @returns {Boolean}\n   */\n  isAfter (time, unit) {\n    if (!this.isValid || !time.isValid) {\n      return false;\n    }\n\n    unit = normalizeUnit(unit);\n    const timeLimited = unit == 'S' ? time : time.endOf(unit);\n\n    return this.valueOf() > timeLimited.valueOf();\n  }\n\n  /**\n   * Set 'locale'\n   * @param {Object} locale\n   * @returns {Time}\n   */\n  locale (locale) {\n    let instance = this.clone();\n\n    instance._locale = locale;\n    return instance;\n  }\n\n  /**\n   * Format into string based on 'mask'\n   * @param {String} mask\n   * @param {Number} [daysFromNow]\n   * @returns {String}\n   */\n  format (mask, daysFromNow) {\n    if (!mask) return this.timeString;\n    // Prevent regex denial of service\n    if (mask.length > 100) return '';\n\n    const relativeDay = (daysFromNow != null)\n      ? this._getRelativeDay(daysFromNow)\n      : '';\n    let escaped = [];\n    let idx = 0;\n\n    // Remove all escaped text (in [xxx])\n    mask = mask.replace(RE_TOKEN_ESCAPE, (match) => {\n      escaped.push(match.slice(1, -1));\n      return '$' + idx++;\n    });\n\n    mask = mask.replace(RE_TOKEN, (match) => {\n\n      switch (match) {\n        case 'LT':\n        case 'LTS':\n        case 'L':\n        case 'LL':\n        case 'LLL':\n        case 'LLLL':\n          return this._locale && this._locale.format && this._locale.format[match] ? this.format(this._locale.format[match], daysFromNow) : MISSING_LOCALE_STRING;\n        case 'YY':\n          return String(this.year()).slice(-2);\n        case 'YYYY':\n          return this.year();\n        case 'M':\n          return this.month() + 1;\n        case 'MM':\n          return pad(this.month() + 1);\n        case 'MMM':\n          return this._localeHasProperty('monthsShort') ? this._locale.monthsShort[this.month()] : MISSING_LOCALE_STRING;\n        case 'MMMM':\n          return this._localeHasProperty('months') ? this._locale.months[this.month()] : MISSING_LOCALE_STRING;\n        case 'D':\n          return this.date();\n        case 'DD':\n          return pad(this.date());\n        case 'ddr':\n          if (relativeDay) return this._localeHasProperty(relativeDay) ? this._locale[relativeDay] : MISSING_LOCALE_STRING;\n          return this._localeHasProperty('daysShort') ? this._locale.daysShort[this.day()] : MISSING_LOCALE_STRING;\n        case 'dddr':\n          if (relativeDay) return this._localeHasProperty(relativeDay) ? this._locale[relativeDay] : MISSING_LOCALE_STRING;\n          return this._localeHasProperty('days') ? this._locale.days[this.day()] : MISSING_LOCALE_STRING;\n        case 'd':\n          return this.day();\n        case 'ddd':\n          return  this._localeHasProperty('daysShort') ? this._locale.daysShort[this.day()] : MISSING_LOCALE_STRING;\n        case 'dddd':\n          return this._localeHasProperty('days')? this._locale.days[this.day()] : MISSING_LOCALE_STRING;\n        case 'Hr':\n          let daySlot = this._getTimeOfDay();\n          return this._localeHasProperty('daySlots') ? this._locale.daySlots[daySlot] : MISSING_LOCALE_STRING;\n        case 'H':\n          return this.hour();\n        case 'HH':\n          return pad(this.hour());\n        case 'm':\n          return this.minute();\n        case 'mm':\n          return pad(this.minute());\n        case 's':\n          return this.second();\n        case 'ss':\n          return pad(this.second());\n        case 'S':\n          return Math.floor(this.millisecond() / 100);\n        case 'SS':\n          return Math.floor(this.millisecond() / 10);\n        case 'SSS':\n          return this.millisecond();\n        case 'ZZ':\n          return this._offsetString;\n        default:\n          return '';\n      }\n    });\n\n    // Replace all escaped text\n    if (escaped.length) {\n      mask = mask.replace(RE_TOKEN_ESCAPED, (match) => {\n        return escaped[match.slice(1)];\n      });\n    }\n\n    return mask;\n  }\n\n  /**\n   * Retrieve instance of current time\n   * @returns {Time}\n   */\n  now () {\n    let instance = (new Time()).offset(this._offset);\n\n    instance._locale = this._locale;\n    return instance;\n  }\n\n  /**\n   * Retrieve instance at UTC time\n   * @returns {Time}\n   */\n  utc () {\n    if (!this._offset) return this.clone();\n\n    let t = this.subtract(this._offset, 'minutes');\n\n    t._offset = 0;\n    t._offsetString = DEFAULT_OFFSET;\n    return update(t);\n  }\n\n  /**\n   * Clone instance\n   * @returns {Time}\n   */\n  clone () {\n    let instance = new Time(this.timeString);\n\n    instance._locale = this._locale;\n    return instance;\n  }\n\n  /**\n   * Set 'value' using 'method'\n   * Returns new instance\n   * @param {Number} value\n   * @param {String} method\n   * @returns {Time}\n   */\n  _set (value, method) {\n    let instance = this.clone();\n    let d = instance._date;\n\n    d[method](value);\n    return update(instance);\n  }\n\n  /**\n   * Retrieve relative day type based on number of days from \"now\"\n   * @param {Number} daysFromNow\n   * @returns {String}\n   */\n  _getRelativeDay (daysFromNow) {\n    if (daysFromNow != null && daysFromNow < 2) {\n      const hour = this.hour();\n\n      return (daysFromNow == 1)\n        ? 'tomorrow'\n        : (hour >= nightStartsAt || hour < dayStartsAt)\n          ? 'tonight'\n          : 'today';\n    }\n    return '';\n  }\n\n  /**\n   * Retrieve the time of the day (night, morning, afternoon, evening)\n   *\n   * @return {string} The time of the day (night, morning, afternoon, evening)\n   * @private\n   */\n  _getTimeOfDay() {\n    const hour = this.hour();\n    if (hour >= 0 && hour < 6) {\n      return 'night';\n    } else if (hour >= 6 && hour < 12) {\n      return 'morning';\n    } else if (hour >= 12 && hour < 18) {\n      return 'afternoon';\n    } else {\n      return 'evening'; // 18 - 24\n    }\n  }\n\n  /**\n   * A helper function that checks if locale is initialized and if the passed localeProperty exist on locale\n   *\n   * Optionally also checks if localeProperty has subProperty\n   *\n   * @param localeProperty {String} Property to check if exist on locale\n   * @param [subProperty] {String} Optional subproperty if locale[localeProperty] is an object\n   * @return {boolean} True if locale has the passed localeProperty\n   * @private\n   */\n  _localeHasProperty(localeProperty, subProperty) {\n    if (subProperty) {\n      return this._locale && this._locale[localeProperty] && this._locale[localeProperty][subProperty];\n    } else {\n      return this._locale && this._locale[localeProperty];\n    }\n\n  }\n\n  /**\n   * Add/subtract 'value' in 'unit'\n   * Returns new instance\n   * @param {Number} value\n   * @param {String} unit\n   * @returns {Time}\n   */\n  _manipulate (value, unit) {\n    if (this.isValid) {\n      let instance = this.clone();\n      let d = instance._date;\n\n      switch (normalizeUnit(unit)) {\n        case 'Y':\n          d.setUTCFullYear(d.getUTCFullYear() + value);\n          break;\n        case 'M':\n          d.setUTCMonth(d.getUTCMonth() + value);\n          break;\n        case 'D':\n        case 'd':\n          d.setUTCDate(d.getUTCDate() + value);\n          break;\n        case 'H':\n          d.setUTCHours(d.getUTCHours() + value);\n          break;\n        case 'm':\n          d.setUTCMinutes(d.getUTCMinutes() + value);\n          break;\n        case 's':\n          d.setUTCSeconds(d.getUTCSeconds() + value);\n          break;\n        case 'S':\n          d.setUTCMilliseconds(d.getUTCMilliseconds() + value);\n          break;\n      }\n\n      return update(instance);\n    }\n\n    return this;\n  }\n\n  /**\n   * Compute difference between 'time' in months\n   * (from Moment.js)\n   * @param {Time} time\n   * @returns {Number}\n   */\n  _monthDiff (time) {\n    const wholeMonthDiff = ((time._date.getUTCFullYear() - this._date.getUTCFullYear()) * 12) + (time._date.getUTCMonth() - this._date.getUTCMonth());\n    const anchor = this._manipulate(wholeMonthDiff, 'M');\n    let adjust;\n\n    if (time._date - anchor._date < 0) {\n      const anchor2 = this._manipulate(wholeMonthDiff - 1, 'M');\n\n      adjust = (time._date - anchor._date) / (anchor._date - anchor2._date);\n    } else {\n      const anchor2 = this._manipulate(wholeMonthDiff + 1, 'M');\n\n      adjust = (time._date - anchor._date) / (anchor2._date - anchor._date);\n    }\n\n    return -(wholeMonthDiff + adjust);\n  }\n\n  /**\n   * Retrieve stringified\n   * @returns {String}\n   */\n  toString () {\n    if (!this.isValid) return 'Invalid Date';\n    return this._date.toISOString().replace('Z', this._offsetString);\n  }\n\n  /**\n   * Convert to JSON format\n   * @returns {String}\n   */\n  toJSON () {\n    return this.timeString;\n  }\n\n  /**\n   * Retrieve number of milliseconds UTC\n   * @returns {Number}\n   */\n  valueOf () {\n    if (!this.isValid) return NaN;\n    return +this._date - ((this._offset || 0) * 6e4);\n  }\n}\n\n/**\n * Retrieve timestring for client \"now\"\n * @returns {String}\n */\nfunction clientNow () {\n  const d = new Date();\n  const offset = -1 * d.getTimezoneOffset();\n\n  d.setUTCMinutes(d.getUTCMinutes() + offset);\n  return d.toISOString().replace('Z', minutesToOffsetString(offset));\n}\n\n/**\n * Update 'instance' state\n * @param {Time} instance\n * @returns {Time}\n */\nfunction update (instance) {\n  instance.isValid = isValid(instance._date);\n  instance.timeString = instance.toString();\n  return instance;\n}\n\n/**\n * Normalize 'unit'\n * @param {String} unit\n * @returns {String}\n */\nfunction normalizeUnit (unit) {\n  switch (unit) {\n    case 'year':\n    case 'years':\n    case 'Y':\n    case 'y':\n      return 'Y';\n    case 'month':\n    case 'months':\n    case 'M':\n      return 'M';\n    case 'day':\n    case 'days':\n    case 'date':\n    case 'dates':\n    case 'D':\n    case 'd':\n      return 'D';\n    case 'hour':\n    case 'hours':\n    case 'H':\n    case 'h':\n      return 'H';\n    case 'minute':\n    case 'minutes':\n    case 'm':\n      return 'm';\n    case 'second':\n    case 'seconds':\n    case 's':\n      return 's';\n    case 'millisecond':\n    case 'milliseconds':\n    case 'ms':\n    case 'S':\n      return 'S';\n  }\n  return unit;\n}\n\n/**\n * Validate 'date' object\n * @param {Date} date\n * @returns {Boolean}\n */\nfunction isValid (date) {\n  return Object.prototype.toString.call(date) == '[object Date]'\n    && !isNaN(date.getTime());\n}\n\n/**\n * Determine if 'time' is a Time instance\n * @param {Time} time\n * @returns {Boolean}\n */\nfunction isTime (time) {\n  return time != null && time._manipulate != null && time._date != null;\n}\n\n/**\n * Round 'value' towards 0\n * @param {Number} value\n * @returns {Number}\n */\nfunction round (value) {\n  if (value < 0) return Math.ceil(value);\n  return Math.floor(value);\n}\n\n/**\n * Pad 'value' with zeros up to desired 'length'\n * @param {String|Number} value\n * @param {Number} [length]\n * @returns {String}\n */\nfunction pad (value, length) {\n  value = String(value);\n  length = length || 2;\n\n  while (value.length < length) {\n    value = '0' + value;\n  }\n\n  return value;\n}\n\n/**\n * Convert 'minutes' to offset string\n * @param {Number} minutes\n * @returns {String}\n */\nfunction minutesToOffsetString (minutes) {\n  const t = String(Math.abs(minutes / 60)).split('.');\n  const H = pad(t[0]);\n  const m = t[1] ? (parseInt(t[1], 10) * 0.6) : 0;\n  const sign = minutes < 0 ? '-' : '+';\n\n  return `${sign}${H}:${pad(m)}`;\n}"],"names":["const","FLAGS","Y","M","D","H","m","s","S","FLAGS_START_OF","RE_PARSE","RE_TOKEN","RE_TOKEN_ESCAPE","RE_TOKEN_ESCAPED","dayStartsAt","nightStartsAt","isTime","init","options","create","timeString","Time","now","this","utc","constructor","_date","_locale","_offset","_offsetString","isValid","d","Date","offset","getTimezoneOffset","setUTCMinutes","getUTCMinutes","toISOString","replace","minutesToOffsetString","clientNow","length","match","year","parseInt","month","day","hour","minute","second","millisecond","UTC","toString","update","instance","normalizeUnit","unit","date","Object","prototype","call","isNaN","getTime","time","_manipulate","pad","value","String","minutes","t","Math","abs","split","add","subtract","diff","asFloat","NaN","t1","t2","_monthDiff","startOf","delta","ceil","floor","flags","clone","dim","setUTCMonth","setUTCDate","getUTCHours","getUTCDate","setUTCHours","setUTCSeconds","setUTCMilliseconds","endOf","undefined","_set","getUTCFullYear","getUTCMonth","getUTCDay","getUTCSeconds","getUTCMilliseconds","isSame","isBefore","valueOf","isAfter","timeLimited","locale","format","mask","daysFromNow","relativeDay","_getRelativeDay","escaped","idx","push","slice","_localeHasProperty","monthsShort","months","daysShort","days","daySlot","_getTimeOfDay","daySlots","method","localeProperty","subProperty","setUTCFullYear","adjust","wholeMonthDiff","anchor","anchor2","toJSON"],"mappings":"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"}