{"version":3,"file":"vendor.cron-parser.0adea9ccdaec252c.js","mappings":";;;;;;;;;;;;;;;;;;;;AAAa;;AAEb,YAAY,mBAAO,CAAC,KAAO;;AAE3B;AACA,iCAAiC,UAAU;AAC3C;;AAEA;AACA,iCAAiC,WAAW;AAC5C;;AAEA;AACA,iCAAiC,SAAS;AAC1C;;AAEA;AACA;AACA,iCAAiC,UAAU;AAC3C;AACA,mCAAmC,UAAU;AAC7C;AACA;;AAEA;AACA;AACA,iCAAiC,YAAY;AAC7C;AACA,mCAAmC,UAAU;AAC7C;AACA;;AAEA;AACA;AACA,iCAAiC,YAAY;AAC7C;AACA,mCAAmC,UAAU;AAC7C;AACA;;AAEA;AACA,kCAAkC,UAAU;AAC5C;;AAEA;AACA;AACA,aAAa,WAAW;AACxB;AACA;AACA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,UAAU;AACvB;AACA;AACA;AACA,oCAAoC,UAAU;AAC9C;AACA;;AAEA;AACA;AACA,kCAAkC,YAAY;AAC9C;AACA;AACA;AACA,oCAAoC,UAAU;AAC9C;AACA;;AAEA;AACA;AACA;AACA,aAAa,YAAY;AACzB;AACA;AACA,oCAAoC,UAAU;AAC9C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,gCAAgC,QAAQ;AACxC;;AAEA;AACA,gCAAgC,SAAS;AACzC;;AAEA;AACA,gCAAgC,YAAY;AAC5C;;AAEA;AACA,gCAAgC,cAAc;AAC9C;;AAEA;AACA,gCAAgC,SAAS;AACzC;;AAEA;AACA,gCAAgC,WAAW;AAC3C;;AAEA;AACA,gCAAgC,WAAW;AAC3C;;AAEA;AACA,gCAAgC,gBAAgB;AAChD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,kCAAkC,SAAS;AAC3C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,SAAS;AAC3C;AACA;;AAEA;AACA,mBAAmB;AACnB;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC3Pa;;AAEb,qBAAqB,mBAAO,CAAC,KAAc;;AAE3C;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY;AACZ;AACA;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA,qCAAqC,OAAO;AAC5C;AACA;AACA,8BAA8B;;AAE9B;AACA,+BAA+B;AAC/B;AACA,QAAQ,mDAAmD;AAC3D;AACA,QAAQ,OAAO;AACf;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB;AACA;AACA,EAAE,qCAAsB;AACxB;AACA;AACA;AACA;;AAEA;AACA,GAAG;AACH;;AAEA;;;;;;;;ACnHa;;AAEb,mBAAmB,mBAAO,CAAC,KAAmB;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qCAAqC,OAAO;AAC5C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB,qCAAqC;AACvD;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;ACzDa;;AAEb;AACA,eAAe,mBAAO,CAAC,IAAQ;;AAE/B,qBAAqB,mBAAO,CAAC,KAAmB;;AAEhD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA,IAAI,4BAA4B;AAChC,IAAI,4BAA4B;AAChC,IAAI,4BAA4B;AAChC,IAAI,+BAA+B;AACnC,IAAI,4BAA4B;AAChC,IAAI,8BAA8B;AAClC;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mCAAmC,EAAE;AACrC;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA,qCAAqC;AACrC,2CAA2C,OAAO;AAClD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,OAAO;;AAEf;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA,wCAAwC,OAAO;AAC/C;AACA;AACA,MAAM;AACN;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,yCAAyC,gBAAgB;AACzD;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA,iDAAiD,OAAO;AACxD,uCAAuC;AACvC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,OAAO;AACpB,cAAc;AACd;AACA;AACA;AACA,yCAAyC,OAAO;AAChD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,UAAU;AACvB,aAAa,QAAQ;AACrB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,+CAA+C;AAC/C,gEAAgE;AAChE;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA,KAAK;AACL;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,YAAY,OAAO;AACnB;AACA;AACA;;AAEA;AACA,+BAA+B,OAAO;AACtC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,IAAI;AACJ,+BAA+B,OAAO;AACtC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,YAAY;AACZ;AACA;AACA;AACA,sEAAsE,OAAO;AAC7E;AACA;AACA;;AAEA;AACA,qBAAqB;AACrB,MAAM;AACN;AACA,qBAAqB;AACrB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,mDAAmD,OAAO;AAC1D,yCAAyC;AACzC,2DAA2D;;AAE3D,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mDAAmD,OAAO;AAC1D;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,OAAO;AAC9C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iDAAiD,OAAO;AACxD,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;;AAEA;;;;;;;;ACz+Ba;;AAEb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,kBAAkB,gBAAgB;AAClC;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ,qCAAqC;AAC7C;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA","sources":["webpack://admin/./node_modules/cron-parser/lib/date.js","webpack://admin/./node_modules/cron-parser/lib/parser.js","webpack://admin/./node_modules/cron-parser/lib/field_stringify.js","webpack://admin/./node_modules/cron-parser/lib/expression.js","webpack://admin/./node_modules/cron-parser/lib/field_compactor.js"],"sourcesContent":["'use strict';\n\nvar luxon = require('luxon');\n\nCronDate.prototype.addYear = function() {\n  this._date = this._date.plus({ years: 1 });\n};\n\nCronDate.prototype.addMonth = function() {\n  this._date = this._date.plus({ months: 1 }).startOf('month');\n};\n\nCronDate.prototype.addDay = function() {\n  this._date = this._date.plus({ days: 1 }).startOf('day');\n};\n\nCronDate.prototype.addHour = function() {\n  var prev = this._date;\n  this._date = this._date.plus({ hours: 1 }).startOf('hour');\n  if (this._date <= prev) {\n    this._date = this._date.plus({ hours: 1 });\n  }\n};\n\nCronDate.prototype.addMinute = function() {\n  var prev = this._date;\n  this._date = this._date.plus({ minutes: 1 }).startOf('minute');\n  if (this._date < prev) {\n    this._date = this._date.plus({ hours: 1 });\n  }\n};\n\nCronDate.prototype.addSecond = function() {\n  var prev = this._date;\n  this._date = this._date.plus({ seconds: 1 }).startOf('second');\n  if (this._date < prev) {\n    this._date = this._date.plus({ hours: 1 });\n  }\n};\n\nCronDate.prototype.subtractYear = function() {\n  this._date = this._date.minus({ years: 1 });\n};\n\nCronDate.prototype.subtractMonth = function() {\n  this._date = this._date\n    .minus({ months: 1 })\n    .endOf('month')\n    .startOf('second');\n};\n\nCronDate.prototype.subtractDay = function() {\n  this._date = this._date\n    .minus({ days: 1 })\n    .endOf('day')\n    .startOf('second');\n};\n\nCronDate.prototype.subtractHour = function() {\n  var prev = this._date;\n  this._date = this._date\n    .minus({ hours: 1 })\n    .endOf('hour')\n    .startOf('second');\n  if (this._date >= prev) {\n    this._date = this._date.minus({ hours: 1 });\n  }\n};\n\nCronDate.prototype.subtractMinute = function() {\n  var prev = this._date;\n  this._date = this._date.minus({ minutes: 1 })\n    .endOf('minute')\n    .startOf('second');\n  if (this._date > prev) {\n    this._date = this._date.minus({ hours: 1 });\n  }\n};\n\nCronDate.prototype.subtractSecond = function() {\n  var prev = this._date;\n  this._date = this._date\n    .minus({ seconds: 1 })\n    .startOf('second');\n  if (this._date > prev) {\n    this._date = this._date.minus({ hours: 1 });\n  }\n};\n\nCronDate.prototype.getDate = function() {\n  return this._date.day;\n};\n\nCronDate.prototype.getFullYear = function() {\n  return this._date.year;\n};\n\nCronDate.prototype.getDay = function() {\n  var weekday = this._date.weekday;\n  return weekday == 7 ? 0 : weekday;\n};\n\nCronDate.prototype.getMonth = function() {\n  return this._date.month - 1;\n};\n\nCronDate.prototype.getHours = function() {\n  return this._date.hour;\n};\n\nCronDate.prototype.getMinutes = function() {\n  return this._date.minute;\n};\n\nCronDate.prototype.getSeconds = function() {\n  return this._date.second;\n};\n\nCronDate.prototype.getMilliseconds = function() {\n  return this._date.millisecond;\n};\n\nCronDate.prototype.getTime = function() {\n  return this._date.valueOf();\n};\n\nCronDate.prototype.getUTCDate = function() {\n  return this._getUTC().day;\n};\n\nCronDate.prototype.getUTCFullYear = function() {\n  return this._getUTC().year;\n};\n\nCronDate.prototype.getUTCDay = function() {\n  var weekday = this._getUTC().weekday;\n  return weekday == 7 ? 0 : weekday;\n};\n\nCronDate.prototype.getUTCMonth = function() {\n  return this._getUTC().month - 1;\n};\n\nCronDate.prototype.getUTCHours = function() {\n  return this._getUTC().hour;\n};\n\nCronDate.prototype.getUTCMinutes = function() {\n  return this._getUTC().minute;\n};\n\nCronDate.prototype.getUTCSeconds = function() {\n  return this._getUTC().second;\n};\n\nCronDate.prototype.toISOString = function() {\n  return this._date.toUTC().toISO();\n};\n\nCronDate.prototype.toJSON = function() {\n  return this._date.toJSON();\n};\n\nCronDate.prototype.setDate = function(d) {\n  this._date = this._date.set({ day: d });\n};\n\nCronDate.prototype.setFullYear = function(y) {\n  this._date = this._date.set({ year: y });\n};\n\nCronDate.prototype.setDay = function(d) {\n  this._date = this._date.set({ weekday: d });\n};\n\nCronDate.prototype.setMonth = function(m) {\n  this._date = this._date.set({ month: m + 1 });\n};\n\nCronDate.prototype.setHours = function(h) {\n  this._date = this._date.set({ hour: h });\n};\n\nCronDate.prototype.setMinutes = function(m) {\n  this._date = this._date.set({ minute: m });\n};\n\nCronDate.prototype.setSeconds = function(s) {\n  this._date = this._date.set({ second: s });\n};\n\nCronDate.prototype.setMilliseconds = function(s) {\n  this._date = this._date.set({ millisecond: s });\n};\n\nCronDate.prototype._getUTC = function() {\n  return this._date.toUTC();\n};\n\nCronDate.prototype.toString = function() {\n  return this.toDate().toString();\n};\n\nCronDate.prototype.toDate = function() {\n  return this._date.toJSDate();\n};\n\nCronDate.prototype.isLastDayOfMonth = function() {\n  //next day\n  var newDate = this._date.plus({ days: 1 }).startOf('day');\n  return this._date.month !== newDate.month;\n};\n\n/**\n * Returns true when the current weekday is the last occurrence of this weekday\n * for the present month.\n */\nCronDate.prototype.isLastWeekdayOfMonth = function() {\n  // Check this by adding 7 days to the current date and seeing if it's\n  // a different month\n  var newDate = this._date.plus({ days: 7 }).startOf('day');\n  return this._date.month !== newDate.month;\n};\n\nfunction CronDate (timestamp, tz) {\n  var dateOpts = { zone: tz };\n  if (!timestamp) {\n    this._date = luxon.DateTime.local();\n  } else if (timestamp instanceof CronDate) {\n    this._date = timestamp._date;\n  } else if (timestamp instanceof Date) {\n    this._date = luxon.DateTime.fromJSDate(timestamp, dateOpts);\n  } else if (typeof timestamp === 'number') {\n    this._date = luxon.DateTime.fromMillis(timestamp, dateOpts);\n  } else if (typeof timestamp === 'string') {\n    this._date = luxon.DateTime.fromISO(timestamp, dateOpts);\n    this._date.isValid || (this._date = luxon.DateTime.fromRFC2822(timestamp, dateOpts));\n    this._date.isValid || (this._date = luxon.DateTime.fromSQL(timestamp, dateOpts));\n    // RFC2822-like format without the required timezone offset (used in tests)\n    this._date.isValid || (this._date = luxon.DateTime.fromFormat(timestamp, 'EEE, d MMM yyyy HH:mm:ss', dateOpts));\n  }\n\n  if (!this._date || !this._date.isValid) {\n    throw new Error('CronDate: unhandled timestamp: ' + JSON.stringify(timestamp));\n  }\n  \n  if (tz && tz !== this._date.zoneName) {\n    this._date = this._date.setZone(tz);\n  }\n}\n\nmodule.exports = CronDate;\n","'use strict';\n\nvar CronExpression = require('./expression');\n\nfunction CronParser() {}\n\n/**\n * Parse crontab entry\n *\n * @private\n * @param {String} entry Crontab file entry/line\n */\nCronParser._parseEntry = function _parseEntry (entry) {\n  var atoms = entry.split(' ');\n\n  if (atoms.length === 6) {\n    return {\n      interval: CronExpression.parse(entry)\n    };\n  } else if (atoms.length > 6) {\n    return {\n      interval: CronExpression.parse(\n        atoms.slice(0, 6).join(' ')\n      ),\n      command: atoms.slice(6, atoms.length)\n    };\n  } else {\n    throw new Error('Invalid entry: ' + entry);\n  }\n};\n\n/**\n * Wrapper for CronExpression.parser method\n *\n * @public\n * @param {String} expression Input expression\n * @param {Object} [options] Parsing options\n * @return {Object}\n */\nCronParser.parseExpression = function parseExpression (expression, options) {\n  return CronExpression.parse(expression, options);\n};\n\n/**\n * Wrapper for CronExpression.fieldsToExpression method\n *\n * @public\n * @param {Object} fields Input fields\n * @param {Object} [options] Parsing options\n * @return {Object}\n */\nCronParser.fieldsToExpression = function fieldsToExpression (fields, options) {\n  return CronExpression.fieldsToExpression(fields, options);\n};\n\n/**\n * Parse content string\n *\n * @public\n * @param {String} data Crontab content\n * @return {Object}\n */\nCronParser.parseString = function parseString (data) {\n  var blocks = data.split('\\n');\n\n  var response = {\n    variables: {},\n    expressions: [],\n    errors: {}\n  };\n\n  for (var i = 0, c = blocks.length; i < c; i++) {\n    var block = blocks[i];\n    var matches = null;\n    var entry = block.trim(); // Remove surrounding spaces\n\n    if (entry.length > 0) {\n      if (entry.match(/^#/)) { // Comment\n        continue;\n      } else if ((matches = entry.match(/^(.*)=(.*)$/))) { // Variable\n        response.variables[matches[1]] = matches[2];\n      } else { // Expression?\n        var result = null;\n\n        try {\n          result = CronParser._parseEntry('0 ' + entry);\n          response.expressions.push(result.interval);\n        } catch (err) {\n          response.errors[entry] = err;\n        }\n      }\n    }\n  }\n\n  return response;\n};\n\n/**\n * Parse crontab file\n *\n * @public\n * @param {String} filePath Path to file\n * @param {Function} callback\n */\nCronParser.parseFile = function parseFile (filePath, callback) {\n  require('fs').readFile(filePath, function(err, data) {\n    if (err) {\n      callback(err);\n      return;\n    }\n\n    return callback(null, CronParser.parseString(data.toString()));\n  });\n};\n\nmodule.exports = CronParser;\n","'use strict';\n\nvar compactField = require('./field_compactor');\n\nfunction stringifyField(arr, min, max) {\n  var ranges = compactField(arr);\n  if (ranges.length === 1) {\n    var singleRange = ranges[0];\n    var step = singleRange.step;\n    if (step === 1 && singleRange.start === min && singleRange.end === max) {\n      return '*';\n    }\n    if (step !== 1 && singleRange.start === min && singleRange.end === max - step + 1) {\n      return '*/' + step;\n    }\n  }\n\n  var result = [];\n  for (var i = 0, l = ranges.length; i < l; ++i) {\n    var range = ranges[i];\n    if (range.count === 1) {\n      result.push(range.start);\n      continue;\n    }\n\n    var step = range.step;\n    if (range.step === 1) {\n      result.push(range.start + '-' + range.end);\n      continue;\n    }\n\n    var multiplier = range.start == 0 ? range.count - 1 : range.count;\n    if (range.step * multiplier > range.end) {\n      result = result.concat(\n         Array\n          .from({ length: range.end - range.start + 1 })\n          .map(function (_, index) {\n            var value = range.start + index;\n            if ((value - range.start) % range.step === 0) {\n              return value;\n            }\n            return null;\n          })\n          .filter(function (value) {\n            return value != null;\n          })\n      );\n    } else if (range.end === max - range.step + 1) {\n      result.push(range.start + '/' + range.step);\n    } else {\n      result.push(range.start + '-' + range.end + '/' + range.step);\n    }\n  }\n\n  return result.join(',');\n}\n\nmodule.exports = stringifyField;\n","'use strict';\n\n// Load Date class extensions\nvar CronDate = require('./date');\n\nvar stringifyField = require('./field_stringify');\n\n/**\n * Cron iteration loop safety limit\n */\nvar LOOP_LIMIT = 10000;\n\n/**\n * Construct a new expression parser\n *\n * Options:\n *   currentDate: iterator start date\n *   endDate: iterator end date\n *\n * @constructor\n * @private\n * @param {Object} fields  Expression fields parsed values\n * @param {Object} options Parser options\n */\nfunction CronExpression (fields, options) {\n  this._options = options;\n  this._utc = options.utc || false;\n  this._tz = this._utc ? 'UTC' : options.tz;\n  this._currentDate = new CronDate(options.currentDate, this._tz);\n  this._startDate = options.startDate ? new CronDate(options.startDate, this._tz) : null;\n  this._endDate = options.endDate ? new CronDate(options.endDate, this._tz) : null;\n  this._isIterator = options.iterator || false;\n  this._hasIterated = false;\n  this._nthDayOfWeek = options.nthDayOfWeek || 0;\n  this.fields = CronExpression._freezeFields(fields);\n}\n\n/**\n * Field mappings\n * @type {Array}\n */\nCronExpression.map = [ 'second', 'minute', 'hour', 'dayOfMonth', 'month', 'dayOfWeek' ];\n\n/**\n * Prefined intervals\n * @type {Object}\n */\nCronExpression.predefined = {\n  '@yearly': '0 0 1 1 *',\n  '@monthly': '0 0 1 * *',\n  '@weekly': '0 0 * * 0',\n  '@daily': '0 0 * * *',\n  '@hourly': '0 * * * *'\n};\n\n/**\n * Fields constraints\n * @type {Array}\n */\nCronExpression.constraints = [\n  { min: 0, max: 59, chars: [] }, // Second\n  { min: 0, max: 59, chars: [] }, // Minute\n  { min: 0, max: 23, chars: [] }, // Hour\n  { min: 1, max: 31, chars: ['L'] }, // Day of month\n  { min: 1, max: 12, chars: [] }, // Month\n  { min: 0, max: 7, chars: ['L'] }, // Day of week\n];\n\n/**\n * Days in month\n * @type {number[]}\n */\nCronExpression.daysInMonth = [\n  31,\n  29,\n  31,\n  30,\n  31,\n  30,\n  31,\n  31,\n  30,\n  31,\n  30,\n  31\n];\n\n/**\n * Field aliases\n * @type {Object}\n */\nCronExpression.aliases = {\n  month: {\n    jan: 1,\n    feb: 2,\n    mar: 3,\n    apr: 4,\n    may: 5,\n    jun: 6,\n    jul: 7,\n    aug: 8,\n    sep: 9,\n    oct: 10,\n    nov: 11,\n    dec: 12\n  },\n\n  dayOfWeek: {\n    sun: 0,\n    mon: 1,\n    tue: 2,\n    wed: 3,\n    thu: 4,\n    fri: 5,\n    sat: 6\n  }\n};\n\n/**\n * Field defaults\n * @type {Array}\n */\nCronExpression.parseDefaults = [ '0', '*', '*', '*', '*', '*' ];\n\nCronExpression.standardValidCharacters = /^[,*\\d/-]+$/;\nCronExpression.dayOfWeekValidCharacters = /^[?,*\\dL#/-]+$/;\nCronExpression.dayOfMonthValidCharacters = /^[?,*\\dL/-]+$/;\nCronExpression.validCharacters = {\n  second: CronExpression.standardValidCharacters,\n  minute: CronExpression.standardValidCharacters,\n  hour: CronExpression.standardValidCharacters,\n  dayOfMonth: CronExpression.dayOfMonthValidCharacters,\n  month: CronExpression.standardValidCharacters,\n  dayOfWeek: CronExpression.dayOfWeekValidCharacters,\n};\n\nCronExpression._isValidConstraintChar = function _isValidConstraintChar(constraints, value) {\n  if (typeof value !== 'string') {\n    return false;\n  }\n\n  return constraints.chars.some(function(char) {\n    return value.indexOf(char) > -1;\n  });\n};\n\n/**\n * Parse input interval\n *\n * @param {String} field Field symbolic name\n * @param {String} value Field value\n * @param {Array} constraints Range upper and lower constraints\n * @return {Array} Sequence of sorted values\n * @private\n */\nCronExpression._parseField = function _parseField (field, value, constraints) {\n  // Replace aliases\n  switch (field) {\n    case 'month':\n    case 'dayOfWeek':\n      var aliases = CronExpression.aliases[field];\n\n      value = value.replace(/[a-z]{3}/gi, function(match) {\n        match = match.toLowerCase();\n\n        if (typeof aliases[match] !== 'undefined') {\n          return aliases[match];\n        } else {\n          throw new Error('Validation error, cannot resolve alias \"' + match + '\"');\n        }\n      });\n      break;\n  }\n\n  // Check for valid characters.\n  if (!(CronExpression.validCharacters[field].test(value))) {\n    throw new Error('Invalid characters, got value: ' + value);\n  }\n\n  // Replace '*' and '?'\n  if (value.indexOf('*') !== -1) {\n    value = value.replace(/\\*/g, constraints.min + '-' + constraints.max);\n  } else if (value.indexOf('?') !== -1) {\n    value = value.replace(/\\?/g, constraints.min + '-' + constraints.max);\n  }\n\n  //\n  // Inline parsing functions\n  //\n  // Parser path:\n  //  - parseSequence\n  //    - parseRepeat\n  //      - parseRange\n\n  /**\n   * Parse sequence\n   *\n   * @param {String} val\n   * @return {Array}\n   * @private\n   */\n  function parseSequence (val) {\n    var stack = [];\n\n    function handleResult (result) {\n      if (result instanceof Array) { // Make sequence linear\n        for (var i = 0, c = result.length; i < c; i++) {\n          var value = result[i];\n\n          if (CronExpression._isValidConstraintChar(constraints, value)) {\n            stack.push(value);\n            continue;\n          }\n          // Check constraints\n          if (typeof value !== 'number' || Number.isNaN(value) || value < constraints.min || value > constraints.max) {\n            throw new Error(\n                'Constraint error, got value ' + value + ' expected range ' +\n                constraints.min + '-' + constraints.max\n            );\n          }\n\n          stack.push(value);\n        }\n      } else { // Scalar value\n\n        if (CronExpression._isValidConstraintChar(constraints, result)) {\n          stack.push(result);\n          return;\n        }\n\n        var numResult = +result;\n\n        // Check constraints\n        if (Number.isNaN(numResult) || numResult < constraints.min || numResult > constraints.max) {\n          throw new Error(\n            'Constraint error, got value ' + result + ' expected range ' +\n            constraints.min + '-' + constraints.max\n          );\n        }\n\n        if (field === 'dayOfWeek') {\n          numResult = numResult % 7;\n        }\n\n        stack.push(numResult);\n      }\n    }\n\n    var atoms = val.split(',');\n    if (!atoms.every(function (atom) {\n      return atom.length > 0;\n    })) {\n      throw new Error('Invalid list value format');\n    }\n\n    if (atoms.length > 1) {\n      for (var i = 0, c = atoms.length; i < c; i++) {\n        handleResult(parseRepeat(atoms[i]));\n      }\n    } else {\n      handleResult(parseRepeat(val));\n    }\n\n    stack.sort(CronExpression._sortCompareFn);\n\n    return stack;\n  }\n\n  /**\n   * Parse repetition interval\n   *\n   * @param {String} val\n   * @return {Array}\n   */\n  function parseRepeat (val) {\n    var repeatInterval = 1;\n    var atoms = val.split('/');\n\n    if (atoms.length > 2) {\n      throw new Error('Invalid repeat: ' + val);\n    }\n\n    if (atoms.length > 1) {\n      if (atoms[0] == +atoms[0]) {\n        atoms = [atoms[0] + '-' + constraints.max, atoms[1]];\n      }\n      return parseRange(atoms[0], atoms[atoms.length - 1]);\n    }\n\n    return parseRange(val, repeatInterval);\n  }\n\n  /**\n   * Parse range\n   *\n   * @param {String} val\n   * @param {Number} repeatInterval Repetition interval\n   * @return {Array}\n   * @private\n   */\n  function parseRange (val, repeatInterval) {\n    var stack = [];\n    var atoms = val.split('-');\n\n    if (atoms.length > 1 ) {\n      // Invalid range, return value\n      if (atoms.length < 2) {\n        return +val;\n      }\n\n      if (!atoms[0].length) {\n        if (!atoms[1].length) {\n          throw new Error('Invalid range: ' + val);\n        }\n\n        return +val;\n      }\n\n      // Validate range\n      var min = +atoms[0];\n      var max = +atoms[1];\n\n      if (Number.isNaN(min) || Number.isNaN(max) ||\n          min < constraints.min || max > constraints.max) {\n        throw new Error(\n          'Constraint error, got range ' +\n          min + '-' + max +\n          ' expected range ' +\n          constraints.min + '-' + constraints.max\n        );\n      } else if (min > max) {\n        throw new Error('Invalid range: ' + val);\n      }\n\n      // Create range\n      var repeatIndex = +repeatInterval;\n\n      if (Number.isNaN(repeatIndex) || repeatIndex <= 0) {\n        throw new Error('Constraint error, cannot repeat at every ' + repeatIndex + ' time.');\n      }\n\n      // JS DOW is in range of 0-6 (SUN-SAT) but we also support 7 in the expression\n      // Handle case when range contains 7 instead of 0 and translate this value to 0\n      if (field === 'dayOfWeek' && max % 7 === 0) {\n        stack.push(0);\n      }\n\n      for (var index = min, count = max; index <= count; index++) {\n        var exists = stack.indexOf(index) !== -1;\n        if (!exists && repeatIndex > 0 && (repeatIndex % repeatInterval) === 0) {\n          repeatIndex = 1;\n          stack.push(index);\n        } else {\n          repeatIndex++;\n        }\n      }\n      return stack;\n    }\n\n    return Number.isNaN(+val) ? val : +val;\n  }\n\n  return parseSequence(value);\n};\n\nCronExpression._sortCompareFn = function(a, b) {\n  var aIsNumber = typeof a === 'number';\n  var bIsNumber = typeof b === 'number';\n\n  if (aIsNumber && bIsNumber) {\n    return a - b;\n  }\n\n  if (!aIsNumber && bIsNumber) {\n    return 1;\n  }\n\n  if (aIsNumber && !bIsNumber) {\n    return -1;\n  }\n\n  return a.localeCompare(b);\n};\n\nCronExpression._handleMaxDaysInMonth = function(mappedFields) {\n  // Filter out any day of month value that is larger than given month expects\n  if (mappedFields.month.length === 1) {\n    var daysInMonth = CronExpression.daysInMonth[mappedFields.month[0] - 1];\n\n    if (mappedFields.dayOfMonth[0] > daysInMonth) {\n      throw new Error('Invalid explicit day of month definition');\n    }\n\n    return mappedFields.dayOfMonth\n      .filter(function(dayOfMonth) {\n        return dayOfMonth === 'L' ? true : dayOfMonth <= daysInMonth;\n      })\n      .sort(CronExpression._sortCompareFn);\n  }\n};\n\nCronExpression._freezeFields = function(fields) {\n  for (var i = 0, c = CronExpression.map.length; i < c; ++i) {\n    var field = CronExpression.map[i]; // Field name\n    var value = fields[field];\n    fields[field] = Object.freeze(value);\n  }\n  return Object.freeze(fields);\n};\n\nCronExpression.prototype._applyTimezoneShift = function(currentDate, dateMathVerb, method) {\n  if ((method === 'Month') || (method === 'Day')) {\n    var prevTime = currentDate.getTime();\n    currentDate[dateMathVerb + method]();\n    var currTime = currentDate.getTime();\n    if (prevTime === currTime) {\n      // Jumped into a not existent date due to a DST transition\n      if ((currentDate.getMinutes() === 0) &&\n          (currentDate.getSeconds() === 0)) {\n        currentDate.addHour();\n      } else if ((currentDate.getMinutes() === 59) &&\n                 (currentDate.getSeconds() === 59)) {\n        currentDate.subtractHour();\n      }\n    }\n  } else {\n    var previousHour = currentDate.getHours();\n    currentDate[dateMathVerb + method]();\n    var currentHour = currentDate.getHours();\n    var diff = currentHour - previousHour;\n    if (diff === 2) {\n        // Starting DST\n        if (this.fields.hour.length !== 24) {\n          // Hour is specified\n          this._dstStart = currentHour;\n        }\n      } else if ((diff === 0) &&\n                 (currentDate.getMinutes() === 0) &&\n                 (currentDate.getSeconds() === 0)) {\n        // Ending DST\n        if (this.fields.hour.length !== 24) {\n          // Hour is specified\n          this._dstEnd = currentHour;\n        }\n      }\n  }\n};\n\n\n/**\n * Find next or previous matching schedule date\n *\n * @return {CronDate}\n * @private\n */\nCronExpression.prototype._findSchedule = function _findSchedule (reverse) {\n\n  /**\n   * Match field value\n   *\n   * @param {String} value\n   * @param {Array} sequence\n   * @return {Boolean}\n   * @private\n   */\n  function matchSchedule (value, sequence) {\n    for (var i = 0, c = sequence.length; i < c; i++) {\n      if (sequence[i] >= value) {\n        return sequence[i] === value;\n      }\n    }\n\n    return sequence[0] === value;\n  }\n\n  /**\n   * Helps determine if the provided date is the correct nth occurence of the\n   * desired day of week.\n   *\n   * @param {CronDate} date\n   * @param {Number} nthDayOfWeek\n   * @return {Boolean}\n   * @private\n   */\n  function isNthDayMatch(date, nthDayOfWeek) {\n    if (nthDayOfWeek < 6) {\n      if (\n        date.getDate() < 8 &&\n        nthDayOfWeek === 1 // First occurence has to happen in first 7 days of the month\n      ) {\n        return true;\n      }\n\n      var offset = date.getDate() % 7 ? 1 : 0; // Math is off by 1 when dayOfWeek isn't divisible by 7\n      var adjustedDate = date.getDate() - (date.getDate() % 7); // find the first occurance\n      var occurrence = Math.floor(adjustedDate / 7) + offset;\n\n      return occurrence === nthDayOfWeek;\n    }\n\n    return false;\n  }\n\n  /**\n   * Helper function that checks if 'L' is in the array\n   *\n   * @param {Array} expressions\n   */\n  function isLInExpressions(expressions) {\n    return expressions.length > 0 && expressions.some(function(expression) {\n      return typeof expression === 'string' && expression.indexOf('L') >= 0;\n    });\n  }\n\n\n  // Whether to use backwards directionality when searching\n  reverse = reverse || false;\n  var dateMathVerb = reverse ? 'subtract' : 'add';\n\n  var currentDate = new CronDate(this._currentDate, this._tz);\n  var startDate = this._startDate;\n  var endDate = this._endDate;\n\n  // Find matching schedule\n  var startTimestamp = currentDate.getTime();\n  var stepCount = 0;\n\n  function isLastWeekdayOfMonthMatch(expressions) {\n    return expressions.some(function(expression) {\n      // There might be multiple expressions and not all of them will contain\n      // the \"L\".\n      if (!isLInExpressions([expression])) {\n        return false;\n      }\n\n      // The first character represents the weekday\n      var weekday = Number.parseInt(expression[0]) % 7;\n\n      if (Number.isNaN(weekday)) {\n        throw new Error('Invalid last weekday of the month expression: ' + expression);\n      }\n\n      return currentDate.getDay() === weekday && currentDate.isLastWeekdayOfMonth();\n    });\n  }\n\n  while (stepCount < LOOP_LIMIT) {\n    stepCount++;\n\n    // Validate timespan\n    if (reverse) {\n      if (startDate && (currentDate.getTime() - startDate.getTime() < 0)) {\n        throw new Error('Out of the timespan range');\n      }\n    } else {\n      if (endDate && (endDate.getTime() - currentDate.getTime()) < 0) {\n        throw new Error('Out of the timespan range');\n      }\n    }\n\n    // Day of month and week matching:\n    //\n    // \"The day of a command's execution can be specified by two fields --\n    // day of month, and day of week.  If  both\t fields\t are  restricted  (ie,\n    // aren't  *),  the command will be run when either field matches the cur-\n    // rent time.  For example, \"30 4 1,15 * 5\" would cause a command to be\n    // run at 4:30 am on the  1st and 15th of each month, plus every Friday.\"\n    //\n    // http://unixhelp.ed.ac.uk/CGI/man-cgi?crontab+5\n    //\n\n    var dayOfMonthMatch = matchSchedule(currentDate.getDate(), this.fields.dayOfMonth);\n    if (isLInExpressions(this.fields.dayOfMonth)) {\n      dayOfMonthMatch = dayOfMonthMatch || currentDate.isLastDayOfMonth();\n    }\n    var dayOfWeekMatch = matchSchedule(currentDate.getDay(), this.fields.dayOfWeek);\n    if (isLInExpressions(this.fields.dayOfWeek)) {\n      dayOfWeekMatch = dayOfWeekMatch || isLastWeekdayOfMonthMatch(this.fields.dayOfWeek);\n    }\n    var isDayOfMonthWildcardMatch = this.fields.dayOfMonth.length >= CronExpression.daysInMonth[currentDate.getMonth()];\n    var isDayOfWeekWildcardMatch = this.fields.dayOfWeek.length === CronExpression.constraints[5].max - CronExpression.constraints[5].min + 1;\n    var currentHour = currentDate.getHours();\n\n    // Add or subtract day if select day not match with month (according to calendar)\n    if (!dayOfMonthMatch && (!dayOfWeekMatch || isDayOfWeekWildcardMatch)) {\n      this._applyTimezoneShift(currentDate, dateMathVerb, 'Day');\n      continue;\n    }\n\n    // Add or subtract day if not day of month is set (and no match) and day of week is wildcard\n    if (!isDayOfMonthWildcardMatch && isDayOfWeekWildcardMatch && !dayOfMonthMatch) {\n      this._applyTimezoneShift(currentDate, dateMathVerb, 'Day');\n      continue;\n    }\n\n    // Add or subtract day if not day of week is set (and no match) and day of month is wildcard\n    if (isDayOfMonthWildcardMatch && !isDayOfWeekWildcardMatch && !dayOfWeekMatch) {\n      this._applyTimezoneShift(currentDate, dateMathVerb, 'Day');\n      continue;\n    }\n\n    // Add or subtract day if day of week & nthDayOfWeek are set (and no match)\n    if (\n      this._nthDayOfWeek > 0 &&\n      !isNthDayMatch(currentDate, this._nthDayOfWeek)\n    ) {\n      this._applyTimezoneShift(currentDate, dateMathVerb, 'Day');\n      continue;\n    }\n\n    // Match month\n    if (!matchSchedule(currentDate.getMonth() + 1, this.fields.month)) {\n      this._applyTimezoneShift(currentDate, dateMathVerb, 'Month');\n      continue;\n    }\n\n    // Match hour\n    if (!matchSchedule(currentHour, this.fields.hour)) {\n      if (this._dstStart !== currentHour) {\n        this._dstStart = null;\n        this._applyTimezoneShift(currentDate, dateMathVerb, 'Hour');\n        continue;\n      } else if (!matchSchedule(currentHour - 1, this.fields.hour)) {\n        currentDate[dateMathVerb + 'Hour']();\n        continue;\n      }\n    } else if (this._dstEnd === currentHour) {\n      if (!reverse) {\n        this._dstEnd = null;\n        this._applyTimezoneShift(currentDate, 'add', 'Hour');\n        continue;\n      }\n    }\n\n    // Match minute\n    if (!matchSchedule(currentDate.getMinutes(), this.fields.minute)) {\n      this._applyTimezoneShift(currentDate, dateMathVerb, 'Minute');\n      continue;\n    }\n\n    // Match second\n    if (!matchSchedule(currentDate.getSeconds(), this.fields.second)) {\n      this._applyTimezoneShift(currentDate, dateMathVerb, 'Second');\n      continue;\n    }\n\n    // Increase a second in case in the first iteration the currentDate was not\n    // modified\n    if (startTimestamp === currentDate.getTime()) {\n      if ((dateMathVerb === 'add') || (currentDate.getMilliseconds() === 0)) {\n        this._applyTimezoneShift(currentDate, dateMathVerb, 'Second');\n      } else {\n        currentDate.setMilliseconds(0);\n      }\n\n      continue;\n    }\n\n    break;\n  }\n\n  if (stepCount >= LOOP_LIMIT) {\n    throw new Error('Invalid expression, loop limit exceeded');\n  }\n\n  this._currentDate = new CronDate(currentDate, this._tz);\n  this._hasIterated = true;\n\n  return currentDate;\n};\n\n/**\n * Find next suitable date\n *\n * @public\n * @return {CronDate|Object}\n */\nCronExpression.prototype.next = function next () {\n  var schedule = this._findSchedule();\n\n  // Try to return ES6 compatible iterator\n  if (this._isIterator) {\n    return {\n      value: schedule,\n      done: !this.hasNext()\n    };\n  }\n\n  return schedule;\n};\n\n/**\n * Find previous suitable date\n *\n * @public\n * @return {CronDate|Object}\n */\nCronExpression.prototype.prev = function prev () {\n  var schedule = this._findSchedule(true);\n\n  // Try to return ES6 compatible iterator\n  if (this._isIterator) {\n    return {\n      value: schedule,\n      done: !this.hasPrev()\n    };\n  }\n\n  return schedule;\n};\n\n/**\n * Check if next suitable date exists\n *\n * @public\n * @return {Boolean}\n */\nCronExpression.prototype.hasNext = function() {\n  var current = this._currentDate;\n  var hasIterated = this._hasIterated;\n\n  try {\n    this._findSchedule();\n    return true;\n  } catch (err) {\n    return false;\n  } finally {\n    this._currentDate = current;\n    this._hasIterated = hasIterated;\n  }\n};\n\n/**\n * Check if previous suitable date exists\n *\n * @public\n * @return {Boolean}\n */\nCronExpression.prototype.hasPrev = function() {\n  var current = this._currentDate;\n  var hasIterated = this._hasIterated;\n\n  try {\n    this._findSchedule(true);\n    return true;\n  } catch (err) {\n    return false;\n  } finally {\n    this._currentDate = current;\n    this._hasIterated = hasIterated;\n  }\n};\n\n/**\n * Iterate over expression iterator\n *\n * @public\n * @param {Number} steps Numbers of steps to iterate\n * @param {Function} callback Optional callback\n * @return {Array} Array of the iterated results\n */\nCronExpression.prototype.iterate = function iterate (steps, callback) {\n  var dates = [];\n\n  if (steps >= 0) {\n    for (var i = 0, c = steps; i < c; i++) {\n      try {\n        var item = this.next();\n        dates.push(item);\n\n        // Fire the callback\n        if (callback) {\n          callback(item, i);\n        }\n      } catch (err) {\n        break;\n      }\n    }\n  } else {\n    for (var i = 0, c = steps; i > c; i--) {\n      try {\n        var item = this.prev();\n        dates.push(item);\n\n        // Fire the callback\n        if (callback) {\n          callback(item, i);\n        }\n      } catch (err) {\n        break;\n      }\n    }\n  }\n\n  return dates;\n};\n\n/**\n * Reset expression iterator state\n *\n * @public\n */\nCronExpression.prototype.reset = function reset (newDate) {\n  this._currentDate = new CronDate(newDate || this._options.currentDate);\n};\n\n/**\n * Stringify the expression\n *\n * @public\n * @param {Boolean} [includeSeconds] Should stringify seconds\n * @return {String}\n */\nCronExpression.prototype.stringify = function stringify(includeSeconds) {\n  var resultArr = [];\n  for (var i = includeSeconds ? 0 : 1, c = CronExpression.map.length; i < c; ++i) {\n    var field = CronExpression.map[i];\n    var value = this.fields[field];\n    var constraint = CronExpression.constraints[i];\n\n    if (field === 'dayOfMonth' && this.fields.month.length === 1) {\n      constraint = { min: 1, max: CronExpression.daysInMonth[this.fields.month[0] - 1] };\n    } else if (field === 'dayOfWeek') {\n      // Prefer 0-6 range when serializing day of week field\n      constraint = { min: 0, max: 6 };\n      value = value[value.length - 1] === 7 ? value.slice(0, -1) : value;\n    }\n\n    resultArr.push(stringifyField(value, constraint.min, constraint.max));\n  }\n  return resultArr.join(' ');\n};\n\n/**\n * Parse input expression (async)\n *\n * @public\n * @param {String} expression Input expression\n * @param {Object} [options] Parsing options\n */\nCronExpression.parse = function parse(expression, options) {\n  var self = this;\n  if (typeof options === 'function') {\n    options = {};\n  }\n\n  function parse (expression, options) {\n    if (!options) {\n      options = {};\n    }\n\n    if (typeof options.currentDate === 'undefined') {\n      options.currentDate = new CronDate(undefined, self._tz);\n    }\n\n    // Is input expression predefined?\n    if (CronExpression.predefined[expression]) {\n      expression = CronExpression.predefined[expression];\n    }\n\n    // Split fields\n    var fields = [];\n    var atoms = (expression + '').trim().split(/\\s+/);\n\n    if (atoms.length > 6) {\n      throw new Error('Invalid cron expression');\n    }\n\n    // Resolve fields\n    var start = (CronExpression.map.length - atoms.length);\n    for (var i = 0, c = CronExpression.map.length; i < c; ++i) {\n      var field = CronExpression.map[i]; // Field name\n      var value = atoms[atoms.length > c ? i : i - start]; // Field value\n\n      if (i < start || !value) { // Use default value\n        fields.push(CronExpression._parseField(\n          field,\n          CronExpression.parseDefaults[i],\n          CronExpression.constraints[i]\n          )\n        );\n      } else {\n        var val = field === 'dayOfWeek' ? parseNthDay(value) : value;\n\n        fields.push(CronExpression._parseField(\n          field,\n          val,\n          CronExpression.constraints[i]\n          )\n        );\n      }\n    }\n\n    var mappedFields = {};\n    for (var i = 0, c = CronExpression.map.length; i < c; i++) {\n      var key = CronExpression.map[i];\n      mappedFields[key] = fields[i];\n    }\n\n    var dayOfMonth = CronExpression._handleMaxDaysInMonth(mappedFields);\n    mappedFields.dayOfMonth = dayOfMonth || mappedFields.dayOfMonth;\n    return new CronExpression(mappedFields, options);\n\n    /**\n     * Parses out the # special character for the dayOfWeek field & adds it to options.\n     *\n     * @param {String} val\n     * @return {String}\n     * @private\n     */\n    function parseNthDay(val) {\n      var atoms = val.split('#');\n      if (atoms.length > 1) {\n        var nthValue = +atoms[atoms.length - 1];\n        if(/,/.test(val)) {\n          throw new Error('Constraint error, invalid dayOfWeek `#` and `,` '\n            + 'special characters are incompatible');\n        }\n        if(/\\//.test(val)) {\n          throw new Error('Constraint error, invalid dayOfWeek `#` and `/` '\n            + 'special characters are incompatible');\n        }\n        if(/-/.test(val)) {\n          throw new Error('Constraint error, invalid dayOfWeek `#` and `-` '\n            + 'special characters are incompatible');\n        }\n        if (atoms.length > 2 || Number.isNaN(nthValue) || (nthValue < 1 || nthValue > 5)) {\n          throw new Error('Constraint error, invalid dayOfWeek occurrence number (#)');\n        }\n\n        options.nthDayOfWeek = nthValue;\n        return atoms[0];\n      }\n      return val;\n    }\n  }\n\n  return parse(expression, options);\n};\n\n/**\n * Convert cron fields back to Cron Expression\n *\n * @public\n * @param {Object} fields Input fields\n * @param {Object} [options] Parsing options\n * @return {Object}\n */\nCronExpression.fieldsToExpression = function fieldsToExpression(fields, options) {\n  function validateConstraints (field, values, constraints) {\n    if (!values) {\n      throw new Error('Validation error, Field ' + field + ' is missing');\n    }\n    if (values.length === 0) {\n      throw new Error('Validation error, Field ' + field + ' contains no values');\n    }\n    for (var i = 0, c = values.length; i < c; i++) {\n      var value = values[i];\n\n      if (CronExpression._isValidConstraintChar(constraints, value)) {\n        continue;\n      }\n\n      // Check constraints\n      if (typeof value !== 'number' || Number.isNaN(value) || value < constraints.min || value > constraints.max) {\n        throw new Error(\n          'Constraint error, got value ' + value + ' expected range ' +\n          constraints.min + '-' + constraints.max\n        );\n      }\n    }\n  }\n\n  var mappedFields = {};\n  for (var i = 0, c = CronExpression.map.length; i < c; ++i) {\n    var field = CronExpression.map[i]; // Field name\n    var values = fields[field];\n    validateConstraints(\n      field,\n      values,\n      CronExpression.constraints[i]\n    );\n    var copy = [];\n    var j = -1;\n    while (++j < values.length) {\n      copy[j] = values[j];\n    }\n    values = copy.sort(CronExpression._sortCompareFn)\n      .filter(function(item, pos, ary) {\n        return !pos || item !== ary[pos - 1];\n      });\n    if (values.length !== copy.length) {\n      throw new Error('Validation error, Field ' + field + ' contains duplicate values');\n    }\n    mappedFields[field] = values;\n  }\n  var dayOfMonth = CronExpression._handleMaxDaysInMonth(mappedFields);\n  mappedFields.dayOfMonth = dayOfMonth || mappedFields.dayOfMonth;\n  return new CronExpression(mappedFields, options || {});\n};\n\nmodule.exports = CronExpression;\n","'use strict';\n\nfunction buildRange(item) {\n  return {\n    start: item,\n    count: 1\n  };\n}\n\nfunction completeRangeWithItem(range, item) {\n  range.end = item;\n  range.step = item - range.start;\n  range.count = 2;\n}\n\nfunction finalizeCurrentRange(results, currentRange, currentItemRange) {\n  if (currentRange) {\n    // Two elements do not form a range so split them into 2 single elements\n    if (currentRange.count === 2) {\n      results.push(buildRange(currentRange.start));\n      results.push(buildRange(currentRange.end));\n    } else {\n      results.push(currentRange);\n    }\n  }\n  if (currentItemRange) {\n    results.push(currentItemRange);\n  }\n}\n\nfunction compactField(arr) {\n  var results = [];\n  var currentRange = undefined;\n\n  for (var i = 0; i < arr.length; i++) {\n    var currentItem = arr[i];\n    if (typeof currentItem !== 'number') {\n      // String elements can't form a range\n      finalizeCurrentRange(results, currentRange, buildRange(currentItem));\n      currentRange = undefined;\n    } else if (!currentRange) {\n      // Start a new range\n      currentRange = buildRange(currentItem);\n    } else if (currentRange.count === 1) {\n      // Guess that the current item starts a range\n      completeRangeWithItem(currentRange, currentItem);\n    } else {\n      if (currentRange.step === currentItem - currentRange.end) {\n        // We found another item that matches the current range\n        currentRange.count++;\n        currentRange.end = currentItem;\n      } else if (currentRange.count === 2) { // The current range can't be continued\n        // Break the first item of the current range into a single element, and try to start a new range with the second item\n        results.push(buildRange(currentRange.start));\n        currentRange = buildRange(currentRange.end);\n        completeRangeWithItem(currentRange, currentItem);\n      } else {\n        // Persist the current range and start a new one with current item\n        finalizeCurrentRange(results, currentRange);\n        currentRange = buildRange(currentItem);\n      }\n    }\n  }\n\n  finalizeCurrentRange(results, currentRange);\n\n  return results;\n}\n\nmodule.exports = compactField;\n"],"names":[],"sourceRoot":""}